【发布时间】:2013-05-19 14:36:29
【问题描述】:
相信大家都同意这篇文章的标题。有人可以指出我的原因吗?任何参考书等?我试图找到但没有运气。
我相信原因是 openmp 有一些 openmp 项目没有的同步开销。
希望有人可以进一步扩展原因?
谢谢
【问题讨论】:
-
你能显示SSCCE吗?通常,OpenMP 会增加代码的开销。所以即使你没有线程,你仍然会遇到开销。
标签: c performance openmp
相信大家都同意这篇文章的标题。有人可以指出我的原因吗?任何参考书等?我试图找到但没有运气。
我相信原因是 openmp 有一些 openmp 项目没有的同步开销。
希望有人可以进一步扩展原因?
谢谢
【问题讨论】:
标签: c performance openmp
虽然使用 OpenMP 即使只有一个线程也会在运行时产生一些开销,但更重要的问题可能是编译器必须执行代码转换以生成 OpenMP 代码(特别是将并行区域代码概述为单独的函数[由 gcc 和 icc 完成;PGI 做一些不同的事情......])将影响其他代码优化(如矢量化)。 当部分代码在概述的函数中执行时,编译器在单个函数中允许优化的信息可能会丢失,因此生成的代码可能会更糟。
【讨论】:
正如 Mystical 所解释的,这可能是由于 OpenMP 开销所致。我试图通过这样做来解决这个问题:
#pragma omp parallel for if(nthreads>1)
我认为这只会在 nthreads>1 时使用 OpenMP 开销。但是,至少在 Visual Studio 2012 中,这也有很大的开销。因此,为了正确比较函数的单线程和多线程版本,我定义了两个版本的函数,有和没有 OpenMP pragma。
【讨论】: