gpt4 book ai didi

c++ - 为什么 OpenMP 'simd' 比 'parallel for simd' 有更好的性能?

转载 作者:太空宇宙 更新时间:2023-11-04 16:10:41 28 4
gpt4 key购买 nike

我正在开发带有英特尔编译器 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>> * C2112*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 = 129,就像您在编辑中所做的那样,那么并行化循环的开销不会得到返回。如果您向我们展示顺序实现(无 SIMD)和纯并行实现(即使用 #pragma omp parallel for 但没有 SIMD)的数量,这将更容易确认。

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

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

关于c++ - 为什么 OpenMP 'simd' 比 'parallel for simd' 有更好的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29058941/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com