我有一台双路 Xeon E5522 2.26GHZ 机器(禁用超线程),在支持 NUMA 的 Linux 内核 3.0 上运行 ubuntu 服务器。架构布局为每个插槽 4 个物理核心。
OpenMP 应用程序在这台机器上运行,我有以下问题:
在 NUMA 机器 + 感知内核上运行时,OpenMP 程序是否会自动利用这一优势(即线程及其私有数据在执行过程中保留在 numa 节点上)?如果没有,可以做什么?
NUMA 和每线程私有 C++ STL 数据结构怎么样?
当前的 OpenMP 标准定义了一个布尔环境变量OMP_PROC_BIND
控制 OpenMP 线程的绑定。如果设置为true
, e.g.
shell$ OMP_PROC_BIND=true OMP_NUM_THREADS=12 ./app.x
那么 OpenMP 执行环境不应在处理器之间移动线程。不幸的是,关于如何绑定这些线程没有更多的说明,这正是 OpenMP 语言委员会中的一个特殊工作组目前正在解决的问题。 OpenMP 4.0 将附带新的环境变量和子句,允许您指定如何分配线程。当然,许多 OpenMP 实现都提供自己的控制结合的非标准方法.
大多数 OpenMP 运行时仍然不支持 NUMA。他们会很乐意将线程分派到任何可用的 CPU,并且您必须确保每个线程仅访问属于它的数据。在这个方向上有一些一般性的提示:
- 不使用
dynamic
并行调度for
(C/C++)/DO
(Fortran)循环。
- 尝试在稍后将使用它的同一线程中初始化数据。如果您运行两个单独的并行
for
具有相同团队规模和相同数量迭代块的循环,其中static
调度两个循环的块 0 将由线程 0 执行,块 1 由线程 1 执行,依此类推。
- 如果使用 OpenMP 任务,请尝试初始化任务主体中的数据,因为大多数 OpenMP 运行时都实现任务窃取 - 空闲线程可以从其他线程的任务队列中窃取任务。
- 使用支持 NUMA 的内存分配器。
我的一些同事已经彻底评估了不同 OpenMP 运行时的 NUMA 行为,并专门研究了 Intel 实现的 NUMA 感知,但文章尚未发布,因此我无法为您提供链接。
有一个研究项目,叫做森林GOMP,旨在提供 NUMA 感知的直接替代品libgomp
。也许你应该看一下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)