【问题标题】:Why does GNU parallel affect script speed?为什么 GNU 并行会影响脚本速度?
【发布时间】: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


【解决方案1】:

发生的情况是您只有一个带有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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2011-03-30
    • 2013-07-02
    相关资源
    最近更新 更多