在多核处理器上使用GNU Parallel运行并行作业

3
我需要在一个多核(和多线程)机器上运行多个作业。我使用GNU Parallel 实用程序来分发任务以加速执行速度。 要执行的命令可在名为 "commands" 的文件中找到。我使用以下命令来运行 GNU Parallel。
cat commands | 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秒钟内并行完成。
现在,我想知道是否有一种方式可以强制该工具在不同的“核心”上运行而不是在同一核心上的不同“线程”。任何帮助都将不胜感激。 谢谢!

你使用的是哪个操作系统?你如何确定作业正在运行的核心? - Ole Tange
我在一台Intel i3(双核)机器上运行Ubuntu。每个核心有2个线程(我使用lscpu命令查找此信息)。我使用Gnome系统监视器来查看作业正在哪些核心上运行。 - Nanditha
1个回答

1
GNU Parallel 会生成进程。它不会决定在哪个 CPU 核心上运行。这由您的操作系统决定。GNU/Linux 使得进程可以在同一物理 CPU 上生成,以节省电力。
echo 1 > /sys/devices/system/cpu/sched_mc_power_savings

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

如果您的计算机已设置为节能模式,则可能是这种情况。

GNU / Linux 还可以控制进程应在哪些核心上生成。使用 taskset,您可以告诉 GNU / Linux 使用掩码 10101010(bin)= 0xAA 在每个其他核心上生成;此处显示了适用于 128 核机器的示例:

cat commands | taskset 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa parallel -j +0

谢谢!我试过了。最初我认为如果我禁用其他所有核心,我将强制作业在两个不同的虚拟核心上运行(假设有一个2核心、2线程/核心的机器)。然而,我意识到,如果我使用taskset禁用每个逻辑核心,总执行时间会大大增加。所以,我想我会让它们按原样运行。感谢您的回复。 - Nanditha
我在这里完全不了解,请您详细说明一下。我有一个程序在4核服务器上运行需要20秒(请参见下面的详细信息)。我通过设置-j1来实现。那么我应该期望什么呢?在纯并发情况下,我使用4个核心的-j4与-j1相同的时间(20秒)运行?根据我的实验结果,-j1需要20秒(1个核心),-j2需要23秒(2个核心),-j3需要27秒(3个核心),-j4需要33.5秒(4个核心),也就是说“并发惩罚”约为15%,随着并发程度的提高而增加。架构:x86_64;CPU操作模式:32位、64位;CPU数量:4;每个核心的线程数:2;每个插槽的核心数:2;插槽数:1;NUMA节点数:1;步进:4。 - Aaron Soellinger
@AaronSoellinger 提出一个新问题。请包含一个最小可复现代码示例(MCVE)。 - Ole Tange

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