2015-07-18 9 views
10

Myślę, że powinienem zapoznać się z rozszerzeniami SIMD x86. Ale zanim nawet zacząłem, wpadłem w kłopoty. Nie mogę znaleźć dobrego przeglądu, które z nich są nadal aktualne.Czy różne wersje mmx, sse i avx są komplementarne lub supersetne względem siebie?

Architektura x86 zgromadził wiele rozszerzeń matematyka/Multimedia ponad dekady:

  • MMX
  • 3DNow!
  • SSE
  • SSE2
  • SSE3
  • ssse3
  • SSE4
  • AVX
  • AVX2
  • AVX512
  • Czyżbym zapomniał czegoś?

Czy nowsze stanowią superwizje starszych i vice versa? Czy są one komplementarne?

Czy niektóre z nich są przestarzałe? Które z nich są nadal aktualne? Słyszałem odniesienia do "starszej wersji SSE".

Czy niektóre z nich wzajemnie się wykluczają? To znaczy. czy mają te same części sprzętowe?

Których powinienem użyć razem, aby zmaksymalizować wykorzystanie sprzętu na nowoczesnych procesorach Intel/AMD? Ze względu na argument, załóżmy, że mogę znaleźć odpowiednie zastosowania instrukcji ... podgrzewanie mojego domu za pomocą procesora, jeśli nic więcej.

+0

Z góry głowy: żaden nie jest przestarzały; SSE to seria, podobnie jak AVX; mieszanie SSE i AVX nie jest dobrym pomysłem. Jestem pewien, że Wikipedia lub oficjalne dokumenty mogą rozwiązać szczegóły. – Jeff

+2

@Jeff 3DNow! jest przestarzałe – harold

+0

tak, zapomniałeś SSE4a i XOP. –

Odpowiedz

8

Niedawno zaktualizowaliśmy wiki znacznik do SSE, AVX i x86 (i SSE2, avx2). Obejmują wiele z tego. Podsumowanie tl; dr: AVX zwołuje wszystkie poprzednie wersje SSE i dostarcza 3-operandowe wersje tych instrukcji. Również wersje 256b większości modeli FP (AVX) i int (AVX2).

Aby zobaczyć podsumowania różnych wersji SSE, zobacz wikipedia lub bardziej szczegółową odpowiedź knm241.

Tak naprawdę nie myślimy o tym, że SSE jest przestarzałe. Bardziej lubię myśleć o AVX jako nowej i lepszej wersji tych samych starych instrukcji SSE. Wciąż znajdują się one w podręczniku referencyjnym pod ich nazwami innymi niż AVX (na przykład PSHUFB, a nie VPSHUFB). Można mieszać kod AVX i SSE, o ile używasz VZEROUPPER, kiedy jest to konieczne, aby uniknąć problemów z wydajnością podczas mieszania VEX z non -VEX insns (na Intel). Tak więc jest trochę irytacji w rozwiązywaniu przypadków, w których trzeba wywoływać biblioteki, które mogą uruchamiać instrukcje inne niż VEX SSE, lub gdy twój kod używa SSE FP matematyki, ale ma również kod AVX, który uruchamia się tylko wtedy, gdy CPU go obsługuje.

Jeśli kompatybilność z procesorem nie była problemem, wersje instrukcji wektorowych starszych wersji SSE byłyby naprawdę przestarzałe, tak jak MMX jest teraz. AVX/AVX2 jest co najmniej trochę lepszy pod każdym względem, jeśli policzymy wersję 128b kodowaną przez VEX jako wersję AVX, a nie SSE. Czasem nadal używasz rejestrów 128b, ponieważ twoje dane przychodzą tylko w porcjach dużych, ale częściej pracujących z rejestrami 256b, aby wykonać te same operacje na dwa razy więcej danych jednocześnie.

