我正在使用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,4,8,9 ./program
即我将运行我的程序与6个线程,我要求他们在cpu核心0,9。 例如,如果在程序的某一时刻线程0-5分配了cpu核心0,9(setup1)。 例如,在程序执行过程中的某个其他时刻,是否有可能在cpu内核9上运行线程0等等? 即将有cpu线程之间的线程迁移? 或者线程唯一地绑定到cpu核心(如在setup1中)? 谢谢。
linux内核模块不自动加载
使用i2c总线访问驱动程序时发生未知的核心转储
检查我的USB设备是否安装了驱动程序
为什么在使用WS_VSCROLL风格时,在我的wndproc中看不到WM_VSCROLL消息?
在Windows中的ReadFile()
MFC窗口的OnFinalMessage相当于?
为什么使用numa_alloc_onnode()分配导致“页面不存在”?
在ofstream :: close()返回后,文件是否保证可以立即读取?
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打开线程显示。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。