OpenMP 与向量化的比较

Posted

技术标签:

【中文标题】OpenMP 与向量化的比较【英文标题】:Comparison between OpenMP and Vectorization 【发布时间】:2012-05-09 04:30:25 【问题描述】:

给定一个示例函数(示例如下),for 循环可以使用 OpenMP 进行并行化,也可以使用向量化进行向量化(假设编译器进行向量化)。

示例

void function(float* a, float* b, float* c, int n)

      for(int i = 0; i < n; i++)
      
          c[i] = a[i] * b[i];
      

我想知道

    OpenMP 之间的性能是否会有差异 和矢量化 使用其中一个有什么优势吗? 是否有可能同时使用 OpenMP 和矢量化。

注意:我没有给出关于不同 SSE 版本、处理器/内核数量(随着 OpenMP 中线程数量的增加)等...我的问题是一般性的.答案也可以更具体。

【问题讨论】:

【参考方案1】:

OpenMP 和矢量化不是相互竞争的技术,而是彼此增强。矢量化可以提高具有矢量功能(SSE/3DNow!/Altivec/等)的 CPU 内核的串行性能,从而使每个线程运行得更快,而 OpenMP 可以使用多个可用内核来运行多个线程为了并行解决更大的问题。

总结:

矢量化串行应用程序通常比非矢量化串行应用程序运行得更快; 非向量化 OpenMP 应用程序通常比非向量化串行应用程序运行得更快(如果编写正确且算法允许并行化); 矢量化 OpenMP 应用程序通常比非矢量化 OpenMP 应用程序运行得更快,而非矢量化 OpenMP 应用程序通常比非矢量化串行应用程序运行得更快。

矢量化仅是数据并行(对多个数据项应用相同的操作)并且在可能的最低硬件级别(核心/ALU)上工作,而 OpenMP 可以是数据和/或任务并行,并且是更高级别的抽象级别。

一如既往地存在“它取决于”的论点,因为矢量化或 OpenMP 或矢量化+OpenMP 的性能可能取决于硬件、内存带宽、缓存使用等...

关于你的 case 函数,这取决于向量有多大。如果它们太小,则使用 OpenMP 不会带来任何好处,甚至会因为开销而导致执行速度变慢。矢量化可能会缩短执行时间。

【讨论】:

【参考方案2】:
    是的。 衡量,不要争论。 是的。

【讨论】:

以上是关于OpenMP 与向量化的比较的主要内容,如果未能解决你的问题,请参考以下文章

嵌套循环的 OpenMP SIMD 矢量化

使用 openmp 并行化矩阵乘法并使用 avx2 进行矢量化

使用 Rcpp 和 OpenMP 在 R 中多线程和 SIMD 矢量化 Mandelbrot

使用 SSE 矢量化在 OpenMP 中将内部循环与残差计算并行化

使用 OpenMP 线程重新初始化向量是不是更快?

C ++比较向量,更快的方式