为什么 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 ) .
因此,当您尝试为每个核心压缩两个线程时,它们几乎是串行执行的。
我有一些 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
) 上改为 运行,问题就会消失,并且每个脚本恢复到 运行.
这是什么原因?我以前听过关于'overheads'的讨论,但我不确定这到底是什么意思。
发生的事情是你只有一个插槽,里面有 4
个物理内核。
这些是您机器的 真实 内核。
您在 lscpu
的输出中看到的 CPU 总数是使用以下公式计算得出的:#sockets * #cores_per_socket * #threads_per_core
。
在你的情况下是 1*4*2=8
.
每个内核的线程数是一种 虚拟 CPU,它们并不总是像真正的 CPU 一样运行,特别是对于计算密集型处理(此规范称为 hyperthreading ) . 因此,当您尝试为每个核心压缩两个线程时,它们几乎是串行执行的。