Я написал свой код для запуска параллельной программы пинг-понга. Ниже приводится мой код:Неустранимая ошибка при запуске параллельной программы для пинг-понга
#include <mpi.h>
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char **argv){
//t0 Start Time
//t1 End Time
int size,rank,msgtag = 1;
double t0,t1,tmaster,tslave ;
MPI_Status status;
//initialize
int x;
//initialize MPI
if (MPI_Init(&argc, &argv) != MPI_SUCCESS) {
fprintf(stderr, "MPI initialization error\n");
return EXIT_FAILURE;
}
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
//communication between 2 nodes
///action process 0
if(rank == 0){
//start timer
//master process
t0 = MPI_Wtime();
MPI_Send(&x,1,MPI_INT,1,msgtag,MPI_COMM_WORLD);
//stop timer
t1 = MPI_Wtime();
//calculate elapsed time
tmaster = (t1 - t0);
MPI_Recv(&tslave,1,MPI_DOUBLE,1,msgtag,MPI_COMM_WORLD,&status);
printf("Master time: %g \n\n",tmaster);
printf("slave time: %g \n\n",tslave);
}else{
///action process 1
//receive message
t0 = MPI_Wtime();
MPI_Recv(&x,1,MPI_INT,0,msgtag,MPI_COMM_WORLD,&status);
t1 = MPI_Wtime();
tslave = (t1 - t0);
//Send message
MPI_Send(&tslave,1,MPI_DOUBLE,0,msgtag,MPI_COMM_WORLD);
}
MPI_Finalize();
}
Я могу запустить свой код без каких-либо ошибок или предупреждений. Однако, когда я пытаюсь отлаживать его, он показал мне эту фатальную ошибку:
job aborted:
rank:node:exit node:message:
0:localhost:-101:Fatal error in MPI_Send:invalid rank,error stack:
MPI_Send<172>:MPI_Send<buf=0x003FFBB4, count=1, MPI_INNT,dest=1, tag=1,MPI_COMM_WORLD> failed
MPI_Send<97>.; invalid rank has value 1 but must be non negative and less then 1
Кто-нибудь знает, как исправить эту роковую ошибку?
Возможно, вы отлаживаете один экземпляр исполняемого файла - он запускается как так называемый экземпляр «singleton MPI», и в юниверсе MPI есть только один процесс, и он имеет ранг 0, поэтому отправка/получение из ранга 1 является ошибочным. Существуют специализированные параллельные отладчики, такие как TotalView и DDT, которые могут порождать параллельное задание, а затем отлаживать каждый процесс отдельно или совместно как единую программу. –