向量的 MPI send/recv
MPI send/recv of a vector
大家好,我正在为一个涉及使用 MPI 库的大学项目工作,不幸的是我无法共享整个代码,但我希望无论如何有人能够给我一些指示。
我需要将一个数组从 proc X 发送到 proc 0,但是正如我在 google 上读到的那样,发送 dinamycally 创建的数组的唯一方法是找出大小,将大小发送到 Proc 0,然后才发送发送数组(我无法预先确定它的大小),所以这就是我在 Proc X 上所做的:
vector<int> tosend = aglib.ExtractEvaluationFunctions();
int tosend_size = tosend.size();
MPI_Send(&tosend_size, 1, MPI_INT, 0, 666, MPI_COMM_WORLD);
MPI_Send(&tosend, tosend_size, MPI_INT, 0, 777, MPI_COMM_WORLD);
这是在 Proc 0 上发生的事情(我不能共享同一个缓冲区,因为要发送的向量每次都是在 Proc1 中本地创建的):
vector<int> results_and_rank;
int results_rank_size;
MPI_Recv(&results_rank_size, 1, MPI_INT, MPI_ANY_SOURCE, 666, MPI_COMM_WORLD, &status);
MPI_Recv(&results_and_rank, results_rank_size, MPI_INT, MPI_ANY_SOURCE, 777, MPI_COMM_WORLD, &status);
cout << "size of results_and_rank is :"<< results_and_rank.size()endl;
cout<< "last element of array is :"<< results_and_rank.back()<<endl;
我认为通信工作正常,因为我能够读取接收到的向量的大小,它与我发送的向量相同,但是每当我尝试访问数组的元素时我的代码就会崩溃 results_and_rank 因此在最后一次打印时崩溃。
顺便说一句,为了我的项目,我需要使用阻塞通信。
我错过了什么吗?感谢您的宝贵时间和帮助。
您想将 数据 send/receive 到矢量,因此您需要矢量内部的数据,而不是矢量本身。
此处将 std::vector
本身的地址传递给 MPI_Recv()
,这将破坏 std::vector
。
MPI_Recv(&results_and_rank, results_rank_size, MPI_INT, MPI_ANY_SOURCE, 777, MPI_COMM_WORLD, &status);
正确方法:
发件人:
MPI_Send(&tosend[0], tosend_size, MPI_INT, 0, 777, MPI_COMM_WORLD);
接收者:
results_and_rank.resize(results_rank_size);
MPI_Recv(&results_and_rank[0], results_rank_size, MPI_INT, MPI_ANY_SOURCE, 777, MPI_COMM_WORLD, &status);
大家好,我正在为一个涉及使用 MPI 库的大学项目工作,不幸的是我无法共享整个代码,但我希望无论如何有人能够给我一些指示。 我需要将一个数组从 proc X 发送到 proc 0,但是正如我在 google 上读到的那样,发送 dinamycally 创建的数组的唯一方法是找出大小,将大小发送到 Proc 0,然后才发送发送数组(我无法预先确定它的大小),所以这就是我在 Proc X 上所做的:
vector<int> tosend = aglib.ExtractEvaluationFunctions();
int tosend_size = tosend.size();
MPI_Send(&tosend_size, 1, MPI_INT, 0, 666, MPI_COMM_WORLD);
MPI_Send(&tosend, tosend_size, MPI_INT, 0, 777, MPI_COMM_WORLD);
这是在 Proc 0 上发生的事情(我不能共享同一个缓冲区,因为要发送的向量每次都是在 Proc1 中本地创建的):
vector<int> results_and_rank;
int results_rank_size;
MPI_Recv(&results_rank_size, 1, MPI_INT, MPI_ANY_SOURCE, 666, MPI_COMM_WORLD, &status);
MPI_Recv(&results_and_rank, results_rank_size, MPI_INT, MPI_ANY_SOURCE, 777, MPI_COMM_WORLD, &status);
cout << "size of results_and_rank is :"<< results_and_rank.size()endl;
cout<< "last element of array is :"<< results_and_rank.back()<<endl;
我认为通信工作正常,因为我能够读取接收到的向量的大小,它与我发送的向量相同,但是每当我尝试访问数组的元素时我的代码就会崩溃 results_and_rank 因此在最后一次打印时崩溃。
顺便说一句,为了我的项目,我需要使用阻塞通信。
我错过了什么吗?感谢您的宝贵时间和帮助。
您想将 数据 send/receive 到矢量,因此您需要矢量内部的数据,而不是矢量本身。
此处将 std::vector
本身的地址传递给 MPI_Recv()
,这将破坏 std::vector
。
MPI_Recv(&results_and_rank, results_rank_size, MPI_INT, MPI_ANY_SOURCE, 777, MPI_COMM_WORLD, &status);
正确方法:
发件人:
MPI_Send(&tosend[0], tosend_size, MPI_INT, 0, 777, MPI_COMM_WORLD);
接收者:
results_and_rank.resize(results_rank_size);
MPI_Recv(&results_and_rank[0], results_rank_size, MPI_INT, MPI_ANY_SOURCE, 777, MPI_COMM_WORLD, &status);