我用的是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(设置1)。 是否有可能在程序执行线程0中一些其他的点可以在CPU核心9例如运行,等等? 即会不会有CPU内核之间的线程迁移? 或线程唯一获得绑定到CPU核心(如设置1)? 谢谢。
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直接或OpenMP中的情况下,通过OMP库设置亲和力: 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
。