【发布时间】:2014-02-27 20:11:51
【问题描述】:
在我的应用程序中,我使用 MPI 以主从方式分配作业。将作业分配给从站,然后收集结果。在该程序的多线程版本中,当所有处理器同时尝试Send(阻塞)时,可能会出现死锁,因为没有匹配的Recv。我想出了一个似乎可行的解决方案,但我希望获得保证(除了再测试一万次之外)。
我的程序的安全性是肯定的,如果保证这个小代码 - 提供一个符合要求的实现。 (显然这仅适用于两个处理器,不适用于更多):
#include <cassert>
#include "mpi.h"
int main()
{
MPI::Init();
int ns[] = {-1, -1};
int rank = MPI::COMM_WORLD.Get_rank();
ns[rank] = rank;
MPI::Request request = MPI::COMM_WORLD.Isend(&rank, sizeof(int), MPI::BYTE, 1 - rank, 0);
MPI::COMM_WORLD.Recv(&ns[1 - rank], sizeof(int), MPI::BYTE, 1 - rank, 0);
request.Wait();
assert( ns[0] == 0 );
assert( ns[1] == 1 );
MPI::Finalize();
}
所以我的问题是:Isend 与 Recv 的交错直到我在 Isend 返回的 Request 上调用 Wait 是 MPI 中定义明确的安全事物吗?
(免责声明:这段代码并非设计为异常安全或特别漂亮。仅用于演示目的)
【问题讨论】: