草庐IT

c - numactl --physcpubind

coder 2023-06-18 原文

我使用的是带有 --physcpubind 选项的 numactl。手册说:

--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 上运行,等等? IE。 CPU核之间会有线程迁移吗?或者线程唯一地绑定(bind)到 CPU 内核(如在 setup1 中)?谢谢。

最佳答案

numactl

physcpubind 选项应该是sched_setaffinity 的接口(interface)系统调用,它在进程启动时修改进程的 cpuset(允许的 CPU 集)。每个线程都有自己的 cpuset,但所有线程都将从父进程继承它们的 cpuset 值。

因此,允许线程在 cpuset 的任何 CPU 上运行,允许在 cpuset 的任何 cpu 之间迁移。

任何线程都可以调用 sched_setaffinity 或 pthread_setaffinity_np (特定于 linux 的单线程亲和性变化变体)缩小甚至扩展其 cpuset。

如果您想将线程绑定(bind)到 CPU,请在每个线程中直接使用 sched_setaffinity 或 pthread_setaffinity_np,或者在 OpenMP 的情况下通过 OMP 库设置关联:OpenMP and CPU affinity例如使用命令(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 并使用 f j 键启用“Last CPU used”字段并打开使用 H 显示线程。

关于c - numactl --physcpubind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14720332/

有关c - numactl --physcpubind的更多相关文章

  1. Docker 中的 Mongodb : numactl --interleave=all explanation - 2

    我正在尝试根据https://hub.docker.com/_/mongo/上的官方repo为内存中的MongoDB创建Dockerfile.在dockerfile-entrypoint.sh我遇到过:numa='numactl--interleave=all'if$numatrue&>/dev/null;thenset--$numa"$@"fi基本上,当numactl存在时,它会将numactl--interleave=all添加到原始docker命令中。但是我真的不明白这个NUMA政策。您能否解释一下NUMA的真正含义,以及--interleave=all代表什么?为什么我们需要使

  2. c - numactl --physcpubind - 2

    我使用的是带有--physcpubind选项的numactl。手册说:--physcpubind=cpus,-CcpusOnlyexecuteprocessoncpus.Etc...假设我的NUMA系统有3个NUMA节点,每个节点有4个核心。NUMA节点0的核心编号为0、1、2、3。NUMA节点1有4、5、6、7,NUMA节点2有8、9、10、11。我的问题是假设我按如下方式运行程序:exportOMP_NUM_THREADS=6numactl--physcpubind=0,1,4,5,8,9./program即我将用6个线程运行我的程序,我要求它们在CPU内核0、1、4、5、8、9上

  3. c - numactl --physcpubind - 2

    我使用的是带有--physcpubind选项的numactl。手册说:--physcpubind=cpus,-CcpusOnlyexecuteprocessoncpus.Etc...假设我的NUMA系统有3个NUMA节点,每个节点有4个核心。NUMA节点0的核心编号为0、1、2、3。NUMA节点1有4、5、6、7,NUMA节点2有8、9、10、11。我的问题是假设我按如下方式运行程序:exportOMP_NUM_THREADS=6numactl--physcpubind=0,1,4,5,8,9./program即我将用6个线程运行我的程序,我要求它们在CPU内核0、1、4、5、8、9上

随机推荐