gpt4 book ai didi

c++ - 如何让 MPI_Send 让处理器按顺序发送而不是随机发送?

转载 作者:行者123 更新时间:2023-11-28 02:28:47 27 4
gpt4 key购买 nike

我正在尝试运行下面使用并行编程的程序。如果我们使用 4 个处理器,我希望它们包含总和 1+2=3、3+4=7、11 和 15。所以我希望求和 vector 按顺序包含 3、7、11 和 15。但是,由于 MPI_Send 的处理器以随机顺序发送,所以我没有求和 vector 来包含 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 是否更好?

最佳答案

我不确定你想做什么,但你当前的代码(不打印从哪个级别收到的数字)等同于以下代码:

for(int i=startval;i<=endval;i=i+1)
sum=sum+i;
sumvector.push_back(sum);

MPI_Reduce(mynode == master ? MPI_IN_PLACE : &sum, &sum, 1, MPI_INT,
master, MPI_COMM_WORLD);

你要找的是这个(结果仅由大师级收集):

for(int i=startval;i<=endval;i=i+1)
sum=sum+i;

sumvector.resize(totalnodes);

MPI_Gather(&sum, 1, MPI_INT, &sumvector[0], 1, MPI_INT,
master, MPI_COMM_WORLD);

或这个(结果收集到所有等级):

for(int i=startval;i<=endval;i=i+1)
sum=sum+i;

sumvector.resize(totalnodes);

MPI_Allgather(&sum, 1, MPI_INT, &sumvector[0], 1, MPI_INT, MPI_COMM_WORLD);

另外,下面的说法是完全错误的:

HOwever, since MPI_Send has the processors sending in random order, I don't sumvector to contain, say, 7, 15, 3, 11.

MPI 点对点通信需要两件事才能成功:必须有一个发送者执行MPI_Send 一个接收器 执行匹配的 MPI_Recv。消息接收顺序可以通过简单地在循环中调用 MPI_Recv 来强制执行,并增加源级别,就像您在代码中显示的那样。

关于c++ - 如何让 MPI_Send 让处理器按顺序发送而不是随机发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637654/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com