Łą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.
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
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
Uwaga także, że 'vxorpd' to AVX, podczas gdy' vpxor' to AVX2 (nie to, że wpływa to na wydajność oczywiście, tylko kompatybilność). –