numactl –physcpubind

我正在使用numactl和–physcpubind选项。 手册上说:

--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)。 例如,在程序执行过程中的某个其他时刻,是否有可能在CPU内核9上运行线程0等等? 即将有CPU线程之间的线程迁移? 或者线程唯一地绑定到CPU核心(如在setup1中)? 谢谢。

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:检查你的线程放置,你可以从头开始,使用f j键启用“Last CPU used”,并用H打开线程显示。