OpenMP与矢量化的比较

ved*_*eda 2 vectorization openmp

给定一个示例函数(示例如下所示),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];
      }
}
Run Code Online (Sandbox Code Playgroud)

我想知道

  1. OpenMP和Vectorization之间的性能是否会有任何差异
  2. 使用一个优于另一个是否有任何优势.
  3. 是否有可能同时使用OpenMP和矢量化.

注意:我没有给出关于不同的SSE版本,处理器/核心数量(在OpenMP中扩展的线程数量)等等...我的问题一般.答案也可以更具体.

Hig*_*ark 5

  1. 是的。
  2. 衡量,不要争论。
  3. 是的。


Hri*_*iev 5

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

综上所述:

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

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

由于矢量化或OpenMP或矢量化+ OpenMP的性能可能取决于硬件,内存带宽,缓存使用等等,因此始终存在"依赖于"这一论点.

关于你的案例功能,它取决于向量的大小.如果它们太小,使用OpenMP将没有任何好处,甚至由于开销导致执行速度变慢.矢量化可能会缩短执行时间.