MPI:处理器在单个 MPI 进程上未达到 100%
MPI: Processor does not go up to 100% on a single MPI process
我有一个使用套接字用 C 语言编写的简单客户端-服务器程序。服务器为每个请求打开一个新的 pthread。在每个新打开的线程上,我都会执行 CPU 密集型任务(矩阵乘法)。
我有一个 CPU 有 2 个物理内核和 4 个逻辑处理器。
当我 运行 4 个客户端时,服务器打开 4 个线程,每个线程都分配给一个逻辑处理器并且 CPU 达到 100%(使用率)。
如果我 运行 延迟 5 秒一个客户端,我可以非常清楚地看到 CPU 如何从 25%(一个客户端)到 50%(两个客户端) ),到 75%(三个客户),最后到 100%(4 个客户)。这是一个很正常的行为。
但是,如果我将整个服务器代码嵌入到一个MPI进程中(只有一个MPI进程),CPU无论如何都不会提高超过50%我开始了多少客户。
为什么会这样?
恭喜
官方对这个问题的回答如下:
正如 Hristo Iliev 在对我的问题的评论中所说,将 --bind-to none 传递给 mpirun 命令可以解决问题。
此选项实际上将 MPI 进程绑定到特定对象(有关详细信息,请参阅 the manual)。
默认情况下,每个 MPI 进程都绑定到一个物理内核。我的机器上有 2 个内核,所以我可以获得的 CPU 的最大使用率约为 50%。
将绑定设置为 none 会删除该约束,现在每个 MPI 进程都将绑定到一个逻辑核心,这允许我的 CPU 达到 100%。
我有一个使用套接字用 C 语言编写的简单客户端-服务器程序。服务器为每个请求打开一个新的 pthread。在每个新打开的线程上,我都会执行 CPU 密集型任务(矩阵乘法)。
我有一个 CPU 有 2 个物理内核和 4 个逻辑处理器。
当我 运行 4 个客户端时,服务器打开 4 个线程,每个线程都分配给一个逻辑处理器并且 CPU 达到 100%(使用率)。
如果我 运行 延迟 5 秒一个客户端,我可以非常清楚地看到 CPU 如何从 25%(一个客户端)到 50%(两个客户端) ),到 75%(三个客户),最后到 100%(4 个客户)。这是一个很正常的行为。
但是,如果我将整个服务器代码嵌入到一个MPI进程中(只有一个MPI进程),CPU无论如何都不会提高超过50%我开始了多少客户。
为什么会这样?
恭喜
官方对这个问题的回答如下:
正如 Hristo Iliev 在对我的问题的评论中所说,将 --bind-to none 传递给 mpirun 命令可以解决问题。
此选项实际上将 MPI 进程绑定到特定对象(有关详细信息,请参阅 the manual)。
默认情况下,每个 MPI 进程都绑定到一个物理内核。我的机器上有 2 个内核,所以我可以获得的 CPU 的最大使用率约为 50%。
将绑定设置为 none 会删除该约束,现在每个 MPI 进程都将绑定到一个逻辑核心,这允许我的 CPU 达到 100%。