MPI:内核或处理器

  • 本文关键字:处理器 内核 MPI mpi
  • 更新时间 :
  • 英文 :


你好,我是MPI新手,所以请原谅我这一点。:)

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

运行可执行文件3 ./foo

现在这意味着程序将使用3个处理器并行运行(每个处理器1个进程)。但是,由于现在大多数处理器都有不止一个核心(假设每个处理器有两个核心),这是否意味着程序将在3个核心或3个处理器上运行?

可能这与我对核心和处理器之间的区别理解得很差有关,所以如果你能多解释一点,那将会有所帮助。

谢谢。

mpirun将在机器上执行多个"进程"。执行这些进程的cpu或核心依赖于操作系统。在N个cpu的机器上,每个cpu上有M个内核,您有空间让N*M个进程全速运行。

,但通常:

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

(根据mpi实现的不同,可能会有一些选项来强制使用特定的cpu或核心,但您不应该担心这一点)。

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

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

简而言之,给MPI指定您想要执行的进程数。然后对用户透明地处理这些流程的分布。您使用的进程数应该由应用程序的需求(2的幂、要读取的文件数)、可用的核心数以及应用程序的每个核心的最佳进程数来决定。

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

有趣的例子是一个多核多cpu系统。同样,您可以让操作系统调度器为您做这件事,或者您可以对进程强制(逻辑/物理)核心关联,将它们绑定到特定的核心。

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

前面的说法并不完全正确,因为操作系统允许移动进程,所以您可能希望使用numactl将它们绑定到一个核心。

如果您在一个多节点集群上,那么一个设置良好的mpi将生成一个hostfile,其中每个节点出现的次数与它有内核的次数一样多。因此,在每个节点有8个内核的4节点集群上,您可以请求多达32个进程,并期望获得接近完美的加速。(当然,如果你的代码和算法允许的话。)在该集群上请求9个进程可能会将8个进程放在一个节点上,第9个进程放在另一个节点上,这当然不利于性能。您可能希望您的集群软件附带一个能更好地分散进程的mpirun。

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

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

  • 主板可以容纳一个或多个芯片/骰子;
    • 一个芯片/die可以包含一个或多个内核(独立的cpu);
      • 一个CPU可以并发地处理一个或多个线程(我知道的多线程由两个线程组成)

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

过程绝对是一个软件概念。很简单,"线程"是并行并发计算环境中"进程"的一种规范。现在处理器可以指物理设备及其扩展的处理能力(还是多线程,这肯定是一种技术实现)。例如,您可以使用主板上有两个芯片的机器,每个芯片有四个核心/cpu,每个核心/cpu并发地运行两个线程。然后,您将能够运行2x4x2=16个进程(当然,不会过度订阅资源)。

你引用的MPI语法地址进程(选项np),或者线程,如果你喜欢。man mpirun的描述部分甚至将进程称为"插槽"(例如,参见hostfile的规格)。

slot表示在一个节点上可以执行多少进程。

这种用法听起来像是硬件单元和软件单元之间紧密对应的遗留问题,这是当时的标准。'Slot'最初是一种材料/硬件特性,与'socket'一词没有什么不同,'socket'有时也经历了类似的语义变化。

所以我确实很同情你的困惑。如果您是Linux用户,您可以可视化cat /proc/cpuinfo的报告。这些行指的是四个处理器中的一个名为"2"的处理器:

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

他们说,在这台机器上,我只得到一个芯片(因为"物理id"在整个列表中只取一个值,省略),这一个芯片作为4个"cpu内核",这一个芯片运行四个兄弟姐妹(4个线程,所以没有多线程)。在本例中,有4个处理元素和4个cpu内核。

在上面的多线程示例中,您将看到16个处理器的清单,'物理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
...

有'插座'确实是主板上的物理连接,芯片被插入,所以它确实是芯片的别名。这里确实没有多线程。

我非常感谢这篇文章中的讨论https://unix.stackexchange.com/q/146051/132913

最新更新