【问题标题】:Reasons for omp_set_num_threads(1) slower than no openmpomp_set_num_threads(1) 比没有 openmp 慢的原因
【发布时间】:2013-05-19 14:36:29
【问题描述】:

相信大家都同意这篇文章的标题。有人可以指出我的原因吗?任何参考书等?我试图找到但没有运气。

我相信原因是 openmp 有一些 openmp 项目没有的同步开销。

希望有人可以进一步扩展原因?

谢谢

【问题讨论】:

  • 你能显示SSCCE吗?通常,OpenMP 会增加代码的开销。所以即使你没有线程,你仍然会遇到开销。

标签: c performance openmp


【解决方案1】:

虽然使用 OpenMP 即使只有一个线程也会在运行时产生一些开销,但更重要的问题可能是编译器必须执行代码转换以生成 OpenMP 代码(特别是将并行区域代码概述为单独的函数[由 gcc 和 icc 完成;PGI 做一些不同的事情......])将影响其他代码优化(如矢量化)。 当部分代码在概述的函数中执行时,编译器在单个函数中允许优化的信息可能会丢失,因此生成的代码可能会更糟。

【讨论】:

    【解决方案2】:

    正如 Mystical 所解释的,这可能是由于 OpenMP 开销所致。我试图通过这样做来解决这个问题:

    #pragma omp parallel for if(nthreads>1)
    

    我认为这只会在 nthreads>1 时使用 OpenMP 开销。但是,至少在 Visual Studio 2012 中,这也有很大的开销。因此,为了正确比较函数的单线程和多线程版本,我定义了两个版本的函数,有和没有 OpenMP pragma。

    【讨论】:

    • 您不需要定义多个版本的函数。只需在编译器标志中启用或不启用 OpenMP 进行编译。如果不启用 OpenMP,编译器无论如何都会忽略 OpenMP 编译指示...
    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 2015-01-14
    • 2020-07-09
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多