W SSE, jeśli mam rejestr 128-bitową zawierającą 4 pływaki tjOdpowiednik SSE unpacklo_ps/unpackhi_ps w AVX (dla podwójna)
A = a b c d ('a','b','c','d' are floats and 'A' is a 128-bit SSE register)
i
B = e f g h
następnie jeśli chcę
C = a e b f
mogę po prostu zrobić:
C = _mm_unpacklo_ps(A,B);
Podobnie jeśli chcę
D = c g d h
mogę zrobić:
D = _mm_unpackhi_ps(A,B);
Jeśli mam rejestr AVX zawierający podwójne, czy jest możliwe, aby zrobić to samo z pojedynczej instrukcji?
oparciu o jak działają te intrinsics, wiem, że nie mogę używać _mm256_unpacklo_pd()
, _mm256_shuffle_pd()
, _mm256_permute2f128_pd()
lub _mm256_blend_pd()
. Czy istnieją inne instrukcje oprócz tych, z których mogę skorzystać lub czy muszę stosować kombinację powyższych instrukcji?
Nie sądzę, że zamierzasz zrobić o wiele lepiej. Ponieważ chcesz, aby wartości przekraczały 128-bitową granicę w procesie, myślę, że będziesz musiał użyć jednej z 128-bitowych funkcji permutacji. To tylko jeden z ograniczeń AVX. AVX2, który jest obsługiwany w nadchodzącej rodzinie procesorów x86 firmy Haswell, jest nieco bardziej elastyczny, ponieważ będzie obsługiwał operacje permutacji w dowolnym miejscu, ale wciąż nie jestem pewien, czy dostarczy krótszą sekwencję instrukcji. –