当满足错误条件时,我的程序可以在某些MPI等级上生成错误消息。 但是,有可能仅在某些(但不是全部)等级上满足此条件。我想要 从遇到错误条件的第一个排序输出消息,然后抛出 远离其他职级的类似信息。
如果我天真地这样做(不丢弃消息),例如
if (error) cout << "Error on rank " << rank << endl;
我会在屏幕上随机排序输出。
我想为进入if(error)
块的第一个进程锁定stdout,
由于并非所有进程都进入该块,因此这很复杂。这意味着,MPI_Barrier()集合将无法完成。仅将所有输出发送到一个处理器
确实是一个解决方案,因为这需要在代码中的每个地方进行同步,否则可能会生成错误消息,从而减慢程序的速度。为了打印消息而单独设置空闲处理器似乎也不具吸引力(这适用于社区代码)。如果排名很多,至少在每个等级写入一个文件也不是一种选择。
我想知道MPI中是否存在原子机制(我在MPI3中读到它),所以 我可以原子地更新一个处理器内存中的标志,例如通过片面沟通, 并且仅在尚未设置标志时继续打印错误消息。
我担心用标准技巧不能轻易实现这一点......我是对的吗?
更新
我想我想出了怎么做。韦斯利的答案很接近,但可以 也可以使用标准MPI2 RMA,这在大多数MPI实现中都可用。 解决方案的关键可以在使用MPI2书中的原子示例中找到, 其代码也在MPICH2发行版中(test / mpi / rma / fetchandadd.c)
以下是锁定和原子递增变量(存在于0级)的方法:
if (error)
{
int one = 1;
int flag;
MPI_Win_lock(MPI_LOCK_EXCLUSIVE, 0, 0, win);
MPI_Accumulate(&one, 1, MPI_INT, 0, 1, MPI_INT, MPI_SUM, win);
MPI_Get(&flag, 1, MPI_INT, 0, 0, 1, MPI_INT, win);
MPI_Win_unlock(0, win);
if (flag ==1) cout << "Error on rank " << rank << endl;
}
以及初始化期间的某个地方:
int error_flag = 0;
MPI_Win_create(&error_flag, sizeof(int), sizeof(int), MPI_INFO_NULL, mpi_comm, &win);
...在退出之前
MPI_Win_free(&win);
答案 0 :(得分:1)
您可以尝试MPI_COMPARE_AND_SWAP
。
MPI_COMPARE_AND_SWAP(origin_addr, compare_addr, result_addr, datatype, target_rank, target_disp, win)
IN origin_addr initial address of buffer (choice)
IN compare_addr initial address of compare buffer (choice)
OUT result_addr initial address of result buffer (choice)
IN datatype datatype of the element in all buffers (handle)
IN target_rank rank of target (non-negative integer)
IN target_disp displacement from start of window to beginning of target buffer (non-negative integer)
IN win window object (handle)
它位于MPI-3.0 Standard页面430(没有3.0版标准的HTML版本,因此我无法直接向其发布链接。通过此,您可以将已知值与目标值进行比较如果它们是相同的,你交换它们并获得原始值。我不是一个完整的RMA专家所以我不能保证它将提供你正在寻找的完全同步的语义(有一些我不是百分之百的时代的棘手问题,但我认为它应该适合你。
答案 1 :(得分:0)
不要在单独的空闲进程上侦听错误,而是在进程0上查看在空闲线程上执行相同操作的可行性。这不能保证工作(MPI标准什么也没说关于线程安全,但你的实现的文档可能),但只要你的记录器线程远离主线程的内存,我会说你的机会非常好。