MPI:核心还是处理器?

时间:2011-04-26 23:26:29

标签: mpi

嗨,我是一名MPI菜鸟,所以请耐心等待。 :)

假设我有一个名为foo.c的MPI程序,我用

运行可执行文件

mpirun -np 3 ./foo

现在这意味着程序将使用3个处理器并行运行(每个处理器1个进程)。但是,由于目前大多数处理器都有多个核心,(每个处理器需要2个核心),这是否意味着该程序将在3核或3处理器上运行?

可能这与我对核心和处理器之间的差异真正如此的不太理解有关,如果你还能解释一些有用的东西。

谢谢。

6 个答案:

答案 0 :(得分:32)

mpirun将在机器上执行许多“进程”。执行这些进程的cpu或核心依赖于操作系统。 在每个CPU上具有M个内核的N cpu机器上,您可以全速运行N * M进程。

但通常是:

  • 如果您有多个核心,则每个进程将在单独的核心上运行
  • 如果你要求的进程多于可用的核心* cpus,那么一切都会运行,但效率较低(是的,你可以在单CPU单核机器上运行多进程作业......)
  • 如果您正在使用排队系统或预配置的MPI系统,其中存在远程计算机列表,则分配将在远程计算机上分发。

(根据mpi的实现,可能有一些选项可以强制使用特定的cpu或核心,但你不必担心这一点。)

答案 1 :(得分:5)

进程到核心和处理器的分配由操作系统和MPI实现处理。在桌面上运行,操作系统通常会将每个进程放在不同的核心上,可能会在运行时重新分配进程。在诸如超级计算机或集群的较大系统中,分发由诸如SLURM的资源管理器处理。但是,这种情况会发生,每个核心都会分配一个或多个进程。

关于硬件,核心一次只能运行一个进程。超线程等技术允许多个进程共享单个核心的资源。有些情况下,每个核心有两个或更多进程是最佳的。例如,如果进程正在执行大量的文件I / O,则另一个进程可以取代它并进行计算,而第一个进程在读或写时挂起。

简而言之,为MPI提供您要执行的进程数。然后,对用户透明地处理这些过程的分发。您使用的进程数应根据应用程序的要求(2的权限,要读取的文件数),可用的核心数以及应用程序的每个核心的最佳进程数来确定。

答案 2 :(得分:4)

OS Scheduler将尝试以最佳方式为多核系统中的并行应用程序进程分配单独的核心,或者将多处理器系统中的处理器分开。

有趣的案例是多核多CPU系统。您可以再次让OS Scheduler为您执行此操作,或者您可以对您的进程强制执行(逻辑/物理)核心关联,以将它们绑定到特定的核心。

答案 3 :(得分:2)

mpirun命令使用主机列表。如果没有指定,它可能会使用" localhost"并在那里运行所有进程。如果您运行3个进程并且您拥有4核计算机,则可能获得良好的加速,因为操作系统通常会将它们放在不同的核心上。如果您只有两个核心,那么一个核心将获得两个进程。

之前并非完全正确,因为允许操作系统移动进程,因此您可能希望使用numactl将它们绑定到核心。

如果您在多节点群集上,那么设置良好的mpi将生成一个主机文件,其中每个节点出现的次数与其核心数一样多。因此,在每个节点有8个核心的4节点集群上,您可以请求最多32个进程,并期望接近完美的加速。 (当然,如果您的代码和算法允许这样做。)在该集群上请求9个进程可能在一个节点上放置8个,在另一个节点上放置9个,这当然不是很好的性能。您希望您的群集软件附带一个mpirun,可以更好地传播流程。

答案 4 :(得分:2)

从MPI作业的性能视图来看,有一些明确的规则: 1)如果您的代码是纯MPI代码(BLAS未使用openMP进行调整),请关闭超线程并将每个节点的作业任务数设置为节点的核心 2)如果您的代码是MPI + openMP,您可以将PPN(每个节点的进程)设置为节点的核心,将OMP_NUM_THEADS设置为2(如果每个核心有两个硬件线程) 3)如果您的代码是MPI + openMP并且您的群集很大,那么您可以将PPN(每个节点的进程数)设置为1,将OMP_NUM_THEADS设置为逻辑CPU数量以节省通信开销

答案 5 :(得分:0)

为了提供有用的框架,我将考虑以下层次结构:

    主板可以容纳一个或多个芯片/骰子;
      芯片/管芯可以包含一个或多个内核(独立的CPU);
      • CPU可以同时计算一个或多个线程(我知道的多线程由两个线程组成)

在早期,您通常使用一台主板和一个芯片,一个CPU运行一个线程。一次只能处理一个进程,而参与的硬件集称为处理器。在软件部分(要运行的任务)和硬件部分(要运行任务的设备)之间存在一对一的映射。

流程绝对是软件的概念。简单地说,“线程”是并行并行计算上下文中“进程”的规范。如今,处理器可以指代物理设备及其扩展的处理能力(再次是多线程,可以肯定这是一种技术实现)。例如,您的计算机主板上可以有两个芯片,每个芯片具有四个内核/ CPU,并且每个内核/ CPU可以同时运行两个线程。这样一来,您将可以运行2x4x2 = 16个进程(而不会浪费课程的资源)。

您引用的MPI语法用于处理进程(选项np),也可以根据需要使用线程。 man mpirun的描述部分甚至将进程称为“插槽”(例如,请参见主机文件的规范)。

  

插槽指示一个节点上可能可以执行多少个进程。

这种用法听起来像是老式硬件和软件单元之间紧密对应的遗产,这在当时是标准的。 “插槽”最初是一种材料/硬件功能,与术语“插槽”不同,术语“插槽”有时会经历类似的语义变化。

因此,的确,您的困惑让我感到相当同情。如果您是Linux用户,则可以可视化cat /proc/cpuinfo的报告。这些行指的是四个处理器中名为“ 2”的一个处理器:

processor   : 2
...
physical id : 0
siblings    : 4
core id     : 2
cpu cores   : 4

他们说,在这台机器上,我只得到了一个芯片(因为'phyical id'在整个列表中只取一个值,省略了),该芯片为4个'cpu核心',而该芯片为运行四个兄弟姐妹(4个线程,因此没有多线程)。在这种情况下,有4个处理元素和4个cpu内核。

在上面的多线程示例中,您将看到一个列表,其中包含16个处理器,“ physical id”(芯片)为2个值,“ cpu核心”等于4(每个芯片)和“兄弟姐妹等于8(每个芯片),因为该芯片上启用了多线程。在这种情况下,处理器的数量是内核的四倍。

因此,在此扩展上下文中,“处理器”表示机器在“进程”上工作的能力,而这是MPI您要使用的功能,而与启用此功能的内核数量和功能无关。您只需要概述这些处理功能的来源。

然后另一个有用的Linux命令是lscpu

...
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
...

“ socket”确实是插入芯片的母板中的物理连接,因此它确实是芯片的代名词。确实这里没有多线程。

我很感激另一篇https://unix.stackexchange.com/q/146051/132913

中的讨论