【问题标题】:MPI_Barrier with MPI_Gather using small vs. large data set sizes? [duplicate]MPI_Barrier 和 MPI_Gather 使用小型和大型数据集大小? [复制]
【发布时间】:2017-10-14 16:47:38
【问题描述】:

我一直在使用 MPI_Scatter / MPI_Gather 进行各种并行计算。我注意到的一件事是,经常调用 MPI_Barrier() 来同步处理器,类似于 OpenMP 屏障指令。我正在为一个项目调整我的代码并在下面注释掉我的 MPI_Barrier() 行,发现计算仍然正确。为什么会这样?我可以理解为什么需要第一个 MPI_Barrier() - 其他处理器不需要等待;一旦他们从处理器 MASTER 获得数据,他们就可以开始计算。但是在 MPI_Gather 之后是否需要 MPI_Barrier,或者 MPI_Gather 内部是否已经有隐式屏障?

编辑:在这种情况下,正在处理的数据大小是否重要?

MPI_Scatter(&sendingbuffer,sendingcount,MPI_FLOAT,receivingbuffer,sendcount,
MPI_INT,MASTER_ID,MPI_COMM_WORLD);

// PERFORM SOME COMPUTATIONS
MPI_Barrier(); //<--- I understand why this is needed

MPI_Gather(localdata,sendcount, MPI_INT, global,sendcount, MPI_INT, MASTER_ID, MPI_COMM_WORLD);
//MPI_Barrier(); <------ is this ever needed?

【问题讨论】:

  • 另外,MPI 的缓冲功能将为您做一些默认的安全工作。您的“发送者”会将您的数据发送到“接收者”系统缓冲区。然后在“接收器”内部,它将您的数据从系统缓冲区传输到应用程序缓冲区。因此,对于少量数据,您可以假设您的程序是安全的。
  • 关于您的编辑:不,在这种情况下,数据大小不会影响正确性。

标签: c synchronization mpi distributed-computing


【解决方案1】:

不需要任何障碍!

MPI_Gather 是一个阻塞操作,即调用完成后输出可用。这并不意味着障碍,因为非根级别允许但不保证在根/其他级别开始操作之前完成。但是,在本地调用完成后访问MASTER_ID 等级上的global 并在任何等级上重复使用localdata 是完全安全的。

与基于消息的 MPI 同步不同于共享内存 OpenMP。对于阻塞通信,通常不需要显式同步 - 保证在调用完成后结果可用。

排序同步对于非阻塞通信是必要的,但这是通过 MPI_Test/MPI_Wait 对特定消息完成的 - 如果您尝试将 MPI_Wait 替换为 @,屏障甚至可能会提供错误的正确感987654329@。单方面的沟通会变得更加复杂,障碍也会发挥作用。

实际上,您很少需要屏障,而是避免使用它们以免引入任何不必要的同步。

编辑:鉴于其他答案相互矛盾,这里是标准(MPI 3.1,第 5.1 节)引用(强调我的)。

集体行动可以(但不是必须)尽快完成 因为调用者参与集体通信是 完成的。 一旦调用,阻塞操作就完成了 返回。 非阻塞(立即)调用需要单独完成 调用(参见第 3.7 节)。 集体作业完成 表示调用者可以随意修改 通信缓冲区。它并不表示其他进程在 组已完成甚至开始操作(除非另有 隐含在操作的描述中)。于是,一个集体 通信操作可能会或可能不会具有以下效果 同步所有调用进程。本声明不包括 当然是屏障操作。

为了解决最近的编辑:不,在这种情况下,数据大小对正确性没有影响。 MPI 中的数据大小有时会影响不正确的 MPI 程序是否会死锁。

【讨论】:

    【解决方案2】:

    MPI_Gather() 内部没有隐式屏障。

    问题:需要聚集后的屏障吗?

    没有。

    正如您在When do I need to use MPI_Barrier()? 中看到的那样:

    MPI-3.0 之前 MPI 中的所有集合操作都是阻塞的,这 意味着在它们之后使用传递给它们的所有缓冲区是安全的 返回。特别是,这意味着当一个 这些函数返回。 (但是,这并不意味着所有数据 已发送!)所以 MPI_Barrier 没有必要(或非常有帮助) 在集体操作之前/之后,如果所有缓冲区都已经有效。

    【讨论】:

    • 除了MPI_Gather 没有暗示障碍,这绝对是错误的。 MPI_Gather 正在阻塞。您在这里没有使用共享内存模型。
    • @Zulan 谢谢,答案已更新。但是,我这样做是为了让我们的答案仍然不同。顺便说一句,很好的答案!
    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 2023-04-08
    • 2014-11-07
    • 1970-01-01
    • 2018-03-17
    • 2012-07-07
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多