首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么OpenMP 'simd‘比’simd并行‘有更好的性能?

为什么OpenMP 'simd‘比’simd并行‘有更好的性能?
EN

Stack Overflow用户
提问于 2015-03-15 09:01:59
回答 1查看 1.8K关注 0票数 0

我正在开发一个英特尔E5 (6个核心,12个线程)和英特尔编译器OpenMP 4.0。

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

代码语言:javascript
复制
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-期=vec -qopt-report=3 -O2 -openmp
  • Timer:使用POSIX倍()API的返回值diff。(它确实使用挂钟进行并发,我做了检查)
  • E5线程1 SIMD需要: 291.520000 (s)
  • E5线程2用于-SIMD: 1039.220000 (s)
  • E5线程12 for-SIMD需要: 1684.270000 (s)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-15 17:41:48

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

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

至于SIMD版本,这个问题基本上是针对这一点而量身定做的:您有一个高度可矢量化的内核,该内核太小,无法在线程之间分发。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29058941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档