Instrukcje SSE/AVX/x87-FP/integer używają tych samych portów wykonawczych. Nie możesz zrobić więcej równolegle, mieszając je. (z wyjątkiem Haswell, gdzie jeden z 4 portów ALU może obsługiwać tylko insygnie inne niż wektorowe, takie jak GP reg ops i oddziały).

+0

Hmm, knm241 i Peter Cordes, oboje macie bardzo dobre odpowiedzi, które wzajemnie się uzupełniają. Chcesz scalić informacje? Dziękuję wam obu! – snoukkis

+0

Zaznaczę to poprawnie, ponieważ jest krótsze, więc druga odpowiedź będzie nadal widoczna po tym. – snoukkis

+0

Po prostu zamierzam odnieść się do odpowiedzi Knm w drugim akapicie. Chcę, aby moja odpowiedź była jak najkrótsza, więc jest na celu. Lista elementów każdej wersji SSE jest dostępna w innym miejscu. Może nie podsumowano tak dobrze jak odpowiedź knm241. Dodałem akapit o tym, że jeśli CPU compat nie jest problemem, to nigdy nie użyjemy kodowania non-VEX instrukcji wektorowych w nowym kodzie. Myślę, że kodowanie VEX jest czasami o 1 bajt dłuższe, ale zazwyczaj nie. Jedynym powodem, dla którego nie należy unikać 'vzeroupper' podczas wywoływania kodu SSE, nie można rekompilować/ponownie zmontować. –

6

Są komplementarne.

Każde nowe rozszerzenie zestawu instrukcji dodaje nowe instrukcje i ewentualnie nowy model programowania (na przykład nowe rejestry).

Żadne z nich nie są przestarzałe, wycofanie instrukcji jest prawie niemożliwe z powodu kompatybilności. Jednak niektóre opcjonalne rozszerzenia mogą być nieobecne lub usunięte z nowszych modeli (np. FMA4 z AMD), jeśli nie są bardzo rozpowszechnione.
Niektóre z nich są szczątkowe, wszystko, co można zrobić na przykład za pomocą FPU i MMX, można wykonać bardziej wydajnie przy pomocy SSE +.

Nie wykluczają się one wzajemnie w tym sensie, że można z nich korzystać, w końcu są instrukcjami, a nie trybami działania (na przykład tryb rzeczywisty a tryb chroniony).
Jedynym możliwym "konfliktem" jest MMX i FPU, ponieważ dzielą one dolną część tego samego zestawu rejestru, ale mają inny model programowania.
Nowe rejestry wektorowe wzrosły z 128 bit do 256 bitów i do 512 bitów, za każdym razem poprzednie rejestry stały się niską częścią nowszych rejestrów.

Możesz używać ich wszystkich razem, oferują one specyficzne wsparcie sprzętowe i wdrażają proste operacje.

Są jak klocki Lego, ograniczają Cię tylko wyobraźnia (lub wyobraźnia projektantów).


Oto prosta lista rozszerzeń zestawu instrukcji.
tylko niektóre funkcje są wymienione, dla pełnego odniesienia zobaczyć Intel Manual Vol1 z rozdziału 9 do 14.

