为什么 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.
- 编译器标志:icpc -march=native -std=c++11 -qopt-report-phase=vec -qopt-report=3 -O2 -openmp
定时器:使用POSIX次()API的return值差异。 (它确实使用挂钟进行并发,我做了检查)
E5线程1 SIMD占用:291.520000(s)
- E5线程2 for-SIMD占用:1039.220000(s)
- E5线程12 for-SIMD占用:1684.270000(s)
如果 sSize
= 129,正如您在编辑中所做的那样,那么并行化循环的开销不会得到回报。如果您向我们展示顺序实现(无 SIMD)和纯并行实现(即 #pragma omp parallel for
但无 SIMD)的数量,这将更容易确认。
可能发生的情况是,即使是纯并行版本也比顺序版本慢。不仅循环大小减少了,因为你 launch/create 最外层循环的每次迭代都有一个并行区域。
至于 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.
- 编译器标志:icpc -march=native -std=c++11 -qopt-report-phase=vec -qopt-report=3 -O2 -openmp
定时器:使用POSIX次()API的return值差异。 (它确实使用挂钟进行并发,我做了检查)
E5线程1 SIMD占用:291.520000(s)
- E5线程2 for-SIMD占用:1039.220000(s)
- E5线程12 for-SIMD占用:1684.270000(s)
如果 sSize
= 129,正如您在编辑中所做的那样,那么并行化循环的开销不会得到回报。如果您向我们展示顺序实现(无 SIMD)和纯并行实现(即 #pragma omp parallel for
但无 SIMD)的数量,这将更容易确认。
可能发生的情况是,即使是纯并行版本也比顺序版本慢。不仅循环大小减少了,因为你 launch/create 最外层循环的每次迭代都有一个并行区域。
至于 SIMD 版本,这个问题基本上是为此量身定制的:您有一个高度可向量化的内核,它太小而无法在线程之间分配。