在NUMA节点之间传播OpenMP线程

时间:2018-04-29 19:32:25

标签: c++ c multithreading openmp numa

我在四个NUMA节点本地存储器中有一个矩阵扩展。现在我想打开4个线程,每个线程在一个CPU上对应一个不同的NUMA节点,这样每个线程都可以尽快访问它的部分矩阵。 OpenMP有" proc_bind(spread)"选项,但它将线程放在同一个NUMA节点上,但是在相隔很远的CPU上。

如何强制线程绑定到不同的NUMA节点?

或者,如果那是不可能的:当我在所有节点上使用所有核心(总共256个线程)时,我知道如何获取NUMA节点的ID,但是我无法控制哪个线程获得哪些索引例如在for循环中。如何针对NUMA配置有效地分配我的工作负载?

1 个答案:

答案 0 :(得分:2)

这是我要做的:

  1. 使用numactl -H
  2. 检查哪些核心连接到哪个NUMA节点
  3. 假设例如核心0,1,2和3分别位于您要使用的4个NUMA节点之一上,请设置环境变量OMP_PLACES以将线程绑定到这些核心:export OMP_PLACES="{0},{1},{2},{3}"
  4. 最后使用numactl的本地内存分配策略启动OpenMP二进制文件:numactl -l myBinary
  5. 对于我对你的问题的理解,这应该有用。