Как получить gcc для векторизации кода с использованием кодов операций SSE4.1 pminuq / pminud / etc? - PullRequest
2 голосов
/ 24 сентября 2019

Я использовал отличный godbolt.org, чтобы определить, что gcc делает и не векторизует: но я не могу найти способ заставить его векторизовать функцию min (X, Y) в PMINUQ и т. Д..

Глядя на языковой файл описания машины sse.md в исходном коде gcc, я вижу блок вокруг строк 12355, в котором упоминается p, который выглядит так, как будто он должен выводить PMINUQ и т. Д. Поэтому я не вижу никакой причины, почему компиляция для этого шаблона с -msse4 -msse4.1 не должна просто работать.

Однакоэта часть md также имеет строку "&&" внутри, что, по-видимому, (?) означает, что этот код операции работает только с целевыми объектами в стиле AVX.

Итак, я не могу сказать, является ли этоэто аппаратное ограничение, ошибка компилятора / md, проблема godbolt.org с -msse4.1 или что-то еще полностью.Может кто-нибудь помочь мне сузить это немного?

gcc -msse4 -msse4.1 -msse4.2 -O3 -fopt-info-vec-all

#include <stdint.h>

#define MAX_LOOPS 10000

uint64_t in_array[MAX_LOOPS];
uint64_t shift_array[MAX_LOOPS];

void do_max(uint64_t maxval)
{
    for (int i=0; i<MAX_LOOPS; i++)
        out_array[i] = (in_array[i] < maxval) ? in_array[i] : maxval;
}

godbolt.org говорит мне, что я получаю ...

    pcmpeqq xmm0, xmm1
    pandn   xmm0, xmm2

... когда я надеюсь на это...

    pminuq  xmm0, xmm1

1 Ответ

2 голосов
/ 24 сентября 2019

vpminuq требуется AVX512.(https://www.felixcloutier.com/x86/pminud:pminuq)

SSE4.1 / AVX2 имеет только pminub/w/d. Попробуйте использовать массивы с 32-разрядными элементами.

...