【问题标题】:Bind threads to specific CPU cores using OpenMP使用 OpenMP 将线程绑定到特定 CPU 内核
【发布时间】:2012-12-27 04:58:18
【问题描述】:

我知道 GOMP_CPU_AFFINITY 将线程绑定到特定内核。

但在示例中,他们给出了here,它给出了:

GOMP_CPU_AFFINITY="0 3 2 1"

这里,

thread0 连接到---> cpu0

thread1 连接到---> cpu3

thread2 连接到---> cpu2

thread3 连接到---> cpu1

这很清楚。

但是如何同时将 thread0 设置为 core0 和 core2 呢?它的环境变量“GOMP_CPU_AFFINITY”的值是多少?

【问题讨论】:

    标签: c++ linux parallel-processing cpu openmp


    【解决方案1】:

    这个GOMP reference 可以帮助你。要回答您的具体问题 `GOMP_CPU_AFFINITY="0-2:2 ..." 会这样做 - 这意味着“在任何处理器 0-2 上运行,可以被 2 整除(即 0 和 2)”。

    至少,如果您要问如何让 thread0 在 core0 或 core2 中的任何一个上运行 - 您实际提出的问题的答案是“您不能”,因为线程只能在一个内核上以任何精确的方式运行时刻,所以 Thread0 不能同时在两个内核上运行。

    【讨论】:

      【解决方案2】:

      我猜 CPU 0 和 2 以及 CPU 1 和 3 是同一物理内核的超线程。英特尔的 OpenMP 库允许将每个线程绑定到两个超线程,设置类似于:

      KMP_AFFINITY="granularity=core,compact"
      

      不幸的是,GCC(通过libgomp)和 Sun/Solaris Studio 都不允许一对多或多对多线程到 CPU 的绑定样式。设置 GOMP_CPU_AFFINITY (GCC) 或 SUNW_MP_PROCBIND (Sun/Solaris Studio) 允许每个线程绑定到特定的 CPU,而不是一组 CPU。

      对于不支持类似于英特尔 OpenMP 支持的绑定样式的 OpenMP 运行时,可以改用操作系统调度程序调用来修改每个线程的关联掩码。这会创建不可移植的应用程序,但允许实现一对多的绑定样式。在 Linux 上,必要的调度程序调用是 sched_getaffinity(2)sched_setaffinity(2)

      【讨论】:

      • @MatsPetersson,libgomp的引用没有错,仔细阅读会发现原发帖人提出的将一个线程绑定到两个不同CPU的问题,通过设置@的方式是无法解决的987654328@.
      • 我显然在这里遗漏了一些东西......这是“使超线程不是超线程类型的东西”之一吗?
      • @MatsPetersson,除非 OP 澄清他拥有什么样的 CPU,否则我只能做出有根据的猜测,即这些是超线程。否则,我不知道有任何 OpenMP 运行时允许任意线程到多 CPU 绑定(英特尔例外,它允许将线程绑定到单个内核的所有超线程)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2016-11-15
      • 2023-04-02
      相关资源
      最近更新 更多