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

标签 c++ multithreading parallel-processing mpi

我正在尝试运行下面使用并行编程的程序。如果我们使用 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/

相关文章:

c++ - 在运行时访问 v-table

python - 使用 boost::process 0.5。无法为 python.exe 重定向 stdio

java - ExecutorService 永远不会停止。在另一个正在执行的任务中执行新任务时

java - 按特定顺序运行两个以上线程

c++ - 如何在 Qt、GCD 风格的给定线程中执行仿函数或 lambda?

opencv - 如何使opencv处理分布在许多主机上

c# - LinqToSql。更新行时死锁。并行.For

c - 如何使用openmp并行化代码以减少添加矩阵和

c++ - 在 cocos2d-x 中使用 pthread

c++ - 使用 python libclang 检索评论