【问题标题】:I would like to know if there is any way to assign a particular thread in OpenMP to a specific CPU core? [closed]我想知道是否有任何方法可以将 OpenMP 中的特定线程分配给特定的 CPU 内核? [关闭]
【发布时间】:2016-11-15 13:51:15
【问题描述】:

使用 OpenMP,我在不同的线程中划分了一个简单的算法,但执行时间急剧增加。这可能是由于所有线程都在同一个 CPU 内核上运行。我知道,如果我的 CPU 是双核或四核,那么分配的线程数多于 CPU 核数将无济于事。但即使有两个线程,执行时间也在增加。

【问题讨论】:

  • 您可以绑定告诉 OpenMP 不要移动线程的线程,但 OpenMP,至少在我上次查看它时(在 OpenMP 4.0 之前),没有提供将特定线程分配给粒子的方法核。如果你绑定线程,你就会陷入在启动代码时定义的任何拓扑结构中。您必须使用非 OpenMP 函数来说明哪些线程绑定到特定内核。
  • 至少在 Windows 上使用超线程,默认拓扑将前两个线程放在同一个核心上,这显然不理想。我认为 Linux 和 Windows 上的 AMD 模块也会发生同样的事情(第一个模块上的前两个线程)。 AMD 模块实际上只是一个浮点内核。如果您只使用 Intel 和 AMD 的默认线程数,这通常不是问题,因为所有内核都会被填满,但如果您使用更少的线程,那么逻辑处理器的数量可能不会像您预期的那样扩展。
  • 为什么要控制线程数?为什么不直接使用默认值?
  • 整个问题是基于完全没有根据的假设,即您的线程在同一个 CPU 内核上运行。第一步只能是详细展示你是如何得出这个结论的,提供必要的信息来重现或理解这个问题。问题中绝对没有任何内容可以作为起点。这里的所有讨论都是完全假设的。

标签: c multithreading performance parallel-processing openmp


【解决方案1】:

是的,您可以确定哪个 CPU 获得线程

按照 talonmies 的建议,例如使用 Thread Affinity Interface (Linux* and Windows*)。但是,请注意文章中提到的内容:

线程亲和性会对应用程序速度产生显着影响。


由于执行速度变慢,可能有两个主要原因:

1) 如果你的线程数多于你的内核数,那么剩余的线程将等待其他线程,从而减少为串行执行。

话虽如此,假设您有 2 个内核,那么有 4 个线程准备好执行,将导致竞争条件,因为所有这些线程都会竞争资源(即内核),因此其中 2 个将并行执行,但其他两个将不得不等待。

2) 小问题

并行运行并不是免费的。您必须做很多家务,并且通常会协调并行执行。你必须让 OpenMP 发挥作用,操作系统也必须处理更多的线程/进程。

因此,除非您的问题规模足够大,否则您不会看到任何加速(更糟糕的是,您会看到与您的情况一样的减速),因为编排并行执行的开销将主导你的申请。

【讨论】:

  • 是的,英特尔有一个,当然我忘了!感谢@talonmies 的支持和链接。我会更新我的答案。
  • gcc 也是如此。而且我没有对此表示赞同
  • 我完全不同意你的回答。线程绑定在使用 OpenMP 的大多数领域(HPC、工程等)中非常重要,以至于 OpenMP 4.0 引入了 places 的概念,它提供了一种供应商中立的方式来将特定线程固定到特定 CPU .此外,“线程亲和性可以对应用程序速度产生显着影响”通常被理解为由于愚蠢的操作系统调度程序和线程迁移时重新加载缓存的成本而产生的积极影响。
  • 由于缺少重要信息,我已投票结束该问题。我宁愿等待 OP 提供该信息,然后再尝试对此问题发表评论,因为这可能会像使用 clock() 来测量 Linux 上的挂墙时间一样令人尴尬。
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多