Pomijanie opóźnień podczas przełączania domen jednostek wykonawczych
Próbuję zrozumieć możliwe opóźnienia omijania przy przełączaniu domen jednostek wykonawczych.
Na przykład następujące dwa wiersze kodu dają dokładnie ten sam wynik.
_mm_add_ps(x, _mm_castsi128_ps(_mm_slli_si128(_mm_castps_si128(x), 8)));
_mm_add_ps(x, _mm_shuffle_ps(_mm_setzero_ps(), x, 0x40));
Której linii kodu lepiej użyć?
Wyjście zespołu dla pierwszego wiersza daje:
vpslldq xmm1, xmm0, 8
vaddps xmm0, xmm1, xmm0
Wyjście zespołu dla drugiej linii daje:
vshufps xmm1, xmm0, XMMWORD PTR [rcx], 64 ; 00000040H
vaddps xmm2, xmm1, XMMWORD PTR [rcx]
Teraz, jeśli spojrzę na mikroarchitekturę Agnera Fogapodręcznik podaje przykład na stronie 112, w którym używa się liczb całkowitych (pshufd) w odniesieniu do wartości zmiennoprzecinkowych w porównaniu z użyciem losowego mieszania (shufps) w wartościach pływakowych. Przełączanie domen dodaje 4 dodatkowe cykle zegara, więc rozwiązanie wykorzystujące shufps jest lepsze.
Pierwszy wiersz kodu, który umieściłem na liście_mm_slli_si128
musi przełączać domeny między wektorami całkowitymi i pływakowymi. Drugi używa_mm_shuffle_ps
pozostaje w tej samej domenie. Czy to nie oznacza, że druga linia kodu jest lepszym rozwiązaniem?