我想知道是否有人可以为我了解 MPI_Waital 函数。我有一个使用 MPI_Isend 和 MPI_Irecv 传递信息的程序。在所有发送和接收完成后,程序中的一个进程(在本例中为进程 0)将打印一条消息。我的 Isend/Irecv 正在工作,但消息在程序中的某个随机点打印出来;所以我试图使用 MPI_Waital 等到所有请求都完成后再打印消息。我收到以下错误消息:
Fatal error in PMPI_Waitall: Invalid MPI_Request, error stack:
PMPI_Waitall(311): MPI_Waitall(count=16, req_array=0x16f70d0, status_array=0x16f7260) failed
PMPI_Waitall(288): The supplied request in array element 1 was invalid (kind=0)
以下是一些相关代码:
MPI_Status *status;
MPI_Request *request;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
status = (MPI_Status *) malloc(numtasks * sizeof(MPI_Status));
request = (MPI_Request *) malloc(numtasks * sizeof(MPI_Request));
/* Generate Data to send */
//Isend/Irecvs look like this:
MPI_Isend(&data, count, MPI_INT, dest, tag, MPI_COMM_WORLD, &request[taskid]);
MPI_Irecv(&data, count, MPI_INT, source, tag, MPI_COMM_WORLD, &request[taskid]);
MPI_Wait(&request[taskid], &status[taskid]
/* Calculations and such */
if (taskid == 0) {
MPI_Waitall (numtasks, request, status);
printf ("All done!\n");
}
MPI_Finalize();
如果不调用 MPI_Waitall,程序运行干净,但只要进程 0 的 Isend/Irecv 消息完成,就会打印“All done”消息,而不是在所有 Isend/Irecvs 完成后打印。
感谢您提供任何帮助。