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

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

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

mpirun -np 9 XXX
  1. 9 会立即一起跑,还是 4 个接着 4 个跑?

  2. 我认为使用9不好,因为余数1会让计算机感到困惑,(我不知道它是否会感到困惑,或者计算机的“头”将决定4个核心中的哪个核心会被使用吗?)或者会被随机挑选。谁决定调用哪一个核心?

  3. 如果我觉得我的cpu还不错,内存还可以,足够大,而且我的机箱不是很大。为了充分利用我的 cpu 和 ram,这是一个好主意mpirun -np 8 XXXmpirun -np 12 XXX

答案1

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

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

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

答案2

根据有限的测试和我对并行计算的理解(不是很深入,尽管已经使用过几次):

  1. 他们将同时运行。

  2. 负载将在核心之间分配。计算机不会“困惑”,但您将获得很少或没有性能提升(因为每个核心都处理多个任务)。最坏的情况是,它会减慢速度。

  3. 最多你想运行与你的核心数量相当的数字;较大的值(在合理范围内;如果您给出一个大得离谱的数字,您可能会耗尽 RAM 或者系统变得非常慢)将运行,但您可能没有任何好处,甚至可能会看到速度减慢。不过,尝试一下也没什么坏处。

相关内容