2012-06-20 24 views

Trả lời

21

này nên làm những gì bạn muốn:

__m128 a = _mm_set_ps(1,2,3,4); 
__m128 b = _mm_set_ps(5,6,7,8); 

__m256 c = _mm256_castps128_ps256(a); 
c = _mm256_insertf128_ps(c,b,1); 

Nếu thứ tự ngược lại với những gì bạn muốn, sau đó chỉ cần chuyển ab.


Các nội tại của lãi suất là _mm256_insertf128_ps mà sẽ cho phép bạn chèn một 128-bit đăng ký vào một trong hai thấp hơn hoặc nửa trên của một 256-bit AVX đăng ký:

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/compiler_c/intref_cls/common/intref_avx_insertf128_ps.htm

Gia đình hoàn toàn họ là ở đây:

+1

Một số phiên bản của Visual Studio (chắc chắn năm 2010, có thể là một số phiên bản sau này) có lỗi trong việc xử lý _mm256_castps128_ps256, vì vậy, mã này có thể gặp sự cố. Xem http://connect.microsoft.com/VisualStudio/feedback/details/653771/mm256-castps128-ps256-does-unaligned-read. Nếu bạn cần mã của bạn để làm việc trên những trình biên dịch, bạn sẽ cần phải sử dụng các giải pháp được cung cấp bởi user1584773 thay thế nó bằng một chèn. – peastman

+0

Lưu ý rằng kết quả này trong '__m256 {4, 3, 2, 1, 8, 7, 6, 5}' thay vì '__m256 {1, 2, 3, 4, 5, 6, 7, 8}'. Tôi nghĩ rằng OP muốn sử dụng '_mm_setr_ps' thay vì' _mm_set_ps'. – plasmacel

3

Ngay cả cái này sẽ làm việc:

__m128 a = _mm_set_ps(1,2,3,4); 
__m128 b = _mm_set_ps(5,6,7,8); 

__m256 c = _mm256_insertf128_ps(c,a,0); 
c = _mm256_insertf128_ps(c,b,1); 

Bạn sẽ nhận được một cảnh báo như c không được khởi tạo nhưng bạn có thể bỏ qua nó và nếu bạn đang tìm kiếm màn trình diễn giải pháp này sẽ sử dụng chu kỳ đồng hồ ít hơn sau đó là chu kỳ đồng hồ khác.

+1

Bạn có chắc chắn rằng điều này nhanh hơn giải pháp được đề xuất cho Mystical của tôi không? Theo như tôi biết castps128_ps256 là miễn phí, phải không? Hơn nữa, ứng dụng của tôi rất nhiều lợi ích từ việc sử dụng diễn viên thay vì chèn (cùng đi để trích xuất). – user1829358

2

cũng có thể sử dụng nội hoán:

__m128 a = _mm_set_ps(1,2,3,4); 
__m128 b = _mm_set_ps(5,6,7,8); 
__m256 c = _mm256_permute2f128_ps(_mm256_castps128_ps256(a), _mm256_castps128_ps256(b), 0x20); 

Tôi không biết đó là cách nhanh hơn.