2010-07-29 17 views
13

Tôi đang tìm phương pháp hiệu quả nhất để lật dấu trên tất cả bốn phao được đóng gói trong thanh ghi SSE.Dấu hiệu lật trên phao SSE đóng gói

Tôi không tìm thấy nội tại để thực hiện việc này trong hướng dẫn sử dụng phần mềm Kiến trúc Intel. Dưới đây là những điều tôi đã thử.

Đối với mỗi trường hợp, tôi lặp lại mã 10 tỷ lần và nhận được thời gian tường được chỉ định. Tôi đang cố gắng để ít nhất là phù hợp với 4 giây nó có cách tiếp cận không SIMD của tôi, mà là sử dụng chỉ là toán tử trừ đơn nhất.


[48 giây]
_mm_sub_ps(_mm_setzero_ps(), vec);


[32 giây]
_mm_mul_ps(_mm_set1_ps(-1.0f), vec);


[9 giây]

union NegativeMask { 
    int intRep; 
    float fltRep; 
} negMask; 
negMask.intRep = 0x80000000; 

_mm_xor_ps(_mm_set1_ps(negMask.fltRep), vec); 


Trình biên dịch là gcc 4.2 với O3 . CPU là Intel Core 2 Duo.

Trả lời

4

Chỉ cần để hoàn thành câu trả lời của riêng bạn bằng cách tài liệu gcc về những vectơ BUILTIN:

The types defined in this manner can be used with a subset of normal C 
operations. Currently, GCC will allow using the following operators on 
these types: `+, -, *, /, unary minus, ^, |, &, ~'. 

Nó có lẽ là một ý tưởng tốt để luôn luôn dính vào những khi có thể. Với cơ hội rất cao gcc sẽ luôn cung cấp mã hiệu quả nhất cho công cụ SSE này.

Đối với các tùy chọn trình biên dịch của bạn, hãy thêm thứ gì đó cụ thể hơn vào kiến ​​trúc của bạn, một số thứ như -march=native sẽ thực hiện trong hầu hết các trường hợp.

2

Bài học về mã hóa cho đến 3 giờ sáng vào buổi sáng .....

Tôi chưa bao giờ thử sử dụng đơn thuần trừ đi trên véc-tơ đóng gói của mình. Điều đó thực sự biên dịch và có hiệu suất chính xác giống như cách tiếp cận không phải SIMD.

+5

Cẩn thận mặc dù - sử dụng phần mở rộng gcc-cụ thể như thế này này làm cho mã của bạn không cầm tay. –

+0

bạn đã xem mã nào tạo ra? – Aktau

21

Đó đoàn là không thực sự cần thiết, tốt nhất của tất cả các thế giới (dễ đọc, tốc độ và tính di động):

_mm_xor_ps(vec, _mm_set1_ps(-0.f))