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