首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMP与NUMA关系?

OpenMP与NUMA关系?
EN

Stack Overflow用户
提问于 2012-08-14 20:04:49
回答 2查看 5.4K关注 0票数 8

我有一个双套接字Xeon E5522 2.26GHZ机器(禁止超线程)在LinuxKern3.0上运行ubuntu服务器,支持NUMA。架构布局是每个套接字4个物理核心。OpenMP应用程序在这台机器上运行,我有以下问题:

  1. 在numa机器+感知内核上运行时,OpenMP程序会自动利用(即线程及其私有数据保存在NUMA节点上)吗?如果没有,还能做些什么?
  2. 那么NUMA和每个线程私有的C++ STL数据结构呢?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-15 19:09:12

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

代码语言:javascript
复制
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逐线程执行,等等。
  • 如果使用OpenMP任务,请尝试初始化任务主体中的数据,因为大多数OpenMP运行时实现任务窃取--空闲线程可以从其他线程的任务队列中窃取任务。
  • 使用NUMA感知的内存分配器.

我的一些同事已经对不同OpenMP运行时的NUMA行为进行了彻底的评估,并专门研究了NUMA对英特尔实现的认识,但是这些文章还没有发表,所以我不能为您提供链接。

有一个名为ForestGOMP的研究项目,旨在为libgomp提供一个具有NUMA意识的接入替代。也许你该看看。

票数 17
EN

Stack Overflow用户

发布于 2018-10-07 11:34:27

您还可以使用一个新的工具来检查内存的放置和访问,该工具可以分析NUMA应用程序,现在还可以为Linux开放源代码: NUMAPROF:https://memtt.github.io/numaprof/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11959906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档