我的代码中有一个错误。我有多个进程都处理来自二叉树的数据。最后,他们应该将结果发送到主节点(节点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个进程运行它,则发送/接收所有进程。任何人都知道为什么会这样?
答案 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;对自己来说,这不是很低效。)