【发布时间】:2015-06-20 16:07:23
【问题描述】:
我正在尝试在下面运行一个使用并行编程的程序。如果我们使用 4 个处理器,我希望它们包含总和 1+2=3、3+4=7、11 和 15。所以我希望 sumvector 按顺序包含 3、7、11 和 15。但是,由于 MPI_Send 的处理器以随机顺序发送,因此我不会将 sumvector 包含,例如 7、15、3、11。如何修改下面的代码以确保这一点?
#include<iostream>
#include<mpi.h>
using namespace std;
int main(int argc, char *argv[]){
int mynode, totalnodes;
int sum,startval,endval,accum;
MPI_Status status;
int master=3;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &totalnodes); // get totalnodes
MPI_Comm_rank(MPI_COMM_WORLD, &mynode); // get mynode
sum = 0; // zero sum for accumulation
vector <int> sumvector;
startval = 8*mynode/totalnodes+1;
endval = 8*(mynode+1)/totalnodes;
for(int i=startval;i<=endval;i=i+1)
sum=sum+i;
sumvector.push_back(sum);
if(mynode!=master)
{
MPI_Send(&sum,1,MPI_INT,master,1,MPI_COMM_WORLD); //#9, p.92
}
else
{
for(int j=0;j<totalnodes;j=j+1){
if (j!=master)
{
MPI_Recv(&accum,1,MPI_INT,j,1,MPI_COMM_WORLD, &status);
printf("processor %d received from %d\n",mynode, j);
sum = sum + accum;
}
}
}
使用多线程而不是 MPI 会更好吗?
【问题讨论】:
-
您缺少一堆包含。并且函数声明必须在使用之前可用。
-
当您发出完成计算的请求时,请包含您希望存放输出的位置。当它发送回复时,让它包含位置。当您收到回复时,不要只是将结果放在下一个可用的位置——将它放在回复中说它应该去的位置。
标签: c++ multithreading parallel-processing mpi