MPI_Recv未收到所有MPI_Send请求

时间:2016-05-07 13:04:16

标签: c mpi distributed-computing

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

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个进程运行它,则发送/接收所有进程。任何人都知道为什么会这样?

2 个答案:

答案 0 :(得分:2)

问题与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,则外循环终止太。更改内循环的循环变量的名称。

答案 1 :(得分:1)

这不是真正使用MPI的方式。你想要的是MPI_Gather(),这是所有进程(包括root)发送大量数据并且收集进程全部接收它们的地方。像这样:

SELECT *,COUNT (DISTINCT column-name)  FROM table-name;

您的所有进程都应在执行的同一部分执行上述操作。所有数据都将以rbuf = (int *)malloc(nodeNums*(varNum+2)*sizeof(int)); MPI_Gather(output, varNum+2, MPI_INT, rbuf, varNum+2, MPI_INT, 0, MPI_COMM_WORLD); 结尾。

在你的情况下,如果root不想发送任何内容,只需让它发送空数据,它可以简单地忽略(毕竟,它不需要物理&#34;发送&# 34;对自己来说,这不是很低效。)