2012-12-02 68 views
1

我收到MPI_Bcast的錯誤(我認爲它是舊的錯誤)我不知道爲什麼會發生這種情況。錯誤如下:MPI_Bcast的錯誤

An error occurred in MPI_Bcast  
on communicator MPI_COMM_WORLD 
MPI_ERR_TRUNCATE: message truncated  
MPI_ERRORS_ARE_FATAL: your MPI job will now abort 

它發生在哪裏的代碼是:

for (int i = 0; i < nbProcs; i++){ 
    for (int j = firstLocalGrainRegion; j < lastLocalGrainRegion; j++){ 
     GrainRegion * grainRegion = microstructure->getGrainRegionAt(j); 
     int grainSize = grainRegion->getBoxSize(nb); 
     double * newValues; 
     if (myId == i) 
      newValues = grainRegion->getNewValues(); 
     else 
      newValues = new double[grainSize]; 
     MPI_Bcast(newValues, grainSize, MPI_DOUBLE, i, MPI_COMM_WORLD); 
     MPI_Barrier(MPI_COMM_WORLD); 

     if (myId != i) 
      grainRegion->setNewValues(newValues); 
    } 
} 
+0

您的問題可能與[此問題]中的問題相同(http://stackoverflow.com/q/13290608/1374437)。向我們展示更多代碼上下文 –

+0

另外:檢查'grainRegion-> getBoxSize(nb)'是否在所有進程中返回相同的值,否則最終可能會在'MPI_Bcast'調用中導致'grainSize'的值不匹配。 –

+0

請注意,所有進程的緩衝區必須相同(因爲最終每個人都會在緩衝區中持有相同的東西)。如果你想發送1個值給所有的進程,你不需要整個數組。 – nhahtdh

回答

2

有對錯誤可能有兩個原因。

第一個問題是您有一個掛起的前一個MPI_Bcast,在外部循環之前的某個地方開始,但沒有完成,例如,方式類似於this question中的方式。

第二個是可能的緩衝區大小不匹配,因爲grainRegion->getBoxSize(nb)在不同的進程中返回不同的值。您可以使用並行調試檢查代碼或只是把打印語句廣播之前,例如:

int grainSize = grainRegion->getBoxSize(nb); 
printf("i=%d j=%d rank=%02d grainSize=%d\n", i, j, myId, grainSize); 

有了這個特殊的輸出格式,你應該能夠簡單地通過sort運行輸出,然後迅速找到不匹配的值。由於屏障始終是同步的(廣播可能不是必需的),因此在第一種情況下幾乎不可能對MPI_Bcast進行不同的呼叫互相干擾。

如果發生這種情況,以便您的數據結構是分佈式的,並且實際上grainSize的正確值僅在廣播根進程中可用,那麼您應該首先通知其他級別的正確大小。最簡單的(但不是最有效的)解決方案將是廣播grainSize。更好的解決方案是首先執行MPI_Allgather以及每個過程中的顆粒區域數量(僅在必要時),然後根據每個區域的大小執行MPI_Allgatherv