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.
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. –
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
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. –