除了明顯的閱讀Intel® 64 and IA-32 Architectures Software Developer's Manuals之外,還有什麼方法可以學習?
主要我有興趣與GCC X86 Built-in Functions一起工作。
除了明顯的閱讀Intel® 64 and IA-32 Architectures Software Developer's Manuals之外,還有什麼方法可以學習?
主要我有興趣與GCC X86 Built-in Functions一起工作。
首先,我不推薦使用內置函數 - 它們不可移植(跨越同一個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真的很強大,在我看來比較容易學習。
既然你問了資源:
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代碼生成仍然是一項相當新穎的技術,在某些情況下編譯器很可能會出錯。
我發現Dr. Agner Fog的研究&優化指南非常有價值!他還有一些庫我還沒有嘗試過的測試工具&。 http://www.agner.org/optimize/
你知不知道每個int32元素的兩個數組的點積? – psihodelia 2010-06-21 15:13:03
爲此提出問題,我會確保幫助:) – LiraNuna 2010-06-22 23:49:29