【发布时间】:2018-04-06 07:34:26
【问题描述】:
我有一些 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 秒才能运行。
这是什么原因?我过去听过有关“开销”的讨论,但我不确定这是什么意思。
【问题讨论】:
-
我怀疑您有 4 个 HT(超线程)CPU,英特尔以 8 个的价格出售,但实际上是部分共享的,并且当您的负载为 100% CPU-bound 时没有用作核心,您的
sys时间暗示是这样的。 en.m.wikipedia.org/wiki/Hyper-threading
标签: performance optimization parallel-processing gnu-parallel