我正在使用带–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中一样)?谢谢。
physcpubind 的选项 numactl的 应该是一个接口了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使用f j键启动并启用“ Last CPU used”字段,然后使用来打开线程显示H。
top
f
j
H