我有关于MPI发送和接收操作的问题。
假设我们有两个尝试相互发送消息的MPI线程。以下是三个执行此操作的代码片段:
第一个(阻塞“发送”和“接收”):
...
int data = ...;
...
MPI_Send( &data, sizeof( int ), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD );
MPI_Status status;
MPI_Recv( &data, sizeof( int ), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD, &status );
...
第二种情况(非阻塞的“发送”但是阻塞的“接收”):
...
int data = ...;
...
MPI_Request request;
MPI_Isend( &data, sizeof( int ), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD, &request);
MPI_Status status;
MPI_Recv( &data, sizeof( int ), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD, &status );
// Synchronize sender & receiver
MPI_Wait( &request, &status);
...
第三种情况(非阻塞的“接收”与阻塞的“发送”):
...
int data = ...;
...
MPI_Request request;
MPI_Irecv( &data, sizeof( int ), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD, &request );
MPI_Send( &data, sizeof( int ), MPI_INT,
(my_id == 0)?1:0, 0, MPI_COMM_WORLD);
MPI_Status status;
// Synchronize sender & receiver
MPI_Wait( &request, &status);
...
我猜以上三个代码可能存在潜在问题,但我想听听您的意见。因此,我有以下问题:
以上三个代码中有哪些(潜在)问题(如果有)?
考虑到MPI标准,哪一个是有效/正确的,可以与所有MPI实现一起工作?
如果以上3种方法都不行,最好的方法是什么?
在第三个代码中,如果我们交换MPI_Irecv和MPI_Send调用的顺序会怎样?
MPI_Wait
清理发送请求。或者,您可以使用MPI_Request_free
而不是等待。但请记住,在发送完成之前,写入发送缓冲区是不安全的-您可以使用MPI_Wait来检查是否完成发送。 - Greg Inozemtsev