【发布时间】:2023-04-03 19:29:01
【问题描述】:
在Is OpenMP (parallel for) in g++ 4.7 not very efficient? 2.5x at 5x CPU 中,我确定在使用默认的#pragma omp parallel for 时,我的程序的性能在大约 500% CPU 的情况下在 11 秒和 13 秒之间变化(通常总是在 12 秒以上,有时慢到 13.4 秒),并且在 4 核 8 线程 Xeon 上,使用 5x CPU w/g++-4.7 -O3 -fopenmp,OpenMP 速度仅提高 2.5 倍。
我尝试使用schedule(static) num_threads(4),并注意到我的程序总是在大约 320% CPU 的情况下在 11.5 秒到 11.7 秒(总是低于 12 秒)内完成,例如,运行更一致,并且使用更少的资源(即使运行最好比使用超线程的罕见异常值慢半秒)。
是否有任何简单的 OpenMP 方式来检测超线程,并将 num_threads() 减少到实际 CPU 内核数?
(有一个类似的问题,Poor performance due to hyper-threading with OpenMP: how to bind threads to cores,但在我的测试中,我发现在 Debian 7 wheezy 和 Xeon E3-1240v3 上使用 g++-4.7 仅仅从 8 个线程减少到 4 个线程就可以完成这项工作,所以,这个问题只是关于将num_threads() 减少到核心数量。)
【问题讨论】:
-
不,没有简单的方法可以全自动完成。但是有stackoverflow.com/q/2901694/620382 +
omp_set_num_threads。如果可行,我再次建议手动控制每个系统上的线程配置。 -
为什么这个问题被否决了?!
标签: c++ openmp hyperthreading cpu-cores g++-4.7