在MPI中,锁定stdout以获取错误消息

时间:2013-12-03 06:29:35

标签: synchronization mpi stdout mpi-rma

当满足错误条件时,我的程序可以在某些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);

2 个答案:

答案 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标准什么也没说关于线程安全,但你的实现的文档可能),但只要你的记录器线程远离主线程的内存,我会说你的机会非常好。