Zobacz również https://hjlebbink.github.io/x86doc/ do spisu treści tom 2 (Zestaw instrukcji) instrukcji Intela, z listy rozszerzeń która dodała instrukcje do tego ręcznego wpisu.

  • MMX
    Wprowadzenie osiem rejestrów 64-bitowych (MM0 MM7) oraz instrukcje do pracy z ośmiu podpisanych/unsigned bajtów czterech podpisanych/unsigned słowy, dwa podpisane/unsigned dwords.

  • 3DNow!
    Dodaj obsługę argumentu zmiennoprzecinkowego pojedynczej precyzji do MMX. Nieliczne obsługiwane operacje, na przykład dodawanie, odejmowanie, mnożenie.

  • SSE
    Przedstaw osiem/128-bitowe rejestry szesnaście (XMM0-XMM7/15) i wskazówki do pracy z czterema pojedynczej precyzji argumentach zmiennoprzecinkowych. Dodaj również operacje liczb całkowitych na rejestrach MMX. (Część MMX-całkowitą SSE jest czasami nazywany MMXEXT i był realizowany na kilku procesorów non-Intel bez rejestrów XMM i zmiennoprzecinkowej ramach SSE.)

  • SSE2
    prezentuje wskazówki do pracy z 2 operandy zmiennoprzecinkowe o podwójnej precyzji oraz ze spakowanymi liczbami całkowitymi bajtu/słowa/dword/qw w rejestrach 128-bitowych xmm.

  • SSE3
    Dodać kilka zróżnicowanych instrukcji (głównie zmiennoprzecinkowej), w tym szczególnym rodzaju obciążenia aligné (lddqu), który był lepszy na Pentium 4, instrukcji synchronizacji poziomej dodać/sub.

  • ssse3
    Ponownie zróżnicowane zestaw instrukcji, głównie całkowitą. Pierwsze przetasowanie, które bierze swój operand sterujący z rejestru zamiast zakodowanego na stałe (pshufb). Więcej przetwarzania poziomego, przetasowania, pakowania/rozpakowywania, mul + dodaj bajty i kilka wyspecjalizowanych liczb całkowitych dodaj/mul.

  • SSE4 (SSE4.1, SSE4.2)
    dodać wiele instrukcji: Napełnianie W wielu szczelin zapewniając minimalne i maksymalne oraz inne działania wszystkich typów danych całkowita (w szczególności 32-bitowy brakowało liczby całkowitej), gdzie poprzednia liczba całkowita min była dostępna tylko dla niepodpisanych bajtów i podpisana 16-bitowa. Również skalowanie, zaokrąglanie FP, mieszanie, operacja algebry liniowej, przetwarzanie tekstu, porównania. Również niezwiązane z chwilą obciążenie odczytu pamięci wideo lub kopiowanie jej z powrotem do pamięci głównej. (Wcześniej wyłącznie magazynuje NT były dostępne.)

  • AESNI
    Dodaj wsparcie dla przyspieszenia symetrycznego AES szyfrowanie/deszyfrowanie.

  • AVX Dodaj osiem rejestrów 256/szesnaście bitów (YMM0-YMM7/15).
    Obsługa wszystkich poprzednich typów danych zmiennoprzecinkowych. Trzy instrukcje dotyczące operacji.

  • FMA
    Dodaj Fused Multiply Dodaj skorelowane i instrukcje.

  • AVX2
    Dodaj wsparcie dla całkowitych typów danych.

  • AVX512F
    Dodaj osiem/trzydziestu dwóch rejestrów 512 bitów (ZMM0-ZMM7/31) i osiem 64-bitowy rejestr maski (k0-K7). Promuj większość poprzednich instrukcji do 512 bitów. Opcjonalne części instrukcji AVX512 dodają instrukcje dla wykładników & odwrotności (AVX512ER), prefetching rozproszenia/zbierania (AVX512PF), wykrywania konfliktu rozproszonego (AVX512CD), kompresji, rozwijania.

  • IMCI (Intel Xeon Phi)
    Wczesny rozwój AVX512 dla pierwszej generacji Intel Xeon Phi (Knight Corner) koprocesor.

+0

Niezłe wyjaśnienie. Chciałbym również wspomnieć, że w podobny sposób do nakładania się MMX/FP, XMMi jest w rzeczywistości niższą częścią YMMi i że z kolei jest niższą częścią ZMMi. – hayesti

+0

@hayesti, tak. Aktualizuję odpowiedź. –

+2

Nie jestem pewien, czy można powiedzieć, że wszystko, co można zrobić z jednostką FPU, można wykonać przy użyciu narzędzia SSE. Spróbujcie robić 80-bitowe pływaki z SSE ... – Mehrdad

Powiązane problemy