2013-03-10 12 views
7

Architektura AMD64 programisty Manual Volume 1: Application Programming strona 226 mówi dotyczące instrukcje SSE:64 SSE typy danych

Procesor nie sprawdza typ danych argumentów instrukcji przed wykonaniem instrukcji. To sprawdza je tylko w miejscu wykonania. Na przykład, jeśli procesor wykonuje arytmetyczną instrukcję , która wymaga operandów o podwójnej precyzji, ale jest dostarczany z operandami o pojedynczej dokładności, za pomocą instrukcji MOVx , procesor najpierw przekształci operandy z pojedynczej precyzji na podwójną precyzję przed wykonaniem operacji arytmetycznej. , a wynik będzie poprawny. Jednak wymagana konwersja może spowodować obniżenie wydajności.

Nie rozumiem tego; Wydaje mi się, że rejestry mmm zawierają po prostu 256 bitów, które każda instrukcja interpretuje zgodnie z oczekiwanymi operandami, to zależy od ciebie, aby upewnić się, że są właściwe typy, a w opisanym scenariuszu procesor pracowałby z pełną prędkością i cicho zła odpowiedź.

Czego mi brakuje?

+1

Być może odnoszą się one do faktu, że jeśli użyjesz 'movaps' do załadowania podwojenia, to i tak zadziała? To trochę dziwne, jak to uczynili, zwłaszcza, że ​​nie ma konwersji, ale nie widzę, co jeszcze mogą oznaczać .. – harold

Odpowiedz

1

Intel® 64 and IA-32 Architectures Optimization Reference Manual § 5,1 mówi coś podobnego o mieszanie integer/PL „typy danych” (ale co ciekawe nie single i debel):

Podczas pisania kodu SIMD, który działa zarówno dla całkowitej i danych zmiennoprzecinkowych, użyj podzestawu instrukcji konwersji SIMD lub instrukcji ładowania/zapisywania, aby upewnić się, że operandy wejściowe w rejestrach XMM zawierają typy danych, które zostały poprawnie zdefiniowane , aby dopasować instrukcję.

Sekwencje kodu zawierające użycie typu krzyżowego dają taki sam wynik w różnych implementacjach, ale powodują znaczne obniżenie wydajności. Korzystanie z instrukcji SSE/SSE2/SSE3/SSSE3/SSE44.1 do działania na niezgodnych z typem danych SIMD w rejestrze XMM jest zdecydowanie odradzane.

Intel® 64 and IA-32 Architectures Software Developer’s Manual jest simularly mylący:

SSE i SSE2 rozszerzenia definiują wpisane operacji o typie danych pakowane i skalarnych zmiennoprzecinkowych oraz o 128-bitowe SIMD typów danych całkowitą, ale IA-32 procesorów nie wymuszaj tego pisania na poziomie architektury. Oni tylko wymuszają to na poziomie mikroarchitektonicznym.

...

Pentium 4 i Intel Xeon wykonać te instrukcje bez generowania wyjątku nieważne argumentu operacji (#UD) i przyniesie oczekiwane rezultaty w rejestrze XMM0 (czyli wysokie i niskie 64 -bity każdego rejestru będą traktowane jako wartość zmiennoprzecinkowa o podwójnej precyzji, a procesor będzie działał na nich odpowiednio).

...

w poniższym przykładzie: XORPS lub PXOR można stosować zamiast XORPD i uzyskuje się taki sam poprawny wynik.Jednak z powodu niedopasowania typu między typem danych operandowych i typem danych instrukcji, kara opóźnienia będzie wynosić z powodu implementacji instrukcji na poziomie mikroarchitektury.

Kary opóźnień mogą również zostać poniesione przy użyciu instrukcji przenoszenia niewłaściwego typu. Na przykład, MOVAPS i MOVAPD można użyć zarówno do przeniesienia spakowanego pojedynczej precyzji operand z pamięci do rejestru XMM. Jednakże, jeśli użyto parametru MOVAPD, zostanie nałożona kara za opóźnienie, gdy poprawnie wpisana instrukcja spróbuje użyć danych w rejestrze w postaci .

Należy pamiętać, że kary te nie powstają w przypadku przenoszenia danych z rejestrów XMM do pamięci.

I naprawdę nie mają pojęcia, co rozumie przez „oni tylko egzekwować je na poziomie mikrostruktury” oprócz tego, że proponuje różne „typy danych” są traktowane inaczej przez μ łuku. Mam kilka domysłów:

  • AIUI, x86 rdzenie zwykle używają register renaming ze względu na brak rejestrów. Być może wewnętrznie używają różnych rejestrów dla liczb całkowitych/pojedynczych/podwójnych argumentów, dzięki czemu mogą znajdować się bliżej odpowiednich jednostek wektorowych.
  • Wydaje się również możliwe, że numery FP są reprezentowane wewnętrznie przy użyciu innego formatu (np. Przy użyciu większego wykładnika, aby pozbyć się denormów) i konwertowane na bity kanoniczne tylko wtedy, gdy jest to konieczne.
  • Procesory używają "" lub "blokowania", aby jednostki wykonawcze nie musiały czekać na zapisanie danych w rejestrze, zanim będą mogły być użyte przez kolejne instrukcje, zwykle zapisując cykl lub dwa. To nie może się zdarzyć między liczbą całkowitą a jednostkami FP.
+0

Zgodnie z odpowiedzią na http://stackoverflow.com/questions/6678073/ difference-between-movdqa-and-movaps-x86-instructions wygląda na to, że jest to poprawne. – rwallace