我使用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)。是否可能在程序执行期间的某个其它点,线程0可能例如在CPU核心9上运行,等等?也就是说,CPU核心之间是否会有线程迁移?或者线程唯一地绑定到CPU核心(就像在setup1中一样)?谢谢。
发布于 2013-02-07 19:49:39
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 and CPU affinity,例如使用命令(OpenMP 3.1+)
export OMP_PROC_BIND=true我猜测在OMP库初始化时,omp库将以循环方式从进程的cpuset中选择CPU。
对于GCC使用的旧版本libgomp - OMP支持库-您可以使用以下命令传递允许的CPU集:
export GOMP_CPU_AFFINITY=0-1,4-5,8-9PS:要检查线程的位置,您可以启动top,并使用f j键启用"Last CPU used“字段,并使用H打开线程显示。
https://stackoverflow.com/questions/14720332
复制相似问题