Я пытаюсь использовать авто-векторизатор Visual C ++ 2017 для векторизации следующего цикла (/ arch: AVX2):
void fun(char* data, char* threshold, char* output, int64_t len)
{
// Assumes output filled with 0
for (int64_t c = 0, mm = len; c < mm; ++c)
{
output[c] = (data[c] < threshold[c])
? (threshold[c] - data[c])
: output[c];
}
}
Этот код используется для сравнения 2 массивов (данных и порога) и сохранения их разницы в выходных данных, если данные <порог, в противном случае - 0. </p>
Этот цикл не векторизован автоматически:
информация C5002: цикл не векторизован по причине '1100'
Значение: цикл содержит поток управления - например, «если» или «?».
Хорошо, я понял, мне нужно переписать мой цикл, чтобы я удалил поток управления или упростил его для компилятора. НО:
У GCC нет проблем с его векторизацией
Visual Studio принимает векторизацию, если я изменю код таким образом:
код:
for (int64_t c = 0, mm = len; c < mm; ++c)
{
output[c] = (data[c] < threshold[c])
? (char)(threshold[c] - data[c])
: output[c];
}
Почему это (char) приведение что-то изменит для авто-векторизатора Visual Studio? Это ошибка авто-векторизатора или я что-то упустил?
Более того, если я изменю тип выходного массива с char на int, я не смогу заставить Visual Studio больше векторизовать мой цикл, тогда как GCC делает:
void fun(char* data, char* threshold, int* output, int64_t len)
{
// Assumes output filled with 0
for (int64_t c = 0, mm = len; c < mm; ++c)
{
output[c] = (data[c] < threshold[c])
? (int)(threshold[c] - data[c])
: output[c];
}
}
Отсутствует ли векторизация Visual Studio 2017 по сравнению с GCC? Или я пытаюсь сделать что-то, чего не должен делать?