披露:这是一个家庭作业问题。我目前正在 MPI 中编写矩阵乘法器,并且正在尝试诊断段错误。我已将其范围缩小到代码的给定部分,我完全不明白为什么会发生这种情况,否则我对 MPI 有根本的误解(完全有可能)。
主进程ID为0,4个从进程ID为1-4。在从进程计算出它们的输出矩阵块并将它们发送回主进程后,我会收到带有此代码的它们。我已经包含了一些打印语句,这些语句显示了这个变量损坏发生的位置:
for(i=1;i<numtasks;i++) {
source = i;
thischunksize = lindex-findex+1;
rc = MPI_Irecv(&Rbuf, thischunksize*rnx, MPI_INT, source, RCHUNKTAG, MP\
I_COMM_WORLD, request+4);
printf("0: D Just checking, i is %d and source is %d\n", i, source);
rc = MPI_Wait(request+4, status+4);
printf("0: E Just checking, i is %d and source is %d\n", i, source);
for(j=0;j<thischunksize*rnx;j++)
{
R[findex*rnx + j] = Rbuf[j];
}
}
输出是:
0: D Just checking, i is 1 and source is 1
0: E Just checking, i is 0 and source is 0
因此,当 MPI_Wait 函数运行时,这些变量的值会发生变化。为什么?主进程和从进程都使用 i 变量,但我认为这无关紧要;我假设每个进程都有自己的内存;这不是 MPI 的重点吗?
如果需要,我可以显示其余代码,但我不确定是否有必要。谢谢你的帮助!