OpenMP:请勿使用超线程核心(半个num_threads()具有超线程)

cns*_*nst 5 c++ openmp hyperthreading cpu-cores g++-4.7

g ++ 4.7中的OpenMP(并行使用)效率不是很高吗?在使用5倍CPU的情况下为2.5倍,我确定程序的性能在使用默认值的情况下在500%CPU左右的11s和13s之间变化(通常总是高于12s,有时甚至慢于13.4s)#pragma omp parallel for,并且OpenMP加速仅为在g++-4.7 -O3 -fopenmp4核8线程Xeon上,在5倍CPU w /时为2.5倍。

我尝试使用schedule(static) num_threads(4),并注意到我的程序始终在大约320%的CPU上以11.5s至11.7s(总是低于12s)完成操作,例如,运行更一致,并且使用了更少的资源(即使最好的运行速度比运行速度慢了半秒)具有超线程的罕见异常值)。

是否有任何简单的OpenMP方式可检测超线程并减少num_threads()到CPU内核的实际数量?

(有一个类似的问题,由于使用OpenMP的超线程导致的性能不佳:如何将线程绑定到内核,但是在我的测试中,我发现仅将线程从8个减少到4个就已经可以用g ++-4.7做到这一点。在Debian 7 Wheezy和Xeon E3-1240v3上,因此,这个问题仅仅是关于减少num_threads()内核数。)

Cra*_*tey 2

如果您在 Linux 下运行 [也假设 x86 架构],您可以查看/proc/cpuinfo. 有两个字段cpu coressiblings。第一个是[实际]核心的数量,后者是超线程的数量。(例如,在我的系统上,对于我的四核超线程机器,它们分别为 4 和 8)。

因为 Linux 可以检测到这一点 [以及来自 Zulan 评论中的链接],所以该信息也可以从 x86cpuid指令中获得。

不管怎样,还有一个环境变量:OMP_NUM_THREADS与启动器/包装器脚本结合使用可能更容易

您可能需要考虑的一件事是,超过一定数量的线程,您可能会使内存总线饱和,并且线程[或核心]的增加不会提高性能,而且实际上可能会降低性能。

从这个问题:使用 CAS 原子地增加两个整数,有一个来自 CppCon 2015 的视频演讲的链接,该视频演讲分为两部分:https://www.youtube.com/watch ?v=lVBvHbJsg5Y和https://www.youtube .com/watch?v=1obZeHnAwz4

每个大约 1.5 小时,但是,在我看来,非常值得。

在演讲中,演讲者[做了很多多线程/多核优化]说,根据他的经验,内存总线/系统在大约四个线程后往往会饱和。