2

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

我相信原因是关于 openmp 的某些东西具有任何 openmp 项目都没有的同步开销。

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

谢谢

4

2 回答 2

3

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

于 2013-05-21T09:59:46.587 回答
2

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

#pragma omp parallel for if(nthreads>1)

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

于 2013-05-20T09:19:53.910 回答