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 并行化矩阵乘法并使用 avx2 进行矢量化
使用 Rcpp 和 OpenMP 在 R 中多线程和 SIMD 矢量化 Mandelbrot