首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么向量化对于几乎相同的代码有不同的行为?

为什么向量化对于几乎相同的代码有不同的行为?
EN

Stack Overflow用户
提问于 2015-05-08 21:21:50
回答 1查看 583关注 0票数 13

下面是执行相同操作的空闲函数,但在第一种情况下,循环不是向量化的,而在其他情况下则是矢量化的。为什么会这样呢?

代码语言:javascript
复制
#include <vector>

typedef std::vector<double> Vec;

void update(Vec& a, const Vec& b, double gamma) {
    const size_t K = a.size();
    for (size_t i = 0; i < K; ++i) { // not vectorized
        a[i] = b[i] * gamma - a[i];
    }
}

void update2(Vec& a, const Vec& b, double gamma) {
    for (size_t i = 0; i < a.size(); ++i) { // vectorized
        a[i] = b[i] * gamma - a[i];
    }
}

void update3(Vec& a, size_t K, const Vec& b, double gamma) {
    for (size_t i = 0; i < K; ++i) { // vectorized
        a[i] = b[i] * gamma - a[i];
    }
}

int main(int argc, const char* argv[]) {
    Vec a(argc), b;
    update(a, b, 0.5);
    update2(a, b, 0.5);
    update3(a, a.size(), b, 0.5);
    return 0;
}

编译器(VS2013)的相关消息:

代码语言:javascript
复制
1>  c:\home\dima\trws\trw_s-v1.3\trws\test\vector.cpp(7) : info C5002: loop not vectorized due to reason '1200'
1>  c:\home\dima\trws\trw_s-v1.3\trws\test\vector.cpp(13) : info C5001: loop vectorized
1>  c:\home\dima\trws\trw_s-v1.3\trws\test\vector.cpp(19) : info C5001: loop vectorized

来自@tony的评论

原因1200:“循环包含循环携带的数据依赖关系,防止了矢量化。循环的不同迭代相互干扰,从而使循环矢量化会产生错误的答案,而自动向量器无法向自己证明不存在这种数据依赖。”来源

EN

回答 1

Stack Overflow用户

发布于 2018-03-02 16:15:48

我想这是一些内部编译器实现的问题,比如在什么阶段自动向量器“开始”,以及当时代码的内部表示的状态是什么。当我在MSVC2017上尝试时,它更符合人们的预期。它将update()update3()自动矢量化,但不包括update2(),第14行的原因是501号,记录如下:

归纳变量不是局部的,或者上界不是循环不变的.

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

https://stackoverflow.com/questions/30133053

复制
相关文章

相似问题

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