仅使用一个 CPU 核心的 GNU Parallel

仅使用一个 CPU 核心的 GNU Parallel

我正在使用 GNU 并行进行一些训练。训练需要大约 30 秒来运行一次迭代,而我需要运行大约 3000 次。训练本身无法并行化(至少需要付出相当大的努力),但是,我使用几个不同的种子运行此训练,所有这些种子可以轻松地在不同的内核上运行。

这就是我使用并行的方式 -

#!/bin/bash
parallel ./train.py config/config.yml _results/ \
--seed {1} \
::: {1..5}

当我运行它时,并行将所有 5 个进程放在同一个核心 (core0) 上,每个进程都有 20% 的 CPU 使用率(使用 htop 检查)。

如果我使用相同的命令运行另一组训练,则会向 core0 添加 5 个进程,现在它们都显示 10% 的 CPU 使用率。

我使用的是 Ubuntu 18.04

Operating System: Ubuntu 18.04.4 LTS
          Kernel: Linux 5.3.0-28-generic

和锐龙 5 3600

processor   : 0
vendor_id   : AuthenticAMD
cpu family  : 23
model       : 113
model name  : AMD Ryzen 5 3600 6-Core Processor
stepping    : 0
microcode   : 0x8701013
cpu MHz     : 3868.329
cache size  : 512 KB
physical id : 0
siblings    : 12
core id     : 0
cpu cores   : 6
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 16
wp      : yes
...

我当前的(非)解决方案是在开始训练后使用任务集将每个种子放在不同的核心上。

答案1

GNU Parallel 不控制在哪个核心上运行,所以我希望它们也能在同一个核心上运行:

bzip2 < /dev/zero >/dev/null &
bzip2 < /dev/zero >/dev/null &
bzip2 < /dev/zero >/dev/null &
bzip2 < /dev/zero >/dev/null &
bzip2 < /dev/zero >/dev/null &

如果是这种情况,则说明某些因素迫使您的 shell 在同一核心上生成所有进程,您可能应该找出导致此情况的原因。

但如果taskset有效,您可以将其作为解决方法:

parallel taskset -c '{=$_=slot()-1=}' train...

相关内容