2016-06-23 13 views
11

AVX2 ma wiele dobrych rzeczy. Na przykład ma wiele instrukcji, które są o wiele silniejsze niż ich prekursory. Weź VPERMD: pozwala całkowicie dowolnie transmitować/przetasować/permutować z jednego 256-bitowego wektora wartości 32-bitowych do innego, z permutacją wybieraną w środowisku wykonawczym . Funkcjonalnie przestaje istnieć cała masa starych, starych, rozpakowanych, rozgłoszeniowych, permutacyjnych, shuffle i przesunięć instrukcji.Gdzie jest VPERMB w AVX2?

Fajne ziarna.

Więc gdzie jest VPERMB? Tj. Ta sama instrukcja, ale działająca na elementach o rozmiarze bajta. Lub, jeśli o to chodzi, gdzie jest VPERMW, dla elementów 16-bitowych? Po parokrotnym przeprowadzeniu instalacji x86 jest całkiem jasne, że instrukcja SSE PSHUFB jest w zasadzie jedną z najbardziej użytecznych instrukcji wszechczasów. Może wykonać dowolną kombinację losową, transmisyjną lub bajtowo-losową. Ponadto można go również użyć do 16 równoległych 4-bitowych -> 8-bitowych wyszukiwań tabelowych: .

Niestety, PSHUFB nie został przedłużony, aby być pasmem poprzecznym w AVX2, więc ogranicza się do zachowania wewnątrz linii. Instrukcje VPERM są w stanie przeprowadzić cross shuffle (tak naprawdę "perm" i "shuf" wydają się być synonimami w mnemonikach instrukcji?) - ale wersje 8 i 16-bitowe zostały pominięte?

Nie wydaje się nawet dobrym sposobem na emulację tej instrukcji, podczas gdy można z łatwością emulować tasowania o większej szerokości z mniejszymi szerokościami (często jest to nawet za darmo: potrzebna jest tylko inna maska).

Nie mam wątpliwości, że Intel zdaje sobie sprawę z szerokiego i ciężkiego korzystania z PSHUFB, więc powstaje pytanie, dlaczego wariant bajtu został pominięty w AVX2. Czy operacja jest trudniejsza do wdrożenia w sprzęcie? Czy istnieją ograniczenia kodowania wymuszające jego pominięcie?


Przez wybierane w czasie wykonywania, to znaczy, że maska, która definiuje zachowanie tasowanie pochodzi z rejestru. To sprawia, że ​​instrukcja jest o rząd wielkości bardziej elastyczna niż wcześniejsze warianty, które biorą natychmiastową maskę do shuffle, w taki sam sposób, jak add jest bardziej elastyczna niż lub zmiana zmiennej jest bardziej elastyczna niż natychmiastowa zmiana.

Lub 32 takie wyszukiwania w AVX2.

Starsze instrukcje okazjonalnie są użyteczne, jeśli mają krótsze kodowanie lub unikają ładowania maski z pamięci, ale funkcjonalnie są zastępowane.

+0

