2012-11-29 5 views
6

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?

Odpowiedz

4

Jednym ze sposobów, że mogę myśleć jest następująca: post

A1 = _mm256_unpacklo_pd(A,B); 
A2 = _mm256_unpackhi_pd(A,B); 

C = _mm256_permute2f128_pd(A1,A2,0x20); 
D = _mm256_permute2f128_pd(A1,A2,0x31); 

Jeśli ktoś ma lepsze rozwiązanie, proszę poniżej.

+1

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. –