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,則程序崩潰。 它不依賴於進程的數量。 任何提示?
非常感謝Sigismondo。問題是我不必實施流通,而是交換框架。 問題是關於記憶,我不知道爲什麼。 關於coord系統,你是絕對正確的,但這個代碼只是一個嘗試。我會稍後修復 –
的問題,但由於您爲不同的sendrecv使用了不同的標記,因此sendrecv的發送端必須與相應的recv配對。在您將第一行中的發送提取爲「OVEST」後,與「EST」中第二行的recv配對。他們有不同的標籤 - 所以recv不能收到任何東西並被卡住。然而,常用的方法是將SEND與同一個sendrecv的RECV配對,因此發送到左側,從右側接收相同的標籤;發送到右側並從左側接收;等等。他們是一步一步循環通訊......希望通過這種方式更清晰。 – Sigismondo
謝謝你的時間,Sigismondo。你的幫助是根本。我糾正了你所說的,現在一切正常。 老實說,我有另一個問題,但你無法檢測到它,因爲我沒有指定我試圖發送布爾向量。 再次感謝您 –