2009-09-07 36 views

Trả lời

38

Trước tiên, tôi không khuyên bạn nên sử dụng các chức năng tích hợp sẵn - chúng không thể di chuyển (trên các trình biên dịch của cùng một vòm).

Sử dụng intrinsics, GCC does a wonderful job tối ưu hóa nội tại SSE thành mã được tối ưu hóa nhiều hơn. Bạn luôn có thể có một cái nhìn tại hội đồng và xem làm thế nào để sử dụng SSE cho nó đầy tiềm năng.

Intrinsics dễ dàng - chỉ cần như cuộc gọi chức năng bình thường:

#include <xmmintrin.h> 

__m128 vector1 = _mm_set1_ps(4, 3, 2, 1); // Little endian, stored in 'reverse' 
__m128 vector2 = _mm_set1_ps(7, 8, 9, 0); 

// Addition 
__m128 result = _mm_add_ps(vector1, vector2); // result = vector1 + vector 2 

// A more advanced function, called shuffle 
vector1 = _mm_shuf_ps(vector1, vector1, _MM_SHUFFLE(0,1,2,3)); 
// vector1 is now (1, 2, 3, 4) (above shuffle reversed it) 

Tất nhiên có những cách thêm nhiều lựa chọn, SSE thực sự mạnh mẽ và theo ý kiến ​​của tôi tương đối dễ học.

+0

Bạn có biết nóng để tạo một sản phẩm chấm của hai mảng int32 thành phần không? – psihodelia

+6

Đặt câu hỏi cho nó và tôi chắc chắn sẽ giúp :) – LiraNuna

32

Kể từ khi bạn yêu cầu nguồn lực:

A practical guide to using SSE with C++: Tốt cái nhìn tổng quan về khái niệm về cách sử dụng SSE có hiệu quả, với các ví dụ.

MSDN Listing of Compiler Intrinsics: Tham chiếu toàn diện cho tất cả các nhu cầu nội tại của bạn. Đó là MSDN, nhưng khá nhiều tất cả các nội tại được liệt kê ở đây đều được hỗ trợ bởi GCC và ICC.

Christopher Wright's SSE Page: Tham chiếu nhanh về ý nghĩa của các mã SSE. Tôi đoán Sách hướng dẫn của Intel có thể phục vụ cùng một chức năng, nhưng điều này nhanh hơn.

Có lẽ tốt nhất là viết hầu hết mã của bạn bằng nội tại, nhưng hãy kiểm tra phần đầu ra của trình biên dịch của bạn để đảm bảo rằng nó tạo mã hiệu quả. Tạo mã SIMD vẫn là một công nghệ khá mới và rất có thể trình biên dịch có thể làm sai nó trong một số trường hợp.

4

Tôi tìm thấy nghiên cứu của tiến sĩ Agner Fog & hướng dẫn tối ưu hóa rất có giá trị! Ông cũng có một số thư viện công cụ kiểm tra & mà tôi chưa thử. http://www.agner.org/optimize/