使用GNU并行在多核上运行并行作业

时间:2013-01-16 18:41:34

标签: parallel-processing gnu multicore

我需要在多核(和多线程)计算机上运行多个作业。我正在使用GNU Parallel utility在核心之间分配作业以加快任务。 要执行的命令在名为“命令”的文件中可用。我使用以下命令来运行GNU Parallel。

cat命令| parallel -j +0

根据此位置的指导 - gnu parallel,此命令应该使用所有核心来运行此任务。我的机器有2个内核,每个内核有2个线程。但系统监视器显示4个CPU(CPU1和CPU2属于core1,CPU3和CPU4属于core2)。 每个作业(模拟)在单个核心上运行大约需要20秒。我使用上面的命令使用这个GNU并行实用程序并行运行了2个作业。我在系统监视器中观察到,如果将2个作业分配给cpu1和cpu2(即相同的核心),则显然没有加速。它们需要大约40秒才能完成,这大约是他们按顺序运行所需的时间。但是,有时该工具会将2个作业分配给CPU1和CPU3或CPU4(这意味着,2个作业分配给2个不同的核心)。在这种情况下,两个工作在20秒内平行完成。

现在,我想知道是否有一种方法可以强制该工具在不同的“核心”上运行,而不是在同一核心上的不同“线程”上运行。任何帮助表示赞赏。 谢谢!

1 个答案:

答案 0 :(得分:1)

GNU Parallel产生进程。它没有决定运行它的核心。你的操作系统就是这样GNU / Linux可以通过让内核在同一物理CPU上产生进程来节省功耗,从而节省功耗:

echo 1 > /sys/devices/system/cpu/sched_mc_power_savings

(见https://lesswatts.org/tips/cpu.php

如果您的计算机设置为省电,则可能就是这种情况。

GNU / Linux还可以控制应该生成进程的核心。使用taskset,您可以使用掩码10101010(bin)= 0xAA告诉GNU / Linux在每个其他核心上生成;这里显示的是128核心机器:

cat commands | taskset 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa parallel -j +0