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

时间:2013-05-19 14:36:30

标签: c performance openmp

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

我认为原因是openmp具有同步开销,没有openmp项目没有。

希望有人可以更多地扩展原因吗?

由于

2 个答案:

答案 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。