2012-02-06 36 views
11

Tôi muốn chuyển đổi một mảng các số ngắn chưa ký sang nổi bằng SSE. Giả sửSSE: chuyển đổi số nguyên ngắn thành phao

__m128i xVal;  // Has 8 16-bit unsigned integers 
__m128 y1, y2; // 2 xmm registers for 8 float values 

Tôi muốn 4 uint16 đầu tiên trong y1 & tiếp theo 4 uint16 trong y2. Cần biết sse nội tại nào để sử dụng.

Trả lời

17

Bạn cần phải đầu tiên giải nén vector của bạn quần short unsigned 8 x 16 bit thành hai vectơ ints unsigned 32 bit, sau đó chuyển đổi mỗi một trong các vectơ nổi:

__m128i xlo = _mm_unpacklo_epi16(x, _mm_set1_epi16(0)); 
__m128i xhi = _mm_unpackhi_epi16(x, _mm_set1_epi16(0)); 
__m128 ylo = _mm_cvtepi32_ps(xlo); 
__m128 yhi = _mm_cvtepi32_ps(xhi); 
+0

cảm ơn .. công việc này – krishnaraj

+0

đó là những gì tôi sẽ làm với ngoại trừ việc tôi ' d sử dụng một _mm_setzero_si128(), thay vì hai _mm_set1_epi16. – Magnus

+0

@Magnus: Tôi nghĩ bạn sẽ thấy rằng mã được tạo ra giống nhau, ít nhất là với các trình biên dịch tốt nhất. –

6

tôi sẽ đề nghị sử dụng một chút phiên bản khác nhau:

static const __m128i magicInt = _mm_set1_epi16(0x4B00); 
static const __m128 magicFloat = _mm_set1_ps(8388608.0f); 

__m128i xlo = _mm_unpacklo_epi16(x, magicInt); 
__m128i xhi = _mm_unpackhi_epi16(x, magicInt); 
__m128 ylo = _mm_sub_ps(_mm_castsi128_ps(xlo), magicFloat); 
__m128 yhi = _mm_sub_ps(_mm_castsi128_ps(xhi), magicFloat); 

On mức lắp ráp khác biệt duy nhất từ ​​phiên bản Paul R là sử dụng _mm_sub_ps (hướng dẫn SUBPS) thay vì _mm_cvtepi32_ps (hướng dẫn CVTDQ2PS). _mm_sub_ps không bao giờ chậm hơn _mm_cvtepi32_ps và thực sự nhanh hơn trên các CPU cũ và trên CPU công suất thấp (đọc: Intel Atom và AMD Bobcat)

+1

Tôi không hoàn toàn tin rằng điều này là tốt hơn mặc dù. Bạn có thời gian chờ 1-2 chu kỳ để di chuyển dữ liệu từ SSE-int sang SSE-FP. Sau đó, bạn cần thêm hai thanh ghi (hoặc tải) cho hai hằng số. Thủ thuật này thường được sử dụng cho độ chính xác gấp đôi. – Mysticial

+1

CVTDQ2PS cũng bị phạt chuyển tiếp SSE-INT sang SSE-FP. Tăng áp suất đăng ký có thể là một vấn đề, nhưng nó phụ thuộc nhiều vào mã xung quanh. –

+0

Phải, tôi đã bỏ qua điều đó. :) +1 – Mysticial

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