2015-11-03 65 views
0

據我所知,MPI_Sendrecv需要兩個不同的緩衝區發送和接收。我的下面的代碼發送(N/P)塊到P-1處理器,但它不起作用,並給我一個凍結的屏幕。我想,以確保一切是正確的,但我看不出哪裏出了問題就在這裏(我省略了變量聲明,使之短)MPI_Sendrecv使用2D矩陣問題

int **M, **FinalM, **M0; 
M = malloc(N * sizeof (int *)); 
for (i = 0; i < N; i++) { 
    M[i] = malloc(N * sizeof (int)); 
} 
FinalM = malloc(N * sizeof (int *)); 
for (i = 0; i < N; i++) { 
    FinalM[i] = malloc(n * sizeof (int)); 
} 

M0 = malloc(N/P * sizeof (int *)); 
for (i = 0; i < N/P; i++) { 
    M0[i] = malloc(N * sizeof (int)); 
} 

c = N/P; // P is Number of Processors and N rows 
if (rank == 0) { 
    for (i = 0; i < P; i++) { 
     k = i*c; 
     k1 = (i + 1) * c; 
     for (j = k; j < k1; j++) { 
      MPI_Sendrecv(M[j], N, MPI_INT, i, TAG, FinalM[j], N, MPI_INT, i, TAG, MPI_COMM_WORLD, &status[d]); 
     } 
    } 
} else { 

    for (i = 0; i < (N/P); i++) { 
     MPI_Recv(M0[i], N, MPI_INT, 0, TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    } 
} 

請,有人可以給我一個提示來解決這個問題? 謝謝。

+0

我已經更新了代碼。 – Mike

回答

1

從文檔在https://www.open-mpi.org/doc/v1.8/man3/MPI_Sendrecv.3.php#toc7

MPI_Sendrecv執行阻塞發送和接收操作。

在您的情況下,主循環會將一部分矩陣發送給第一個工人並阻塞,等待工人作出響應。沒有迴應,所以它永遠掛起。您需要在主循環中使用MPI_Send,然後再使用MPI_Recv的另一個循環。工作人員必須使用MPI_Send發回一些東西。

+0

我明白了。我沒有注意到這一點。感謝您的解釋 – Mike

+0

不客氣。如果您認爲它很好,您可以隨時選擇答案並選擇答案。 –