我正在學習MPI編程並編寫了以下程序。它添加一整行數組並輸出總和。在等級0(或過程0)中,它將調用其所有從屬隊列來進行計算。我只想使用其他兩個從屬隊列/進程來完成此操作。每當我嘗試調用相同的等級兩次,如下面的代碼所示,我的代碼只會掛在中間,不會執行。如果我不叫同級別的兩倍,代碼將使用時正常工作如何使用C語言在MPI中調用相同的等級?
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
MPI_Init(&argc, &argv);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int tag2 = 1;
int arr[30] = {0};
MPI_Request request;
MPI_Status status;
printf ("\n--Current Rank: %d\n", world_rank);
int index;
int source = 0;
int dest;
if (world_rank == 0)
{
int i;
printf("* Rank 0 excecuting\n");
index = 0;
dest = 1;
for (i = 0; i < 30; i++)
{
arr[ i ] = i + 1;
}
MPI_Send(&arr[0], 30, MPI_INT, dest, tag2, MPI_COMM_WORLD);
index = 0;
dest = 2;
for (i = 0; i < 30; i++)
{
arr[ i ] = 0;
}
MPI_Send(&arr[0], 30, MPI_INT, dest, tag2, MPI_COMM_WORLD);
index = 0;
dest = 2; //Problem happens here when I try to call the same destination(or rank 2) twice
//If I change this dest value to 3 and run using: mpirun -np 4 test, this code will work correctly
for (i = 0; i < 30; i++)
{
arr[ i ] = 1;
}
MPI_Send(&arr[0], 30, MPI_INT, dest, tag2, MPI_COMM_WORLD);
}
else
{
int sum = 0;
int i;
MPI_Irecv(&arr[0], 30, MPI_INT, source, tag2, MPI_COMM_WORLD, &request);
MPI_Wait (&request, &status);
for(i = 0; i<30; i++)
{
sum = arr[i]+sum;
}
printf("\nSum is: %d at rank: %d\n", sum, world_rank);
}
MPI_Finalize();
}
結果:-np的mpirun 3測試
--Current Rank: 2
Sum is: 0 at rank: 2
--Current Rank: 0
* Rank 0 excecuting
--Current Rank: 1
Sum is: 524800 at rank: 1
//Program hangs here and wouldn't show sum of 30
請讓我知道我可以調用同排名兩次。例如,如果我只有另外兩個可以調用的從屬進程。 請如果可能的話
'tl; dr'我沒有,快速瀏覽一下,發現你的'答案'中有任何不同意見。讓我感到困擾的是,你可能已經發布了它針對你提到的那些最近的初學者-MPI問題(或者這裏的許多其他問題),這表明它不是這個問題的好答案。我懷疑這可能是http://programmers.stackexchange.com上的一個問題的一個很好的答案,但我不知道是否曾經有人問過這個問題。 –
@HighPerformanceMark你是對的,我可以做出這個答案,這更像是你對這些初學者的問題的評論/建議,如你注意到的答案。那麼爲什麼這個問題而不是其他問題呢?也許只是爲了讓它在這裏準備好並在將來需要時提及它......這似乎與SO的使用策略相符合嗎? – Gilles
我不確定我知道SO的使用政策是什麼 - 除了讓社區決定。這是有用的信息和建議,至少與問題相關,這兩方面都使得它在這裏的答案的50%以上。我當然不會投下它,事實上,該死的,我要去投票... –