2016-01-11 42 views
0

我是MPI的新手,很抱歉,如果這聽起來很愚蠢。我想要一個進程有一個MPI_Irecv。如果它已被調用任務,那麼它會找到一個結果並將結果發送回調用它的進程。我怎樣才能檢查它是否已經被分配到一個任務?所以我可以有一個if{}其中的任務發生,而其餘的過程繼續其他的東西。MPI irecv,isndnd任務之間的通信

代碼示例:

for (i=0;i<size_of_Q;i++) { 
    MPI_Irecv(&shmeio, 1, mpi_point_C, root, 77, MPI_COMM_WORLD, &req); 
    //I want to put an if right here. 
    //If it's true process does task. 
    //Finds a number. then 
    MPI_Isend(&Bestcandidate, 1, mpi_point_C, root, 66, MPI_COMM_WORLD, &req); 
    //so that it can return the result. 
    //if it wasn't assigned a task it carries on with its other tasks. 
} //(here is where for loop ends) 
+0

什麼是你的任務?它是如何發現它已被分配的?爲什麼你需要非阻塞?你的'MPI_Wait()'在哪裏? –

+0

它是如何發現它已被分配它實際上是我的問題。我是MPI新手,所以我不知道如何使用MPI_Wait() –

回答

1

你可能會混淆什麼MPI是應該做的。與其他一些模型(地圖縮小,OpenMP的某些部分等)相比,MPI並不是一個基於任務的模型。 MPI歷來重點關注SPMD(單程序多數據)類型的應用程序。這並不是說MPI不能處理MPMD(關於動態過程的標準有很多章節,大多數發射器可以在不同的隊列上運行不同的可執行文件)

考慮到這一點,當你開始工作時, 。會通常有所有你曾經有(除非你使用像MPI_COMM_SPAWN動態處理)的過程中您可能使用類似:

mpiexec -n 8 ./my_program arg1 arg2 arg3 

很多時候,如果人們試圖模仿任務(或主/工)模型,他們將0級視爲特殊的「主」:

MPI_Init(&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

if (0 == rank) { 
    while (/* work not done */) { 
     /* Check if parts of work are done */ 
     /* Send work to ranks without work */ 
    } 
} else { 
    while (/* work not done */ { 
     /* Get work from master */ 
     /* Compute */ 
     /* Send results to master */ 
    } 
} 

通常情況下,等待工作的時候,你會做這樣的事情:

for (i = 1; i < num_process; i++) { 
    MPI_Irecv(&result[i], ..., &requests[i]); 
} 

這將設置接收每個等級,將發送給您的工作。後來的後來,你可以這樣做:

MPI_Testany(num_processes - 1, requests, &index, &flag, statuses); 
if (flag) { 
    /* Process work */ 
    MPI_Send(work_data, ..., index, ...); 
} 

這將檢查,看看是否有任何請求(手柄用來追蹤非阻塞操作的狀態)的完成,將發送新的工作,工人完成。

很明顯,所有這些代碼都不是複製/粘貼準備就緒。你必須弄清楚它是如何/如果它適用於你的工作並相應地適應它。