指定OMP_PROC_BIND时如何指定用于"CLOSE"的物理核心 ID?



我们正试图在一个新的硬件平台上使用OpenMP来优化HPC应用程序。这些应用程序需要精确放置/钉扎其核心,否则性能将减半。目前,我们为用户提供了每个平台的自定义GOMP_CPU_AFFINITY映射,但这很麻烦,因为每个硬件版本的映射都不同,即使是固件版本不同的平台有时也会更改其CoreID物理映射-所有这些都是用户无法实时检测到的。

如果HPC应用程序可以简单地将GOMP_PROC_ BIND设置为"0";关闭";而OpenMP将为给定的平台做正确的事情——但为了实现这一点,硬件供应商需要定义什么";关闭";表示每台机器。我们想这样做,但我们不知道OpenMP是如何/在哪里获得CoreID列表来用于接近、扩散等。(对于各种外部需求,这台机器上的CoreID空间模式对软件编写者来说是完全随机的。(

关于OpenMP在哪里/如何定义OMP_PROC_BIND的CoreID列表,以便我们进行配置,有什么建议吗?如果需要的话,我们可能需要为这个平台定制一个OpenMP版本(修改源代码(,我们对此感到满意。

谢谢大家。:(

  • 杰夫

扩展@VictorEijkhout所说的。。。

你似乎发明了一个我在谷歌(GOMP_PROC_BIND(和OpenMP标准中找不到的令人羡慕的东西(OMP_PROC_BIND(。如果GOMP_PROC_BIND存在,则名称表明它是GNU功能。还要注意的是,CCD_ 4的两个谷歌点击中的一个说";读取设置的代码有问题。设置无效,在运行时被忽略"所以,如果你设置它没有效果并不奇怪!

因此,我将回答OMP_PROC_BIND的更一般的情况。

OpenMP线程与逻辑CPU的绑定显然必须在运行时完成,因为除了ISA之外,编译器对编译代码将在其上运行的硬件一无所知。因此,您需要查看运行时库代码。

我没有看过GNU的libgomp,但在可能的情况下,LLVM的libomp使用hwloc库来探索机器硬件。由于hwloc还包括用于机器探索的其他有用工具(如lstopo(,因此您的工作最好是确保在机器上提供良好的hwloc支持,此时无需深入研究OpenMP运行时。

最新更新