使用GNU Parallel并行化多线程命令

3

我刚刚写了一个涉及多线程的Python脚本,就像这样:

    python myScript.py -cpu_n 5 -i input_file

为了运行针对我的数百个输入文件的命令,我正在生成每一个命令的命令列表(commands.list):

    python myScript.py -cpu_n 5 -i input_file1
    python myScript.py -cpu_n 5 -i input_file2
    python myScript.py -cpu_n 5 -i input_file3
    ...

我正在尝试使用命令“parallel”和三台不同机器的10个CPU来安排它们的时间表:

   parallel -S 10/$server1 -S 10/$server2 -S 10/$server3 < commands.list

我的问题是:使用parallel命令时,每台服务器最多可以使用多少个CPU?是5*10=50还是只有10个CPU?


没有任何代码很难说。 - Klaus D.
首先,要注意区分CPU核心,一个单独的CPU可能有8个或更多的核心。其次,你需要注意作业核心 - 你可以创建一个作业,在不同的时间在不同的核心上执行 - 想想“CPU/核心亲和力”。一个作业在它的生命周期中理论上可以在10个CPU中的每一个上运行。 - Mark Setchell
如果commands.list非常简单,您可以让GNU Parallel生成它:parallel python myScript.py -cpu_n 5 -i ::: input_file*; 如果命令非常复杂,请使用bash函数:https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Calling-Bash-functions - Ole Tange
1个回答

2

来自man parallel

   --jobs N
   -j N
   --max-procs N
   -P N     Number of jobslots on each machine. Run up to N
            jobs in parallel.  0 means as many as possible.
            Default is 100% which will run one job per CPU
            core on each machine.


   -S
   [@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]
   :
            GNU parallel will determine the number of CPU
            cores on the remote computers and run the number
            of jobs as specified by -j.  If the number ncpu
            is given GNU parallel will use this number for
            number of CPU cores on the host. Normally ncpu
            will not be needed.

您的命令将在每个服务器上并行运行最多10个作业。

不清楚每个命令是否会使用5个CPU核心。如果每个命令使用5个核心,则每个服务器将使用50个核心,在这种情况下,我建议您不要使用ncpu/server语法,而是使用:

parallel -j 20% -S $server1,$server2,$server3 < commands.list

这样,您可以混合具有不同核心数量的服务器,GNU Parallel将并行启动其中的1/5。

我同意应该包括百分比。有趣的是,我刚刚在小规模上尝试了一下:使用 2 个 CPU 的 Python 脚本和一个并行命令,分别在三台服务器上使用 2 个 CPU。结果是每台服务器只提供了 2 个 CPU,而不是 2*2 个 CPU。 - Ezekiel Kuo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接