为什么矢量化对于几乎相同的代码表现不同?

时间:2015-05-08 21:21:51

标签: c++ visual-studio vectorization sse auto-vectorization

以下是执行相同操作的自由函数,但在第一种情况下,循环不是矢量化的,但在其他情况下它是。那是为什么?

template = '<html><body><p>{}</p></body></html>'

with open('index.html') as html:
    html.write(template.format(newContent))

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

#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;
}

来自@tony的评论

  

原因1200:“循环包含阻止循环的数据依赖性   矢量。循环的不同迭代会干扰每个循环   其他这样,矢量化循环会产生错误的答案,并且   自动矢量化器无法证明自己没有这样的数据   依赖。“source

1 个答案:

答案 0 :(得分:2)

我想这是一个深层内部编译器实现问题,比如在什么阶段自动向量化器“启动”以及当时代码内部表示的状态是什么。当我尝试使用MSVC2017时,它的效果更符合人们的预期。它会自动矢量化update()update3(),但 update2(),第14行给出501的原因,记录为:

  

归纳变量不是本地的;或上限不是循环不变的。