Biorąc pod uwagę wygenerowany plik binarny kodowania wideo x264 i pewne niedociągnięcia w wydajności, inżynierowie SUSE opracowali obsługę w pełni zamaskowanej wektoryzacji AVX-512 dla kodu programistycznego GCC 14.
W styczniu inżynier kompilatora SUSe, Jan Hubicka, otworzył ten błąd dotyczący testu porównawczego x264 z pętlą uśredniającą, która nie jest dobrze zoptymalizowana dla AVX-512.
„Test porównawczy x264 ma pętlę uśredniającą dwie tablice znaków bez znaku, która jest wykonywana ze stosunkowo niską liczbą podróży, co nie działa dobrze z naszym wektoryzowanym kodem. W przypadku AVX512 większość czasu spędza się w wariancie bez wektora od czasu średnia liczba iteracji jest zbyt mała, aby osiągnąć kod wektorowy.
…
Dla rozmiarów 12-16 128-bitowa wektoryzacja wygrywa, 20-28 zachowuje się śmiesznie. Jednak wektoryzacja avx512 jest ogromną stratą dla wszystkich rozmiarów do 31 bytes.aocc wydaje się wygrywać dla 16 bajtów.
…
Jednym z problemów jest to, że wykonujemy co najwyżej jedną wektoryzację pętli epilogu, więc z AVX512 wektoryzujemy epilog z AVX2, ale jego epilog pozostaje niezwektoryzowany. Wolałbym zamiast tego użyć w pełni zamaskowanego epilogu przy użyciu AVX512.Rozpocząłem pracę nad w pełni zamaskowaną obsługą wektoryzacji dla AVX512, ale byłem rozproszony.”
Przewiń do przodu prawie sześć miesięcy, kompilator SUSE inżynier Richard Biener przeprowadził wstępną implementację w pełni zamaskowanej wektoryzacji AVX-512 w bazie kodu GNU Compiler Collection, aby pomóc w przypadku testowym x264 i innych mniej niż pełnych przypadkach wektorowych.
“Implementuje to w pełni zamaskowaną wektoryzację lub zamaskowany epilog dla masek w stylu avx512, które wyróżniają się, reprezentując każdy pas za pomocą jednego bitu i używając trybów liczb całkowitych dla maski (oba są bardzo podobne do gcn).
avx512 jest również wyjątkowy, ponieważ nie ma żadnych instrukcji obliczania maski ze skalarnej iv, tak jak sve ma z while_ult. Zamiast tego maski są tworzone przez porównania wektorowe, a kontrola pętli zachowuje skalarną iv (głównie w celu uniknięcia zależności od generowania maski, dostępna jest odpowiednia instrukcja testowania maski).
podobnie jak generowanie kodu rvv preferuje malejące iv, chociaż ivopts psuje rzeczy w niektórych przypadkach, usuwając iv w celu wyeliminowania go za pomocą przyrostowego używanego do generowania adresów.
jeden z motywujących przypadków testowych pochodzi z pr108410, który z kolei jest wyodrębniany z x264, gdzie wektoryzacja dużych rozmiarów pokazuje problemy z małymi pętlami wyzwalającymi. Czas wykonania poprawia się w porównaniu z klasycznym avx512 z epilogami avx2 w przypadku mniej niż 32 iteracji.”
Obsługa w pełni zamaskowanej wektoryzacji AVX-512 wylądowała dziś rano w GCC 14 Git przez to zatwierdzenie.