2012-11-29 24 views
6

Trong SSE, nếu tôi có một thanh ghi 128-bit chứa 4 nổi tứctương đương của SSE unpacklo_ps/unpackhi_ps trong AVX (cho đôi)

A = a b c d ('a','b','c','d' are floats and 'A' is a 128-bit SSE register) 

B = e f g h 

sau đó nếu tôi muốn

C = a e b f 

tôi chỉ đơn giản có thể làm:

C = _mm_unpacklo_ps(A,B); 

Tương tự như vậy nếu tôi muốn

D = c g d h 

tôi có thể làm:

D = _mm_unpackhi_ps(A,B); 

Nếu tôi có một đăng ký AVX chứa đôi, là nó có thể làm tương tự với một chỉ dẫn duy nhất?

Dựa trên cách các nội tại hoạt động, tôi biết rằng tôi không thể sử dụng _mm256_unpacklo_pd(), _mm256_shuffle_pd(), _mm256_permute2f128_pd() hoặc _mm256_blend_pd(). Có bất kỳ hướng dẫn nào ngoài những hướng dẫn này mà tôi có thể sử dụng hoặc tôi có phải sử dụng kết hợp các hướng dẫn ở trên không?

Trả lời

4

Một cách mà tôi có thể nghĩ ra như sau: bài

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); 

Nếu ai đã có một giải pháp tốt hơn, hãy làm dưới đây.

+1

Tôi không nghĩ bạn sẽ làm tốt hơn thế. Vì bạn muốn các giá trị vượt qua ranh giới 128 bit trong quá trình này, tôi nghĩ bạn sẽ phải sử dụng một trong các hàm hoán vị 128 bit. Đó chỉ là một trong những hạn chế của AVX. AVX2, được hỗ trợ trong bộ vi xử lý x86 sắp tới của Haswell, linh hoạt hơn một chút, vì nó sẽ hỗ trợ các phép hoán vị bất cứ nơi nào, nhưng tôi vẫn không chắc liệu nó có mang lại một chuỗi lệnh ngắn hơn hay không. –

Các vấn đề liên quan