【问题标题】:Can I use `std::this_thread::sleep_for()` with an MPI process?我可以在 MPI 进程中使用 `std::this_thread::sleep_for()` 吗?
【发布时间】:2016-08-31 22:07:00
【问题描述】:

MPI 使用多个进程运行我的程序。

我希望其中一个进程休眠一段时间,以便它使用最少的 CPU。

std::this_thread::sleep_for() 看起来像我想要的,但在这种情况下,thread 位看起来有点粗略。

这样可以吗?

【问题讨论】:

  • 大多数 MPI 实现在其自己的单独进程中开始每个等级。每个进程至少有一个线程。因此,this_thread 的使用非常好,但请注意 MPI 经常会产生额外的线程供内部使用,您不应该乱用它们(无论如何使用 C++ 接口实际上很难甚至不可能)。
  • @HristoIliev:我会赞成这个作为答案。

标签: c++ c++11 mpi sleep stdthread


【解决方案1】:

这完全没问题 - 不会因此而崩溃或挂起。

但是,您的“以便它使用最少的 CPU”有点令人担忧。您运行的 MPI 进程是否超过了可用于执行它们的硬件线程?这种超额订阅通常对性能很不利,应该避免。最佳性能通常是每个硬件节点的进程数少于其提供的硬件线程数,以允许系统进程在某个地方运行而不会抢占应用程序。

如果您的程序有一部分并行度低于进程,那么这可能是有充分理由的(我刚刚发布了a paper)。如果您在配备 Turbo Boost 的 Intel CPU 上运行,那么让空闲进程实际休眠可以让运行工作进程的内核以更高的时钟速度运行。

【讨论】:

  • 谢谢。我将活动 MPI 进程的数量限制为等于硬件线程,但是拥有(许多)更多不工作但能够保持计算的中间结果的进程非常方便。我已将非活动进程设置为循环 MPI_Iprobe + sleep_for(50ms) 对。
  • @Richard,你为什么不直接使用阻塞 MPI_Probe 并告诉 MPI 库在轮询网络接口时不要使用繁忙循环?或者您是否在 MPI_Iprobe + sleep 循环中做一些额外的工作?
  • @HristoIliev:OpenMPI 似乎无法识别我发送的mca 选项。目前尚不清楚英特尔 MPI 是否响应了环境变量。关于这个here,我问了一个新的和光荣的问题。
  • @Richard,具体是哪个 MCA 参数?
  • @HristoIliev:这可能是新问题上最好的讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2020-10-15
相关资源
最近更新 更多