2014-11-15 43 views
9

Według do Intel Intrinsics Guide,Różnica pomiędzy AVX instrukcji vxorpd i vpxor

  • vxorpd ymm, ymm, ymm: Oblicz bitowe XOR wypełnionej podwójnej precyzji (64 bitów), elementy zmiennoprzecinkowych w A i B, i przechowywać wyniki w dst.
  • vpxor ymm, ymm, ymm: Oblicz bitowe XOR 256 bitów (reprezentujących dane liczbowe) w aib, i zapisz wynik w dst.

Jaka jest różnica między tymi dwoma? Wydaje mi się, że obie instrukcje wykonałyby bitowy XOR na wszystkich 256 bitach rejestrów ymm. Czy jest jakaś kara za wydajność, jeśli używam vxorpd dla danych całkowitych (i na odwrót)?

+8

Na obecnych procesorach Intel jednostka SIMD ma dwie domeny: INT i FLOAT. Występuje kara pieniężna za przeniesienie danych z jednego do drugiego. Przepustowość jest również wyższa w domenie INT. – Mysticial

+2

Dzięki Mysticial! [Ta odpowiedź] (http://stackoverflow.com/a/4998071/250827) mówi, że Intel Sandy Bridge i późniejsze procesory mają "opóźnienie bypassu" z 0-1 cykli, gdy używasz instrukcji wektorowych z nieprawidłowym typem danych – netvope

+4

Uwaga także, że 'vxorpd' to AVX, podczas gdy' vpxor' to AVX2 (nie to, że wpływa to na wydajność oczywiście, tylko kompatybilność). –

Odpowiedz

8

Łącząc kilka uwag do wiadomości odpowiedź:

innych niż wydajność, mają identyczny problem (chyba nawet z argumentem pamięci: sam brak wymagań wyrównania dla wszystkich instrukcji AVX).

Na Nehalem na Broadwell, (V)PXOR może działać na dowolnym z 3 portów wykonawczych ALU, p0/p1/p5. (V)XORPS/D można uruchomić tylko na p5.

Niektóre procesory mają "opóźnienie bypassu" między integer i FP "domains". Agner Fog's microarch docs Powiedz, że na SnB/IvB opóźnienie bypassu jest czasami zerowe. na przykład podczas używania "złego" typu operacji losowej lub boolowskiej. W przypadku Haswella jego przykłady pokazują, że orps nie ma dodatkowego opóźnienia, gdy jest używany na wyniku instrukcji liczb całkowitych, ale ten por ma dodatkowy 1 zegar opóźnienia, gdy jest używany na wyniku addps.

W Skylake, booleany FP mogą być uruchamiane na dowolnym porcie, ale opóźnienie obejścia zależy od tego, na którym porcie się znajdują. (Zobacz podręcznik optymalizacji Intela dla tabeli). Port5 nie ma opóźnienia między operacjami matematycznymi FP, ale port 0 lub port 1. Ponieważ jednostki FMA znajdują się na portach 0 i 1, etap emisji uop zwykle przypisuje wartości binarne do portu 5 w ciężkim kodzie FP, ponieważ widzi, że wiele układów uśpionych jest ustawionych w kolejce dla p0/p1, ale p5 jest mniej zajęte. (How are x86 uops scheduled, exactly?).

Zalecam, aby nie martwić się o to. Nastrój na Haswella i Skylake będzie dobrze. Lub po prostu zawsze używaj VPXOR na danych całkowitych i VXORPS na danych FP, a Skylake będzie dobrze (ale Haswell może nie).


AMD Bulldozer/Piledriver/Steamroller nie ma "FP" wersja ops logicznych. (patrz str. 182 podręcznika mikroarchitekta Agner Fog.) Istnieje opóźnienie w przekazywaniu danych pomiędzy jednostkami wykonawczymi (1 cykl dla ivec-> fp lub fp-> ivec, 10 cykli dla int-> ivec (eax ->xmm0), 8 cykli dla ivec-> int. (8, 10 na spychaczu 4, 5 na walec dla movd/pinsrw/pextrw)) W każdym razie, nie można uniknąć opóźnienia by-passu na AMD za pomocą odpowiedniego wpisu boolowskiego. XORPS bierze jeden mniej bajt do kodowania niż PXOR lub XORPD (wersja non-VEX. VEX wersje wszystko wziąć 4 bajty).

W każdym razie opóźnienia bypass to tylko dodatkowy latencji, nie zmniejsza się przepustowość. Jeśli te operacje nie są częścią najdłuższego łańcucha dep w twojej wewnętrznej pętli lub możesz przeplatać dwie iteracje równolegle (więc masz wiele łańcuchów zależności działających jednorazowo dla wykonania poza kolejnością), wtedy PXOR może być droga do przebycia.

Na procesorach Intela przed Skylake, instrukcje pakowane w liczby całkowite mogą zawsze działać na większej liczbie portów niż ich odpowiedniki zmiennoprzecinkowe, więc wolą liczby całkowite.