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?

questionAnswers(1)

yourAnswerToTheQuestion