【问题标题】:MPI: Processor does not go up to 100% on a single MPI processMPI:处理器在单个 MPI 进程上无法达到 100%
【发布时间】:2018-05-16 11:44:33
【问题描述】:

我有一个使用套接字用 C 语言编写的简单客户端-服务器程序。服务器为每个请求打开一个新的 pthread。在每个新打开的线程上,我都会执行一个 CPU 密集型任务(矩阵乘法)。

我有一个带有 2 个物理内核和 4 个逻辑处理器的 CPU。

当我运行 4 个客户端时,服务器打开 4 个线程,每个线程都分配在一个逻辑处理器上,CPU 达到 100%(使用率)。

如果我以 5 秒的延迟一个接一个地运行客户端,我可以非常清楚地看到 CPU 是如何从 25%(一个客户端)到 50%(两个客户端)再到 75%(三个客户端)和最终达到 100%(4 个客户)。这是很正常的行为。

但是,如果我将整个服务器代码嵌入到一个 MPI 进程(只有一个 MPI 进程)中,那么无论我启动多少个客户端,CPU 的提升都不会超过 50%。

为什么会这样?

非常感谢

【问题讨论】:

  • 可能是 MPI 启动器限制了已执行二进制文件的 CPU 集。请查看您的 MPI 手册 sched_getaffinity。如需更多帮助,请提供有关 MPI 实现、版本、如何启动 MPI 二进制文件和操作系统的信息...
  • 如果您的 MPI 实现是 Open MPI,请尝试将 --bind-to none 传递给 mpiexec / mpirun
  • 如果您不确定您的任务是如何固定的,您可以简单地mpirun ... grep Cpus_allowed_list /proc/self/status
  • Hristo Illiev:您的解决方案奏效了!谢谢!

标签: c multithreading pthreads mpi cpu-usage


【解决方案1】:

这个问题/问题的官方回答如下:

正如 Hristo Iliev 在对我的问题的评论中所说,将 --bind-to none 传递给 mpirun 命令可以解决问题。

此选项实际上将 MPI 进程绑定到特定对象(有关详细信息,请参阅the manual)。

默认情况下,每个 MPI 进程都绑定到一个物理内核。我的机器上有 2 个内核,因此我可以获得的 CPU 的最大使用率约为 50%。

将绑定设置为 none 会删除该约束,现在每个 MPI 进程都将绑定到一个逻辑内核,这允许我的 CPU 达到 100%。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2021-08-23
    • 2023-03-03
    • 1970-01-01
    • 2021-11-16
    • 2010-11-11
    • 2015-12-20
    • 2015-12-14
    相关资源
    最近更新 更多