我相信每个人都同意这篇文章的标题。有人能指出我的理由吗?任何像书等的参考?我试图找到但没有运气。
我认为原因是openmp具有同步开销,没有openmp项目没有。
希望有人可以更多地扩展原因吗?
由于
答案 0 :(得分:2)
虽然在运行时使用OpenMP即使只有一个线程也有一些开销,但更重要的问题可能是编译器必须执行以生成OpenMP代码的代码转换(特别是将并行区域代码概述为单独的函数[由gcc和icc完成; PGI做了不同的事情...])将影响其他代码优化(如矢量化)。 编译器在单个函数中具有的信息,当部分代码在轮廓函数中执行时,允许优化可能会丢失,因此生成的代码可能更糟。
答案 1 :(得分:0)
正如Mystical所解释的那样,这可能是由于OpenMP开销造成的。我试图通过举例来解决这个问题:
#pragma omp parallel for if(nthreads>1)
我认为如果nthreads> 1,这只会使用OpenMP开销。但是,至少在Visual Studio 2012中,这也有很大的开销。因此,为了正确比较函数的单线程和多线程版本,我定义了两个版本的函数,包括和不使用OpenMP pragma。