10

我正在使用带有 --physcpubind 选项的 numactl。手册说:

--physcpubind=cpus, -C cpus
Only execute process on cpus. Etc...

假设我有 3 个 NUMA 节点的 NUMA 系统,每个节点都有 4 个内核。NUMA 节点 0 具有 0、1、2、3 作为核心编号。NUMA 节点 1 有 4,5,6,7,NUMA 节点 2 有 8,9,10,11。我的问题是假设我按如下方式运行程序:

export OMP_NUM_THREADS=6
numactl --physcpubind=0,1,4,5,8,9 ./program

即,我将使用 6 个线程运行我的程序,并且我要求它们位于 CPU 内核 0、1、4、5、8、9 上。例如,如果在程序线程 0-5 的某个时间点分配了 CPU 内核 0、1、4、5、8、9 (setup1)。是否有可能在程序执行期间的某个其他时间点,例如,线程 0 可能正在 CPU 核心 9 上运行,等等?即CPU内核之间会有线程迁移吗?或者线程唯一地绑定到 CPU 内核(如 setup1 中)?谢谢。

4

1 回答 1

8

numactl的physcpubind选项应该是sched_setaffinity系统调用的接口,它在进程启动时修改进程的 cpuset(允许的 CPU 集)。每个线程都有自己的cpuset,但所有线程都会从父进程继承它们的cpuset值。

因此,允许线程在来自 cpuset 的任何 CPU 上运行,允许在来自 cpuset 的任何 cpu 之间迁移。

任何线程都可以调用 sched_setaffinity 或pthread_setaffinity_np (Linux 特定的单线程亲和力变化变体)来缩小甚至扩展其 cpuset。

如果要将线程绑定到 CPU,请在每个线程中直接使用 sched_setaffinity 或 pthread_setaffinity_np,或者在通过 OMP 库设置 OpenMP 关联的情况下:OpenMP 和 CPU 关联,例如使用命令 (OpenMP 3.1+)

export OMP_PROC_BIND=true

我猜OMP库会在omp库初始化时从进程的cpuset中以循环方式选择CPU。

对于旧版本的 libgomp - GCC 使用的 OMP 支持库 - 您可以使用以下命令传递允许的 CPU 集:

export GOMP_CPU_AFFINITY=0-1,4-5,8-9

PS:要检查您的线程位置,您可以使用键启动top并启用“上次使用的 CPU”字段,然后使用 .f j打开线程显示H

于 2013-02-07T11:49:39.013 回答