【问题标题】:How to specify the physical CoreIDs used for "CLOSE" when specifying OMP_PROC_BIND?指定 OMP_PROC_BIND 时如何指定用于“CLOSE”的物理 CoreID?
【发布时间】:2022-10-05 16:05:48
【问题描述】:

我们正在尝试在新的硬件平台上使用 OpenMP 优化 HPC 应用程序。这些应用程序需要精确放置/固定其内核,否则性能会下降一半。目前,我们为用户提供了针对每个平台的自定义 GOMP_CPU_AFFINITY 映射,但这很麻烦,因为每个硬件版本都不一样,甚至不同固件版本的平台有时会更改其 CoreID 物理映射——这对用户来说是不可能的即时检测。

如果 HPC 应用程序可以简单地将 GOMP_PROC_BIND 设置为 \"close\" 并且 OpenMP 会为给定平台做正确的事情,那将是一个很大的帮助 - 但要使这成为可能,硬件供应商需要定义什么是 \"close\"意味着每台机器。我们希望这样做,但我们无法确定 OpenMP 如何/在何处获取 CoreID 列表以用于关闭、展开等操作。(对于各种外部需求,这台机器上的 CoreID 空间模式会完全显示随机给软件作者。)

关于 OpenMP 在哪里/如何定义 OMP_PROC_BIND 的 CoreID 列表以便我们可以配置它们的任何建议?如果需要,我们可能需要为该平台提供自定义版本的 OpenMP(带有更改的源代码),我们对此感到满意。

感谢大家。 :)

  • 杰夫
  • 你是说你的编译器没有在你的平台上正确解释OMP_PROC_BIND=close?还有一种语法有很多花括号,我觉得无法理解,但对你来说它可能会有所回报。您还可以深入研究 hwloc 来管理放置。

标签: openmp porting pinning


【解决方案1】:

扩展@VictorEijkhout 所说的内容......

您似乎发明了一种令人羡慕的东西,我在 Google (GOMP_PROC_BIND) 和令人羡慕的 OpenMP 标准 (OMP_PROC_BIND) 中找不到任何地方。如果GOMP_PROC_BIND 存在,则名称表明它是 GNU 功能。还要注意,GOMP_PROC_BIND 的两个谷歌点击之一说“读取设置的代码有问题。设置无效并在运行时被忽略。”因此,如果您设置它没有效果也就不足为奇了!

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

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

我没有看过 GNU 的 libgomp,但是 LLVM 的 libomp 尽可能使用the hwloc library 来探索机器硬件。由于 hwloc 还包括其他用于机器探索的有用工具(例如 lstopo),因此您最好将精力投入到确保机器上良好的 hwloc 支持上,此时无需深入研究 OpenMP 运行时。

【讨论】:

    最近更新 更多