首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带变量累加的循环的矢量化

带变量累加的循环的矢量化
EN

Stack Overflow用户
提问于 2020-11-20 22:52:30
回答 1查看 70关注 0票数 0

我有下面的循环,我正在用icc编译

代码语言:javascript
复制
for (int i = 0; i < arrays_size; ++i) {
      total = total + C[i];
}

矢量化报告说这个循环已经被矢量化了,但是我不明白这怎么可能,因为在写依赖之后有一个明显的读取。

报告输出如下:

代码语言:javascript
复制
LOOP BEGIN at loops.cpp(46,5)
      remark #15388: vectorization support: reference C has aligned access   [ loops.cpp(47,7) ]
      remark #15305: vectorization support: vector length 4
      remark #15399: vectorization support: unroll factor set to 8
      remark #15309: vectorization support: normalized vectorization overhead 0.475
      remark #15300: LOOP WAS VECTORIZED
      remark #15448: unmasked aligned unit stride loads: 1
      remark #15475: --- begin vector loop cost summary ---
      remark #15476: scalar loop cost: 5
      remark #15477: vector loop cost: 1.250
      remark #15478: estimated potential speedup: 3.990
      remark #15488: --- end vector loop cost summary ---
      remark #25015: Estimate of max trip count of loop=31250
   LOOP END

有人能解释一下这意味着什么吗?怎么可能把这个循环矢量化呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 23:30:16

根据totalC[i]的类型,您可以利用相加和第一和4或8(或更多)次总计的结合性和交换性。

代码语言:javascript
复制
int subtotal[4] = {0,0,0,0};
for (int i = 0; i < arrays_size; i+=4) {
    for(int k=0; k<4; ++k)
        subtotal[k] += C[i+k];
}
// handle remaining elements of C, if necessary ...
// sum-up sub-totals:
total = (subtotal[0]+subtotal[2]) + (subtotal[1]+subtotal[3]);

这适用于任何整数类型,但ICC默认假设浮点加法也是关联的(gcc和clang为此需要一些-ffast-math子集)。

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

https://stackoverflow.com/questions/64937979

复制
相关文章

相似问题

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