Почему векторизация ведет себя по-разному почти для одного и того же кода?

Вот свободные функции, которые делают то же самое, но в первом случае цикл не векторизован, но в других случаях это так. Это почему?

#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):

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: «Цикл содержит переносимые в петлю зависимости данных, которые предотвращают
векторизации. Различные итерации цикла мешают каждому
другой такой, что векторизация цикла будет давать неправильные ответы, и
авто-векторизатор не может доказать себе, что таких данных нет
зависимости «. источник

13

Решение

Я предполагаю, что это какая-то глубоко внутренняя проблема реализации компилятора, например, на каком этапе «векторизация» «включилась» и каково состояние внутреннего представления кода в то время. Когда я попробовал MSVC2017, он работал в соответствии с ожиданиями. Это авто-векторизация update() а также update3(), но не update2()с указанием причины 501 для строки 14, которая задокументирована как:

Индукционная переменная не является локальной; или верхняя граница не является инвариантной к петле.

2

Другие решения


По вопросам рекламы [email protected]