2009-09-07 57 views

回答

38

首先,我不推薦使用內置函數 - 它們不可移植(跨越同一個arch的編譯器)。

使用intrinsics,GCC does a wonderful job將SSE內在函數優化爲更優化的代碼。您可以隨時查看程序集並瞭解如何使用SSE充分發揮其潛力。

內部函數很容易 - 就像普通的函數調用:

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

當然有辦法更多的​​選擇,SSE真的很強大,在我看來比較容易學習。

+0

你知不知道每個int32元素的兩個數組的點積? – psihodelia 2010-06-21 15:13:03

+6

爲此提出問題,我會確保幫助:) – LiraNuna 2010-06-22 23:49:29

32

既然你問了資源:

A practical guide to using SSE with C++:如何有效地使用SSE,結合實例好概念性概述。

MSDN Listing of Compiler Intrinsics:全面參考您的所有內在需求。這是MSDN,但幾乎所有在這裏列出的內部函數都由GCC和ICC支持。

Christopher Wright's SSE Page:快速參考SSE操作碼的含義。我猜Intel手冊可以提供相同的功能,但速度更快。

最好將大部分代碼寫入內部函數,但是請檢查編譯器輸出的objdump以確保它生成高效的代碼。 SIMD代碼生成仍然是一項相當新穎的技術,在某些情況下編譯器很可能會出錯。