为什么 GNU 并行会影响脚本速度?

Why does GNU parallel affect script speed?

我有一些 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 秒

这是什么原因?我以前听过关于'overheads'的讨论,但我不确定这到底是什么意思。

发生的事情是你只有一个插槽,里面有 4 个物理内核。 这些是您机器的 真实 内核。 您在 lscpu 的输出中看到的 CPU 总数是使用以下公式计算得出的:#sockets * #cores_per_socket * #threads_per_core。 在你的情况下是 1*4*2=8.

每个内核的线程数是一种 虚拟 CPU,它们并不总是像真正的 CPU 一样运行,特别是对于计算密集型处理(此规范称为 hyperthreading ) . 因此,当您尝试为每个核心压缩两个线程时,它们几乎是串行执行的。

Take a look at this article for more info.