【发布时间】:2012-03-13 14:26:38
【问题描述】:
我对 MPI 发送和接收操作有疑问。
假设,我们有 2 个 MPI 线程尝试相互发送消息。以下是执行此操作的三个代码 sn-ps:
首先(阻止“发送”和“接收”):
...
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);
...
我猜以上三个代码可能存在问题,但我想听听您的意见。所以,我有以下问题:
上面给出的 3 个代码有哪些(潜在)问题(如果有)?
考虑到 MPI 标准,以上三个代码中哪一个是有效/正确的,以便它可以与所有 MPI 实现一起使用?
最好的方法是什么(如果不是以上 3 种,请写出来)?
在第三个代码中,如果我们改变 MPI_Irecv 和 MPI_Send 调用的顺序呢?
PS:顺便说一句,我已经尝试使用 Scali MPI 执行它们并且它们都有效!
【问题讨论】: