2013-10-08 60 views
0

我正在解決一個進程在列上進行一些計算的問題,並且將該列保存在一個臨時數組中,並使用MPI_Bcast將其廣播到所有其他進程,但始終以全部結束接收端數組中的零。通過MPI_Bcast發送列

下面是我的代碼,我使用:

//nProc = no of processors; 
//helperA = 2D Array i.e. helperA[size][size] 
// colK = 1D Array i.e. colK[size] 

for (int k = 0; k < size; ++k) { 
    if (k % nProc == rank) { 
        // One of the process will do this calculation 
     int temp = 0; 
     for (int j = k + 1; j < size; ++j) { 
      helperA[j][k] = helperA[j][k]/helperA[k][k]; 
      colK[temp++] = helperA[j][k]; 
     } 
    } 

    MPI_Bcast(colK, size - k - 1, MPI_DOUBLE, rank, MPI_COMM_WORLD);  
    // After this other process should get the colK updated with the calculation 

    for (int i = k + 1; i < size; ++i) { 
     if (i % nProc == rank) { 
      int temp = 0; 
      for (int j = k + 1; j < size; ++j) { 
            // Here colK is always zero 
       printf("%d %f \n", rank, colK[temp]); 
       helperA[j][i] = helperA[j][i] - (colK[temp++] * helperA[k][i]); 
      } 
     } 
    } 
} 

我不知道我在做什麼錯在這裏。任何幫助/建議請。

回答

1

(我真的不喜歡通過文本框調試代碼,所以我假設你已經完成了基本檢查,以確保在發送之前確實有數據在colK之內,並且size-k-1是正確的值)

您傳遞給MPI_BCAST調用的等級值應該是「根」過程的等級。也就是說,具有所有要被廣播的數據的過程。所有調用進程的參數必須相同。你的代碼似乎通過了每個調用過程的等級,所以每個人都會嘗試與不同的根進程進行通信。

+0

謝謝。是的,我已經完成了錯誤檢查,數據是他們的,但你的觀點是有效的,我只是檢查這一點,並在這種情況下更新你。 – JackSparrow

+0

這是這種情況:)非常感謝你的幫助! – JackSparrow