omp_set_num_threads(1)的原因比没有openmp慢

我相信每个人都同意这篇文章的标题。 有人能指出我的理由吗? 任何像书等的引用? 我试图找到但没有运气。

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

希望有人可以扩大原因吗?

谢谢

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

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

#pragma omp parallel for if(nthreads>1) 

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