【问题标题】:MPI_Recv not receiving all MPI_Send requestsMPI_Recv 未收到所有 MPI_Send 请求
【发布时间】:2016-09-02 12:04:29
【问题描述】:

我的代码中有一个错误。我有多个进程,所有处理来自二叉树的数据。最后,他们应该将结果发送到将处理结果的主节点(节点 0)。但是,由于某种原因,一些 MPI_Send 没有被接收。

int *output=(int*) malloc(sizeof(int)*(varNum+2)); //contains all variable values and maxSAT and assignNum

if(proc_id!=0 && proc_id<nodeNums){
    output[0]=maxSAT;
    output[1]=assignNum;
    for(i=2;i<varNum+2;i++){
        output[i]=varValues[i-2];
    }
    MPI_Send(output,varNum+2,MPI_INT,0,TAG,MPI_COMM_WORLD);
    printf("proc %d sent data\n",proc_id);
}
else if(proc_id==0){
    for(i=1;i<nodeNums;i++){
        printf("receiving data from %d\n",i);
        MPI_Recv(output,varNum+2,MPI_INT,i,TAG,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
        if(output[0]>maxSAT){
            maxSAT=output[0];
            assignNum=output[1];
            for(i=0;i<varNum;i++){
                varValues[i]=output[i+2];
            }   
        }
        else if(output[0]==maxSAT){
            assignNum+=output[1];
        }
    }
}

当我使用 8 个进程 (nodeNums=8) 运行它时,这是输出。

proc 2 sent data
receiving data from 1
proc 5 sent data
proc 6 sent data
proc 3 sent data
proc 7 sent data
proc 1 sent data
proc 4 sent data

由于某种原因,所有进程都在发送数据,但它仅从 1 接收。但是,如果我使用 4 个进程运行它,则所有内容都已发送/接收。有人知道为什么会这样吗?

【问题讨论】:

    标签: c mpi distributed-computing


    【解决方案1】:

    这个问题与 MPI 无关。您的错误是在两个不同但嵌套的循环中使用了相同的变量:

    else if(proc_id==0){
        for(i=1;i<nodeNums;i++){ <----------------- (1)
            ...
                for(i=0;i<varNum;i++){ <----------- (2)
                    varValues[i]=output[i+2];
                }
            ...
        }
    }
    

    内循环完成后,i 的值等于varNum,如果碰巧varNum 大于或等于nodeNums,外循环也终止。更改内部循环的循环变量名称。

    【讨论】:

      【解决方案2】:

      这并不是真正使用 MPI 的方式。你在这里想要的是MPI_Gather(),这是所有进程(包括根)发送一大块数据并且收集进程接收所有数据的地方。像这样:

      rbuf = (int *)malloc(nodeNums*(varNum+2)*sizeof(int));
      MPI_Gather(output, varNum+2, MPI_INT, rbuf, varNum+2, MPI_INT, 0, MPI_COMM_WORLD);
      

      您的所有进程都应在其执行的同一部分执行上述操作。所有数据最终都会在rbuf

      在你的情况下,如果根不想发送任何东西,只需让它发送它可以简单地忽略的空数据(毕竟,它不需要物理“发送”给自己,所以这不是非常低效)。

      【讨论】:

        猜你喜欢
        • 2011-11-11
        • 2021-08-17
        • 2016-04-22
        • 2019-04-29
        • 2014-04-17
        • 2011-01-24
        • 1970-01-01
        • 2018-09-10
        • 2015-09-18
        相关资源
        最近更新 更多