【问题标题】:In MPI, lock stdout for error messages在 MPI 中,为错误消息锁定标准输出
【发布时间】:2013-12-19 02:36:33
【问题描述】:

当满足错误条件时,我的程序可以在某些 MPI 等级上生成错误消息。 但是,可能仅在某些(但不是全部)等级上满足此条件。我想要 从遇到错误条件的第一行输出一条消息,并抛出 远离其他队伍的类似信息。

如果我天真地这样做(没有丢弃消息),例如

if (error) cout << "Error on rank " << rank << endl;

我会在屏幕上得到随机排序的输出。

我想为进入if(error) 块的第一个进程锁定标准输出, 由于并非所有进程都进入该块,这使情况变得复杂。这意味着,一个 MPI_Barrier() 集合不会完成。仅将所有输出发送到一个处理器不是 确实是一个解决方案,因为这需要在代码中可能生成错误消息的每个位置进行同步,从而减慢程序的速度。仅出于打印消息的目的而设置空闲处理器似乎也没有吸引力(这是用于社区代码)。至少,如果有许多等级,每个等级写入一个文件也不是一种选择。

我想知道 MPI 中是否有原子机制(我在 MPI3 中读过它),所以 我可以原子地更新一个处理器内存中的标志,例如通过单方面的沟通, 并且仅在标志尚未设置时继续打印错误消息。

恐怕这不能用标准技巧轻松完成......我说的对吗?

更新:

我想我知道该怎么做了。卫斯理的回答很接近,但它可以 也可以使用标准 MPI2 RMA 来完成,该 RMA 在大多数 MPI 实现中都可用。 解决方案的关键可以在 Using MPI2 book 的 atomic example 中找到, 其代码也在 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);

【问题讨论】:

  • 在使用带有 Open MPI 的 RMA 时要小心,因为它带有一些预配置的 bugs

标签: synchronization mpi stdout mpi-rma


【解决方案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 专家,所以我不能保证它会提供你正在寻找的那种完全同步的语义(有一些棘手的我不是 100% 的时代),但我认为它应该适合你。

【讨论】:

  • 尚未尝试,因为并非所有 MPI 库都支持 MPI3(可能需要 2-5 年),但似乎在技术上是正确的。
  • 确实不是所有的库都支持它,虽然2-5年有点悲观。明年应该会有大多数库的新版本,其中包括大部分 MPI-3,包括新的 RMA 工作。一些库已经支持它。
【解决方案2】:

不要在单独的空闲进程上侦听错误,而是研究在进程 0 上的空闲 线程 上执行相同操作的可行性。这不能保证有效(MPI 标准没有说明关于线程安全,但您的实现文档可能),但只要您的记录器线程远离主线程的内存,我会说您的机会非常好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 2014-08-09
    • 2014-03-22
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多