В приведенном ниже коде почему второй цикл может быть автоматически векторизован, а первый - нет?Как я могу изменить код, чтобы он автоматически векторизовал?gcc говорит:
примечание: не векторизовано: поток управления в цикле.
Я использую gcc 8.2, флаги -O3 -fopt-info-vec-all.Я компилирую для x86-64 avx2.
#include <stdlib.h>
#include <math.h>
void foo(const float * x, const float * y, const int * v, float * vec, float * novec, size_t size) {
size_t i;
float bar;
for (i=0 ; i<size ; ++i){
bar = x[i] - y[i];
novec[i] = v[i] ? bar : NAN;
}
for (i=0 ; i<size ; ++i){
bar = x[i];
vec[i] = v[i] ? bar : NAN;
}
}
Обновление: Это автоматически вводит:
for (i=0 ; i<size ; ++i){
bar = x[i];
novec[i] = v[i] ? bar : NAN;
novec[i] -= y[i];
}
Я все еще хотел бы знать, почему gcc сообщает поток управления для первого цикла.