FOR-LOOP的简单MPI并行化

FOR-LOOP的简单MPI并行化,for-loop,mpi,For Loop,Mpi,我正在尝试将for循环迭代的简单MPI分发到“Worker”核心。“工人”应以双精度格式(通常为~6)获取大小为“nGenes”的向量,并以双精度格式将结果返回一个变量。但是,即使在第一步中,我也遇到了问题,即将消息从“主”核心0传递到“工作者”核心1,2,…,nWorkers。该程序通过发送消息部分,但它被堆叠在接收部分,在接收部分使用MPI_Recv…行。我看不出有什么问题。请帮忙 包括 包括 包括 包括/*srand,兰特*/ 双fr双a; 无效计算每个核心的工作划分,主任务和从属任务的整

我正在尝试将for循环迭代的简单MPI分发到“Worker”核心。“工人”应以双精度格式(通常为~6)获取大小为“nGenes”的向量,并以双精度格式将结果返回一个变量。但是,即使在第一步中,我也遇到了问题,即将消息从“主”核心0传递到“工作者”核心1,2,…,nWorkers。该程序通过发送消息部分,但它被堆叠在接收部分,在接收部分使用MPI_Recv…行。我看不出有什么问题。请帮忙

包括 包括 包括 包括/*srand,兰特*/ 双fr双a; 无效计算每个核心的工作划分,主任务和从属任务的整数,处理器的整数,核心上的整数*开始,核心上的整数*结束; int main argc,char*argv[] { int-nIndividuals=10; int nGenes=6; 双**数据; 数据=新的双*[nIndividuals];
对于int ii=0;ii而言,根本原因是您没有正确使用发送和接收缓冲区。 sendbuff和receivebuff是指针,所以直接使用它们而不是它们的地址

MPI_Send(&sendbuff, nGenes, MPI_DOUBLE, cc, 0, MPI_COMM_WORLD);
MPI_Recv(&receivebuff, nGenes, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD,MPI_STATUS_IGNORE);
必须替换为

MPI_Send(sendbuff, nGenes, MPI_DOUBLE, cc, 0, MPI_COMM_WORLD);
MPI_Recv(receivebuff, nGenes, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD,MPI_STATUS_IGNORE);
cc = MyRank
作为补充说明,您不需要使用中间缓冲区来发送数据,您可以简单地

MPI_Send(DATA[jj], nGenes, MPI_DOUBLE, cc, 0, MPI_COMM_WORLD);
此外,在接收部分不需要最外层的环路

for (int cc=1; cc<=NumberOfWorkers; cc++)
    if (MyRank == cc)

最后但并非最不重要的一点是,您可以了解MPI_Scatterv,甚至MPI_Scatter和inter communicator,它可能最适合您所要实现的目标。

非常感谢Gilles!一切顺利!您是否有好的参考书/网站可推荐快速学习MPI基础知识?嗨,Gilles,我可以再问您一个问题吗?我对代码进行了扩展,对工作内核进行了计算,然后将结果发送回主内核秩=0。只有在我使用缓冲区的地址和执行send/Recv之后,该部分才能正确编译和运行,并且缓冲区必须是一维数组:MPI_send&FF[0],1,MPI_DOUBLE,0,1,MPI_COMM_WORLD;MPI_Recv&RcVal[0],1,MPI_DOUBLE,cc,1,MPI_COMM_WORLD,MPI_STATUS_IGNORE;它可以工作,但我是buffeld为什么。如果您声明DOUBLE*FF;那么FF等同于&FF[0].&FF是一种非常不同的东西,不能在这种情况下使用。这能回答您的问题吗?如果您正在寻找一个快速教程,您可以从Bill Gropp和其他人写的3本关于MPI的书开始,第1卷应该回答您的大多数问题,而不是一本小书,尽管声明是:double FF[1];谢谢你的推荐书。