numactl的--physcpubind(numactl --physcpubind)

2019-07-19 08:56发布

我用的是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)? 谢谢。

Answer 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



文章来源: numactl --physcpubind