【问题标题】:Computational speed of Fortran code reduces with increase in number of processorsFortran 代码的计算速度随着处理器数量的增加而降低
【发布时间】:2021-02-16 00:08:05
【问题描述】:

我正在使用命令“mpirun -np 250 ./hello”在 Fortran 中运行并行的“Hello World”代码。这会打印 250 次“Hello world”以及它们从 0 到 249 的等级。

我正在使用的服务器有 128 个内核和 256 个线程。 “nprocs”命​​令在我的服务器上给出“128”输出。

我有一个 Fortran 代码,与 250 个处理器相比,128 个处理器的计算时间更短。

所以我有两个问题,

  1. 如果“hello world”与排名一起打印 250 次,这是否意味着我的服务器中有 250 个核心?

  2. 为什么 128 的计算时间比 250 少?为什么将“-np”从 128 增加到 250 不会降低计算速度?

【问题讨论】:

  • 如果您要打印“Hello world”和排名,250 次而不是 128 次,那么它需要更长的时间似乎是很合理的。您正在增加与等级数量成比例的工作量。如果那不是您正在做的事情,我们将需要查看您的程序的更多细节。 (我还建议您尝试通过一个好的教程(等)了解更多关于并行计算的基础知识 - Stack Overflow 不适合入门学习。)
  • 欢迎您,请拨打tour 并阅读How to Ask。请注意,大多数进程实际上并不打印任何内容,它们只是将某些内容发送到某个缓冲区中,并且只有一个进程从该缓冲区中打印内容。该过程将非常忙于来自许多过程的所有打印。没有看到您的代码我们不能说更多,请出示您的实际代码。
  • @francescalus 尚不完全清楚,但我认为 OP 正在将进程数量从 128 个增加到 250 个 - 所以对于每个进程所做的工作是相同的。因此,零阶忽略任何复杂的东西,我希望它会花费相同的时间,假设它真的可以在每个核心上正确支持 2 个线程(我知道非常非常草率)。在现实世界中,我预计这需要更长的时间,尤其是在包括工作启动时间的情况下。
  • @IanBush,我同意这种解释。我的意思是人们不会期望加速(因为工作量至少随着排名数线性增加)。挂钟可能是一样的,但正如你所说,实际上挂钟可能会因为启动、线程成本、IO 串行等因素而增加。

标签: linux fortran mpi


【解决方案1】:
  1. 如果“hello world”与排名一起打印 250 次,这是否意味着我的服务器中有 250 个内核?

不,它没有。您可以在单个 CPU 内核上运行 mpirun -np 250 ./hello,只要您有足够的服务器内存和耐心,由于分时的魔力,它仍然会运行。

  1. 为什么 128 的计算时间比 250 少?为什么将“-np”从 128 增加到 250 不会降低计算速度?

硬件线程利用了这样一个事实,即在许多情况下,单个线程无法充分利用 CPU 管道,因此另一个线程可以同时运行并“填补空白”。这在一个硬件线程正在等待慢速操作(例如内存访问)的情况下效果很好,在这种情况下,第二个硬件线程可以使用 ALU 或 FPU。这称为延迟隐藏。

当两个硬件线程都需要访问单个单元(例如 FPU)时,它就不能很好地工作。在这种情况下,只会增加更多开销,因此计算速度会变慢。

使用 250 个线程使其速度变慢的另一个原因是硬件线程共享核心数据和指令缓存,从而有效地将每个线程的缓存量减少了一半。在所有线程共享一个地址空间的共享内存编程中,这不是一个问题,但对于大多数(几乎所有)MPI 实现来说,情况并非如此,其中每个等级都是具有自己地址空间的单独进程。

还有一个原因可能是内存带宽。如果您的程序正在从 CPU 外部读取数据或向外部写入数据,例如,因为它不完全适合缓存,那么更多的 MPI 等级将需要更高的内存带宽,但 CPU 内存控制器只能提供这么多.您应该尝试只运行 64 个等级的程序 - 也许它会更快。

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 2014-01-08
    • 2018-09-22
    • 2018-06-08
    • 1970-01-01
    • 2017-08-21
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多