【问题标题】:OpenMP and NUMA relation?OpenMP 和 NUMA 的关系?
【发布时间】:2012-08-11 04:38:48
【问题描述】:

我有一台双路 Xeon E5522 2.26GHZ 机器(禁用超线程)在支持 NUMA 的 linux 内核 3.0 上运行 ubuntu 服务器。架构布局是每个插槽 4 个物理内核。 OpenMP 应用程序在这台机器上运行,我有以下问题:

  1. 在 NUMA 机器 + 感知内核上运行时,OpenMP 程序是否会自动利用(即线程及其私有数据在执行过程中保存在 numa 节点上)?如果不行,怎么办?

  2. NUMA 和每线程私有 C++ STL 数据结构怎么样?

【问题讨论】:

  • 请在“在 NUMA 机器上运行时的优势”中定义您所指的优势类型。 OpenMP 目前不支持 NUMA,但 OpenMP 4.0 可能会带来改进线程绑定的规定。
  • 我更新了问题,主要是你指出的。 “任务集”呢?绑定线程以使每个线程的私有数据保持在本地是否有帮助?

标签: c++ parallel-processing openmp numa smp


【解决方案1】:

当前的 OpenMP 标准定义了一个布尔环境变量 OMP_PROC_BIND,用于控制 OpenMP 线程的绑定。如果设置为true,例如

shell$ OMP_PROC_BIND=true OMP_NUM_THREADS=12 ./app.x

那么 OpenMP 执行环境不应该在处理器之间移动线程。不幸的是,关于这些线程应该如何绑定没有更多的说明,而这正是 OpenMP 语言委员会的一个特殊工作组目前正在解决的问题。 OpenMP 4.0 将附带新的环境变量和子句,允许人们指定如何分配线程。当然,许多 OpenMP 实现都提供了自己的non-standard methods to control binding

大多数 OpenMP 运行时仍然不支持 NUMA。他们很乐意将线程分派给任何可用的 CPU,您必须确保每个线程只访问属于它的数据。这个方向有一些一般性的提示:

  • 不要将 dynamic 调度用于并行 for (C/C++) / DO (Fortran) 循环。
  • 尝试在稍后将使用它的同一线程中初始化数据。如果您运行两个单独的并行 for 循环,具有相同的团队大小和相同数量的迭代块,static 调度两个循环的块 0 将由线程 0 执行,块 1 - 由线程 1 执行,依此类推.
  • 如果使用 OpenMP 任务,请尝试初始化任务主体中的数据,因为大多数 OpenMP 运行时都实现了任务窃取 - 空闲线程可以从其他线程的任务队列中窃取任务。
  • 使用支持 NUMA 的内存分配器。

我的一些同事已经彻底评估了不同 OpenMP 运行时的 NUMA 行为,并专门研究了英特尔实施的 NUMA 意识,但这些文章尚未发表,因此我无法为您提供链接。

有一个名为ForestGOMP 的研究项目,旨在为libgomp 提供一个支持NUMA 的替代品。也许你应该看看。

【讨论】:

  • 非常有用的提示,谢谢。至于你最后的提示; “object m = new object(arg);”的情况会发生什么C++ 中的对象分配器,是否有与 C 的 tcmalloc 等价的?
  • tcmalloc 同时支持 C 和 C++。至于 C++ 的new 操作符,可以使用放置语法将对象放入内存中,之前由tcmalloc 分配,或者依靠tcmalloc 通过预加载替换标准的malloc() 调用(因为new 是技术上是malloc 的包装器。
  • 感谢 Hristo,tcmalloc 预加载 + 任务集有助于在同一个套接字中扩展应用程序,但是当我开始使用第二个套接字的额外内核时(没有任务集,让 openMP 和操作系统处理线程绑定) 加速并没有提高,甚至可能比使用一个套接字更糟。在这种情况下,我可以(1)等待 4.0 版或(2)放弃 OpenMP 并使用 ptrheads,但我不确定第二个选项是否真的能让我解决 NUMA 感知问题,我必须对此进行调查
  • 嗯,tcmalloc numa 知道吗?
  • @Amos, vanilla tcmalloc 不支持 NUMA。 AMD 有一个修改版本,但源代码似乎不再可用。
【解决方案2】:

您还可以使用新工具来分析 NUMA 应用程序并且现在是 Linux 的开源工具:NUMAPROF:https://memtt.github.io/numaprof/,检查您的内存放置和访问是否正确。

【讨论】:

    猜你喜欢
    • 2014-09-17
    • 2017-07-11
    • 2015-04-29
    • 2017-04-29
    • 2014-03-14
    • 2014-03-02
    • 1970-01-01
    • 2016-09-21
    • 2017-08-31
    相关资源
    最近更新 更多