Проблема авто-векторизации цикла Visual Studio 2017 - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь использовать авто-векторизатор 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? Или я пытаюсь сделать что-то, чего не должен делать?

1 Ответ

0 голосов
/ 30 октября 2018

Это просто упущенная возможность оптимизации. Векторизатор VS значительно улучшился с 2012 года, но по-прежнему его не хватает по сравнению с gcc или clang. Имейте в виду, что их компилятор основан на древней кодовой базе, например у них даже не было представления SSA до недавнего времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...