首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numactl --physcpubind

numactl --physcpubind
EN

Stack Overflow用户
提问于 2013-02-06 09:55:29
回答 1查看 11K关注 0票数 10

我使用numactl和--physcpubind选项。手册上写着:

代码语言:javascript
复制
--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。我的问题是,假设我按如下方式运行程序:

代码语言:javascript
复制
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中一样)?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-07 19:49:39

numactlphyscpubind选项应该是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+)

代码语言:javascript
复制
export OMP_PROC_BIND=true

我猜测在OMP库初始化时,omp库将以循环方式从进程的cpuset中选择CPU。

对于GCC使用的旧版本libgomp - OMP支持库-您可以使用以下命令传递允许的CPU集:

代码语言:javascript
复制
export GOMP_CPU_AFFINITY=0-1,4-5,8-9

PS:要检查线程的位置,您可以启动top,并使用f j键启用"Last CPU used“字段,并使用H打开线程显示。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14720332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档