我正在使用带有--physcpubind选项的numactl。手册说:
--physcpubind=cpus, -C cpus
Only execute process on cpus. Etc...
假设我的NUMA系统有3个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中)?感谢。
答案 0 :(得分:5)
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 and CPU affinity,例如: with command(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
并使用f
j
键启用“上次使用CPU”字段,并使用H
打开主题显示。