我有一个双插槽至强E5522主频2.26GHz机(带超线程禁用)运行Ubuntu服务器上支持NUMA Linux内核3.0。 该体系结构布局是每个插槽4个物理核心。 OpenMP应用程序在本机运行,我有以下问题:
是否OpenMP程序利用自动将NUMA机+感知内核上运行时(即线程及其私有数据沿执行保持一个NUMA节点上)? 如果没有,可以做什么?
怎么样NUMA和每个线程专用C ++ STL数据结构?
我有一个双插槽至强E5522主频2.26GHz机(带超线程禁用)运行Ubuntu服务器上支持NUMA Linux内核3.0。 该体系结构布局是每个插槽4个物理核心。 OpenMP应用程序在本机运行,我有以下问题:
是否OpenMP程序利用自动将NUMA机+感知内核上运行时(即线程及其私有数据沿执行保持一个NUMA节点上)? 如果没有,可以做什么?
怎么样NUMA和每个线程专用C ++ STL数据结构?
当前的OpenMP标准定义了布尔环境变量OMP_PROC_BIND
该controlls OpenMP的线程的结合。 如果设置为true
,如
shell$ OMP_PROC_BIND=true OMP_NUM_THREADS=12 ./app.x
那么处理器之间的OpenMP的执行环境应保持不动的线程。 不幸的是没有更多的是谈到这些线程应该如何约束,这就是在OpenMP的语言comittee一个特别工作组,现在解决。 OpenMP的4.0将带着新的管环境变量和条款,将允许指定如何分配线程。 当然,许多OpenMP的实现提供了自己的非标准方法来控制结合 。
不过大多数的OpenMP运行时不支持NUMA。 他们会很乐意分派线程到任何可用的CPU,你就必须确保每个线程只访问数据属于它。 还有在这个方向几点提示:
dynamic
并行调度for
(C / C ++)/ DO
(的Fortran)环路。 for
同一支球队的尺寸和相同数量的迭代块的循环,用static
调度块两个循环的0将线程0,块1执行-由线程1,依此类推。 我的一些同事已经彻底评估不同的OpenMP运行时的NUMA品行,并特地看了到英特尔的执行NUMA认识,但这一条款尚未公布,所以我不能为你提供一个链接。
有一个研究项目,被称为ForestGOMP ,旨在提供一个NUMA感知简易替换为libgomp
。 可能是你应该给它看看。
您也可以检查你让你的记忆位置和访问以正确的方式用新的工具来分析NUMA的应用程序,现在开源的Linux:NUMAPROF: https://memtt.github.io/numaprof/ 。