【问题标题】:How to distribute a loop to run one iteration per core如何分配循环以在每个核心上运行一次迭代
【发布时间】:2024-04-28 16:15:02
【问题描述】:

我在具有 30 个内核的服务器上的 shell 脚本中运行一个半大型循环。它看起来像下面的那个。我想分发这个循环,让每个核心运行一次迭代:

python sim_fine.py model1 weak a true --> 在核心 1 上,
python sim_fine.py model1 weak b true --> 在核心 2
等等……

我想将 30 个内核中的 20 个用于他的进程。基本上我想要的是迭代不要等待前一个完成,然后再开始下一个。当然,这可能只发生 20 次。我一直在浏览互联网,但找不到有关此主题的任何帮助。

for m in model1 model2;
    do
    for s in weak strong;
        do
        for opt_dict in a b c d;
            do
                python sim_fine.py $m $s $opt_dict true
            done
        done
    done

【问题讨论】:

    标签: shell loops parallel-processing


    【解决方案1】:

    我会为此使用 GNU Parallel,尽管它似乎只产生 16 个工作,而不是您指出的 20 个:

    parallel --dry-run python sim.py ::: model{1,2} ::: weak strong ::: {a..d}
    

    样本输出

    python sim.py model1 weak a
    python sim.py model1 weak b
    python sim.py model1 weak c
    python sim.py model1 weak d
    python sim.py model1 strong a
    python sim.py model1 strong b
    python sim.py model1 strong c
    python sim.py model1 strong d
    python sim.py model2 weak a
    python sim.py model2 weak b
    python sim.py model2 weak c
    python sim.py model2 weak d
    python sim.py model2 strong a
    python sim.py model2 strong b
    python sim.py model2 strong c
    python sim.py model2 strong d
    

    如果看起来不错,请在没有--dry-run 的情况下认真运行它。如果您确实想将并行作业的数量限制为 20,请使用:

    parallel -j 20 ...
    

    如果您运行man parallel,则有许多非常灵活的选项可用于处理日志记录、报告和错误处理。

    我在参数处理方面有点懒惰/简洁,您可以更明确地使用:

    parallel --dry-run python sim.py {1} something {2} somethingelse {3} true ::: model{1,2} ::: weak strong ::: {a..d}
    

    【讨论】:

    • 谢谢马克!!是的,我缩短了循环以减少混乱,然后我设法进行了 20 次以下的迭代。我的错!当我运行它时,我现在会收到一条错误消息:“/bin/bash: sim.py: Permission denied”。知道为什么会这样吗?
    • 对不起,我抄得不好,你要sim_fine.py
    • 哦,这不是因为名称错误。可能是因为缺少“$”。
    • 我解决了这些问题。这是由于我的本地服务器上的一些限制。再次感谢你!感谢您的帮助!