s/babble/dabble /? Dobrym określeniem dla "selectable at runtime" jest "variable shuffle". Instrukcje zmiany-przesunięcia (takie jak ['vpsrlvd'] (http://www.felixcloutier.com/x86/VPSRLVD:VPSRLVQ.html)) już używają tej terminologii. –

+0

Tak, * chwalić się *, chociaż od czasu do czasu paplać ma sens. Nie jestem pewien "zmiennej". Widzę, że zmiana jest prawie ortogonalna do kwestii "natychmiastowej lub nie". Problem polegał na tym, że nie mogłeś wystawić innej liczby zmian dla różnych elementów wektorowych. Trochę tak, jakby wektor 'add' pozwalał tylko na dodawanie pojedynczej wartości do wszystkich elementów. To różni się od tego, czy argument można określić tylko jako natychmiastowy. Przyznaję, że zmiana jest nieco wyjątkowa, ponieważ większość z nich nie ma nawet tego problemu, nieco to jest moje wyobrażenie o tym, co Intel rozumie przez "zmienną". – BeeOnRope

+0

Dobra racja, już można mieć liczbę zmian dla wszystkich elementów w low64 z xmm reg. Wciąż myślę, że "zmienne tasowanie" jest natychmiast oczywiste bez wyjaśnienia, biorąc pod uwagę trochę kontekstu. –

Odpowiedz

10

Jestem w 99% pewien, że głównym czynnikiem są koszty tranzystora wdrożenia. Byłoby to bardzo przydatne i jedynym powodem, dla którego nie istnieje, jest to, że koszt wdrożenia musi przeważyć nad znaczną korzyścią.

Problemy z kodowaniem przestrzeni są mało prawdopodobne; przestrzeń kodująca VEX zapewnia DUŻO miejsca. Jak, naprawdę dużo, ponieważ pole reprezentujące kombinację prefiksów nie jest polem bitowym, jest to liczba całkowita z większością nieużywanych wartości.

Zdecydowali się na wdrożenie go dla AVX512VBMI, przy większych rozmiarach elementów dostępnych w AVX512BW i AVX512F. Może zdali sobie sprawę z tego, jak bardzo jest to sucked, aby tego nie robić i postanowili to zrobić.AVX512F zajmuje dużo miejsca/tranzystorów do implementacji, tak bardzo, że Intel zdecydował się nie implementować go nawet w stacjonarnych procesorach stacjonarnych for a couple generations.

(Częścią tego jest to, że obecnie wydaje mi się, że dużo kodu, który może korzystać z zupełnie nowych zestawów instrukcji, jest uruchamiany na znanych serwerach, zamiast rozsyłania w czasie wykonywania do użytku na komputerach klienckich).

Według Wikipedii, AVX512VBMI nie będzie dostępny aż do Cannonlake, ale wtedy będziemy mieć vpermi2b, który wykonuje 64 równoległych wyszukiwań tabel ze stołu 128B (2 wektory zmm)). Skylake Xeon przyniesie tylko vpermi2w i większe rozmiary elementów (AVX512F + AVX512BW).


Jestem pewien, że trzydzieści dwa 32: 1 mukserów są dużo droższe niż osiem 8: 1 mukserów, nawet jeśli 8: 1 mukserów są 4x szerszy. Mogliby go wdrożyć z wieloma etapami tasowania (a nie jednym etapem 32: 1), ponieważ tasowanie linii przejścia ma budżet 3-krotny, aby wykonać swoją pracę. Ale wciąż dużo tranzystorów.

Chciałbym zobaczyć mniej odręczną odpowiedź od kogoś, kto ma doświadczenie w projektowaniu sprzętu. Zbudowałem cyfrowy zegar z chipów licznika TTL na płytce prototypowej (i IIRC, odczytałem licznik z BASICa na TI-99/4A, który był bardzo przestarzały nawet ~ 20 lat temu), ale o to chodzi.


Jest dość oczywiste, że SSE PSHUFB instrukcja jest dość dużo jednymi z najbardziej przydatnych wskazówek wszechczasów.

Yup. Była to pierwsza zmienna-shuffle, z maską kontrolną z rejestru zamiast natychmiastowego. Wyszukanie maski shuffle z LUT shuffle masek na podstawie wyniku może zrobić szalone potężne rzeczy. @stgatilov's IPv4 dotted-quad -> int converter to jeden z moich ulubionych przykładów niesamowitych sztuczek SIMD.

+0

W połowie twojej odpowiedzi, zamierzałem powiedzieć "OK, jasne", ale co powiedziałby facet od sprzętu? - ale to właśnie powiedziałeś :). Wyobrażam sobie, że MUXy pobierają dużo tranzystorów, ale ponieważ PSHUFB już tam jest, w rzeczywistości macie już 32x 16: 1 MUX. Wygląda więc na to, że wykonuję dodatkowe, jednobarwne wyszukiwanie, a mieszanka powinna być dość łatwa w budżecie na 3 cykle. Większość maszyn z poprzecznym torem jest prawdopodobnie również tam ze względu na istniejące tasowanie poprzeczne. Moje prawdziwe doświadczenie w projektowaniu sprzętu komputerowego jest jednak na równi z twoim. – BeeOnRope

+1

O vpermi2b, kiedyś pomyślałem, że ta wspaniała instrukcja pojawi się wkrótce w AVX512F, ale teraz wydaje się, że nie dostaniemy jej aż do AVX512VBMI.Nie mam pojęcia, kiedy to rozszerzenie się pojawi. Niektóre słabsze formy pojawiają się jednak w rozszerzeniach F i BW. – BeeOnRope

+0

@BeeOnRope: do cholery, też tęskniłem za tym faktem. Wikipedia mówi planowane dla Cannonlake. Myślałem, że to w AVX512BW, w Skylake Purley. Ale masz rację, a nawet 'vpermb' to AVX512VBMI. Nadal jestem rozczarowany, że rdzenie SKL marki Xeon nie mają AVX512, na co liczyłem. To tylko o wiele droższe Xeony, które go wesprą, co zasysa na niedrogi domowy pulpit :( –