MPI局部变量被破坏,为什么?

问题描述:

披露:这是一个家庭作业问题。我目前正在编写MPI中的矩阵乘法器,并且正在尝试诊断段错误。我将它缩小到了代码的一个给定部分,对于为什么会发生这种情况,我完全感到困惑,否则我对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的全部观点吗?

如果需要,我可以显示剩余的代码,但我不确定是否有必要。谢谢你的帮助!

回答我自己的问题以备将来参考。

而不是

rc = MPI_Irecv(&Rbuf, thischunksize*rnx, MPI_INT, source, RCHUNKTAG, MP\ 
I_COMM_WORLD, request+4); 

应该已经

rc = MPI_Irecv(Rbuf, thischunksize*rnx, MPI_INT, source, RCHUNKTAG, MP\ 
I_COMM_WORLD, request+4); 

我愚蠢地采取了指针的地址。我不确定我是否应该保留这个...如果我应该删除这个问题,请告诉我,我会的。