簡體   English   中英

(C) MPI 進程在 For 循環后無法響應

[英](C) MPI Processes Fail to Respond After For Loop

假設我有一個代碼塊,它嘗試計算斐波那契數列中的前 15 個數字,並使用 for 循環將每個唯一數字分配給 3 個進程 (MPI_Send),如下面的代碼塊所示。

int main(int argc, char* argv[]) {

    int rank, size, recieve_data1, recieve_data2;
    MPI_Init(NULL, NULL);
    MPI_Status status;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    printf("Available ranks are: %d \n \n", rank); // first rank rollcall
    fflush(stdout);

    int num1 = 1; int num2 = 1;
    int RecieveNum; int SumNum;

    for
        (int n = 0; n < 16; n++) {
        if
            (rank == 0) {

            // perform the fibb sequence algorithim
            SumNum = num1 + num2;
            num1 = num2;
            num2 = SumNum;

            // define the sorting algorithim
            int DeliverTo = (n % 3) + 1;

            // send calculated result
            MPI_Send(&SumNum, 1, MPI_INT, DeliverTo, 1, MPI_COMM_WORLD);
        }
        else {
            // recieve the element integer
            MPI_Recv(&RecieveNum, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);

            // print and flush the buffer
            printf("I am process rank %d, and I recieved the number %d. \n", rank, RecieveNum);
            fflush(stdout);
        }
    }
    printf("Available ranks are: %d \n \n", rank); // second rank roll call
    fflush(stdout);

/*

more code that I run...

*/

    MPI_Finalize();
    return 0;
}

在調用第一個 for 循環之前,進程 0,1,2,3 都響應printf(Available ranks are: %d \n \n", rank);在第 25 行。但是,在執行第一個 for 循環之后,使用第二個printf ,只有進程 0 響應。我希望所有 4 個進程 0 - 3 在執行 for 循環后再次響應。為了解決這個問題,我隔離了這部分代碼並嘗試調試幾個小時沒有成功。這個特定的問題被證明是有問題的,因為我有額外的代碼(為了簡潔起見,這里沒有顯示),它將訪問從這個序列生成的數字。

最后,我通過構建解決方案、以管理員身份運行 VS 終端並鍵入mpiexec -n 4 my_file_name.exe來運行代碼。 沒有發生構建錯誤或復雜錯誤。 從我所看到的(如果我錯了,請糾正我),所有進程在完成 for 循環后都會掛起,但我不確定為什么或如何修復它。

搜索網站后,我沒有看到任何回答這個問題的東西(從我的角度來看)。 我是一個 MPI(和 Stack Overflow)新手,所以也歡迎任何代碼指針。 謝謝

您有零進程計算發送給誰。 然后每個人都做一個接收。 這意味着所有不是計算接收者的進程都將掛起。

這種發送到動態計算接收器的場景在 MPI 中並不容易。 你要么需要

  • 向所有其他進程發送消息“不,我沒有給你”,或者
  • 向所有人發送消息,並且一體式進程忽略數據,或
  • 使用MPI_Put將數據放在計算機接收器上的一側操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM