为什么 OpenMP 'simd' 的性能优于 'parallel for simd'?

Why OpenMP 'simd' has better performance than 'parallel for simd'?

我正在开发带有英特尔编译器 OpenMP 4.0 的英特尔 E5(6 核、12 线程)

为什么这段代码 SIMD 编译比并行 SIMD 编译更快?

for (int suppv = 0; suppv < sSize; suppv++) {
  Value *gptr = &grid[gind];
  const Value * cptr = &C[cind];

  #pragma omp simd // vs. #pragma omp parallel for simd
  for (int suppu = 0; suppu < sSize; suppu++)
    gptr[suppu] += d * cptr[suppu];

  gind += gSize;
  cind += sSize;
}

线程越多,速度越慢。


编辑 1: * grid是一个4096*4096的矩阵,数据结构:vector<complex<double>> * C是一个2112*129*129矩阵,数据结构:vector<complex<double>> * gSize = 4096 * sSize = 129.

如果 sSize = 129,正如您在编辑中所做的那样,那么并行化循环的开销不会得到回报。如果您向我们展示顺序实现(无 SIMD)和纯并行实现(即 #pragma omp parallel for 但无 SIMD)的数量,这将更容易确认。

可能发生的情况是,即使是纯并行版本也比顺序版本慢。不仅循环大小减少了,因为你 launch/create 最外层循环的每次迭代都有一个并行区域。

至于 SIMD 版本,这个问题基本上是为此量身定制的:您有一个高度可向量化的内核,它太小而无法在线程之间分配。