我有一些Fortran脚本。我使用gfortran
进行编译,然后以time ./a.out
运行。
我的脚本完成,并将运行时输出为
real 0m36.037s
user 0m36.028s
sys 0m0.004s
即。 ~36秒
现在假设我要多次并行运行此脚本。为此我使用GNU Parallel。
使用lscpu
命令告诉我,我有8个CPU,每个核心有2个线程,每个插槽有4个核心。
我创建了表单的文件example.txt
,
time ./a.out
time ./a.out
time ./a.out
time ./a.out
...
继续8行。
然后,我可以在8个内核上并行运行这些,
parallel -j 8 :::: example.txt
在这种情况下,我希望每个脚本的运行时间仍为36秒,总运行时间为~36秒。但实际上,每个脚本的运行时间大约翻了一倍。
如果我改为运行4核而不是8(-j 4
),问题就会消失,每个脚本都会恢复运行36秒。
这是什么原因?我过去曾听说过“间接费用”,但我不确定这是什么意思。
答案 0 :(得分:4)
发生的事情是,您只有一个具有4
物理核心的套接字。
这些是您机器的真正的核心。
您看作lscpu
输出的CPU总数使用以下公式计算:#sockets * #cores_per_socket * #threads_per_socket
。
在您的情况下,它是1*4*2=8
。
每个核心的线程是一种虚拟 CPU,它们并不总是作为真正的CPU执行,特别是对于计算密集型处理(此规范称为hyperthreading)。 因此,当您尝试每个核心挤出两个线程时,它们几乎可以串行执行。