c - numactl --physcpubind

标签 c linux openmp numa

我使用的是带有 --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/

相关文章:

linux - 如何使用 for 循环从命令行获取值

java - 在 Java 中使用 smartcardio 在 Raspberry Pi 上使用多个 NFC ACR122U 设备

c - 用于大型密集矩阵乘法的循环平铺/阻塞

if-statement - OpenMP 任务 if 或 Final

c - 在套接字监听服务器之间建立连接

c - 如何在不直接连接到它的其他库中调用库函数?

c++ - 如何将Visual Studio宏值转换为预处理器指令?

java - 从 Java 执行 screen 命令

ios - 并行 GCD block 中的每线程数据? (翻译自 OpenMP)

c - 什么是堆栈,为什么 malloc 防止它溢出?