2

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

我想知道

  1. OpenMP 和 Vectorization 在性能上是否会有差异
  2. 使用一个比另一个有什么优势。
  3. 是否有可能同时使用 OpenMP 和矢量化。

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

4

2 回答 2

5

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

总之:

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

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

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

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

于 2012-05-09T12:02:14.410 回答
4
  1. 是的。
  2. 衡量,不要争论。
  3. 是的。
于 2012-05-09T06:05:52.463 回答