【发布时间】:2015-03-15 09:01:59
【问题描述】:
我正在使用英特尔编译器 OpenMP 4.0 开发英特尔 E5(6 核,12 线程)
为什么这段代码 SIMD-ed 比并行 SIMD-ed 更快?
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 times() API 的返回值差异。 (它确实使用挂钟进行并发,我做了检查)
E5 线程 1 SIMD 占用:291.520000 (s)
- E5 线程 2 for-SIMD 占用:1039.220000 (s)
- E5 线程 12 for-SIMD 占用:1684.270000 (s)
【问题讨论】:
-
慢多少?你是怎么测量的?你检查过装配吗?您是否尝试让线程数与内核数相同?
-
sSize有多大?作为grid和C连续,为什么有两个循环(啊,只对C的前缀进行操作,奇怪)。还有什么平行的吗?你在一个小程序中演示这个吗?你的编译器标志是什么,记录的实际时间是多少?
标签: c++ performance concurrency openmp