2014-01-19 39 views
0

我遇到了一個很大的問題。 My_Sendrecv阻止並且通常程序不起作用。 假設每個進程都有變量用於C++的MPI,我的MPI_Sendrecv不起作用

int part_N, part_S, part_E, part_O; 
int loc_r[rank], loc_c[rank]; 

這裏是我的代碼:

std::vector<int> ssx(loc_r[rank],0), rsx(loc_r[rank],0), sdx(loc_r[rank],0), rdx(loc_r[rank],0); 
std::vector<int> sup(loc_c[rank],0), rup(loc_c[rank],0), sdwn(loc_c[rank],0), rdwn(loc_c[rank],0); 


    MPI_Sendrecv(&ssx[0], loc_r[rank], MPI_INT, part_O, 0, &rsx[0], loc_r[rank], MPI_INT, part_O, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    MPI_Sendrecv(&sdx[0], loc_r[rank], MPI_INT, part_E, 1, &rdx[0], loc_r[rank], MPI_INT, part_E, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    MPI_Sendrecv(&sup[0], loc_c[rank], MPI_INT, part_N, 2, &rup[0], loc_c[rank], MPI_INT, part_N, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    MPI_Sendrecv(&sdwn[0], loc_c[rank], MPI_INT, part_S, 3, &rdwn[0], loc_c[rank], MPI_INT, part_N, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 

注意,合作伙伴變量可以是相同的,那就是part_O = part_E在同一個進程。 這是問題嗎?

希望你能幫助我!編號: 這個問題似乎是內存分配。這就像我可以分配向量或數組最多5個整數元素;例如,如果loc_r [rank]大於5,則程序崩潰。 它不依賴於進程的數量。 任何提示?

回答

2

代碼塊因爲sendrecv沒有正確配對。

在我看來,正確的方式來實現在笛卡爾分佈格局圓形通信,爲您的specifica情況下,將如下所示:

MPI_Sendrecv(&ssx[0], loc_r[rank], MPI_INT, part_O, 0, &rdx[0], loc_r[rank], MPI_INT, part_E, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
MPI_Sendrecv(&sdx[0], loc_r[rank], MPI_INT, part_E, 1, &rsx[0], loc_r[rank], MPI_INT, part_O, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
MPI_Sendrecv(&sup[0], loc_c[rank], MPI_INT, part_N, 2, &rdwn[0], loc_c[rank], MPI_INT, part_S, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
MPI_Sendrecv(&sdwn[0], loc_c[rank], MPI_INT, part_S, 3, &rup[0], loc_c[rank], MPI_INT, part_N, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 

也就是說,尋找在第1 SENDRECV「我向WEST發送左邊框,並從EAST接收一個「。一個注意:我建議只使用一個「座標系統」:左右上下或sx-dx-su-giu :)或WENS ...

還要注意,如果您不得從/到給定方向,您可以將part_X分配給特殊值MPI_PROC_NULL

+0

非常感謝Sigismondo。問題是我不必實施流通,而是交換框架。 問題是關於記憶,我不知道爲什麼。 關於coord系統,你是絕對正確的,但這個代碼只是一個嘗試。我會稍後修復 –

+1

的問題,但由於您爲不同的sendrecv使用了不同的標記,因此sendrecv的發送端必須與相應的recv配對。在您將第一行中的發送提取爲「OVEST」後,與「EST」中第二行的recv配對。他們有不同的標籤 - 所以recv不能收到任何東西並被卡住。然而,常用的方法是將SEND與同一個sendrecv的RECV配對,因此發送到左側,從右側接收相同的標籤;發送到右側並從左側接收;等等。他們是一步一步循環通訊......希望通過這種方式更清晰。 – Sigismondo

+0

謝謝你的時間,Sigismondo。你的幫助是根本。我糾正了你所說的,現在一切正常。 老實說,我有另一個問題,但你無法檢測到它,因爲我沒有指定我試圖發送布爾向量。 再次感謝您 –