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

时间:2013-04-04 16:54:39

标签: c 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变量IS由主进程和从进程使用,但我认为这不重要;我假设每个过程都有自己的记忆;这不是MPI的全部意义吗?

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

1 个答案:

答案 0 :(得分:1)

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

而不是

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);

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