GCC Автоматическая векторизация потока управления в цикле - PullRequest
0 голосов
/ 08 ноября 2018

В приведенном ниже коде почему второй цикл может быть автоматически векторизован, а первый - нет?Как я могу изменить код, чтобы он автоматически векторизовал?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 сообщает поток управления для первого цикла.

1 Ответ

0 голосов
/ 09 ноября 2018

clang автоматически векторизует даже первый цикл, а gcc8.2 - нет. (https://godbolt.org/z/cnlwuO)

gcc векторизуется с -ffast-math. Возможно, его беспокоит сохранение статуса флага исключения FP из вычитания?

-fno-trapping-math достаточно для gcc для автоматической векторизации (без остатка того, что устанавливает -ffast-math), поэтому, очевидно, его беспокоит исключение FP . (https://godbolt.org/z/804ykV). Я думаю, что он слишком осторожен, потому что источник C вычисляет bar каждый раз, независимо от того, используется он или нет.

gcc автоматически векторизует простые циклы FP a[i] = b[i]+c[i] без математических опций FP.

...