2013-04-04 70 views
0

披露:這是一個家庭作業問題。我目前正在編寫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的全部觀點嗎?

如果需要,我可以顯示剩餘的代碼,但我不確定是否有必要。謝謝你的幫助!

回答

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

我愚蠢地採取了指針的地址。我不確定我是否應該保留這個...如果我應該刪除這個問題,請告訴我,我會的。