Код MPI зависает при финализации с более чем 2 узлами / процессами

Предполагается, что следующий код отправит серию сообщений каждому узлу и сообщит о времени, которое требуется для каждой связи. На данный момент он нормально работает с процессами, но если я запускаю более двух процессов, он зависает на последнем обмене.

Я поместил операторы в предыдущих версиях, чтобы проверить, где он висит, я на 90% уверен, что это оператор MPI_FINALIZE, но я не могу понять, почему. Есть идеи?

 #include <stdio.h>
#include "/usr/include/mpich2/mpi.h"#define ping 101
#define pong 101
float buffer[100000];
int main (int argc, char *argv[]){
int error, rank, size; //mpi holders
int i, j, k; //loops
extern float buffer[100000]; //message buffer
int length; //loop again
double start, final, time;
extern float buffer[100000];MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if(rank!=0){
MPI_Status status;
for(i=1;i<size;i++){
for(length=1;length<=30000;length+=1000){
for(j=0;j<100;j++){
MPI_Recv(buffer, length, MPI_FLOAT, 0, ping, MPI_COMM_WORLD, &status);
MPI_Send(buffer, length, MPI_FLOAT, 0, pong, MPI_COMM_WORLD);
}
}
}
}
if(rank==0){
MPI_Status status;
for(i=1;i<size;i++){
for(length=1;length<=30000;length+=1000){
start = MPI_Wtime();
for(j=0;j<100;j++){
MPI_Send(buffer, length, MPI_FLOAT, i, ping, MPI_COMM_WORLD);
MPI_Recv(buffer, length, MPI_FLOAT, MPI_ANY_SOURCE, pong, MPI_COMM_WORLD, &status);
}
final = MPI_Wtime();
time = final-start;
printf("%s\t%d\t%f\n", "Node", i, time);
}
}
}

MPI_Finalize();
return 0;
}

0

Решение

У вас есть дополнительный цикл в ненулевых рангах:

  if(rank!=0){
MPI_Status status;
for(i=1;i<size;i++){   <-----------
for(length=1;length<=30000;length+=1000){
for(j=0;j<100;j++){
MPI_Recv(buffer, length, MPI_FLOAT, 0, ping, MPI_COMM_WORLD, &status);
MPI_Send(buffer, length, MPI_FLOAT, 0, pong, MPI_COMM_WORLD);
}
}
}                      <-----------
}

С 2 рангами этот цикл выполняет одну итерацию, но с более чем двумя рангами он выполняет size-1 итераций. Поскольку ранг 0 отправляет сообщения только один раз за ранг, вы должны удалить этот цикл.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]