`mpirun -np N`:如果 `N` 比我的物理内核大怎么办?

Dan*_*iel 5 linux mpi parallelism

假设我有一个 4 核工作站,如果我执行 Linux (Ubuntu) 会做什么

mpirun -np 9 XXX
Run Code Online (Sandbox Code Playgroud)
  1. 9 会立即一起跑,还是他们会在 4 后跑 4?

  2. 我觉得用9不好,因为剩下的1会让电脑糊涂,(不知道是不是完全糊涂了,还是电脑的“头”来决定4核中哪个核会被使用吗?)或者它会被随机挑选。谁决定调用哪一个核心?

  3. 如果我觉得我的cpu还不错,我的ram还可以,足够大,而且我的箱子不是很大。为了充分利用我的 cpu 和 ram,我这样做mpirun -np 8 XXX,甚至mpirun -np 12 XXX.

soa*_*dos 2

  1. 他们都会同时运行
  2. 负载将由您的操作系统分配,以便在尽可能多的可用内核上运行。时间可能与线程数不成正比。这是一个愚蠢的例子。假设您有一项工作要做三次,并且每次花费的时间相同(1 个时间单位)。你有两个核心。假设没有其他东西在运行。
    • 情况一:你只有一个线程。在这种情况下,线程运行在一个核心上,整个过程需要 3 个单位的时间才能完成。总时间:3
    • 情况二:您有两个线程。在一个单位时间内,该工作完成两次(每个核心一次)。然后,您必须等待整个时间单位才能完成第三次迭代。总时间:2
    • 情况 3:您有 3 个线程。您的操作系统将尽力使一切公平,因此将在三个进程之间平均分配时间。到第 1 单元结束时,它们都不会完成。到了第 2 单元,它们就全部完成了。(参见上面的案例)。总时间:2

启动更多线程实际上不会对性能造成太大影响(启动线程的成本小于 1MB),但也可能无济于事。

知道什么会更快地执行的唯一方法是测试它,但使用以下规则作为指导: 至少使用与核心数相同的线程数。此外,如果进程到处都有大量的内存访问,那么拥有更多的线程实际上可能比核心更快(与执行其他指令相比,内存访问非常慢,并且操作系统将用实际执行某些内容来填充时间)否则不必等待)。