SIMD学习笔记整理(索引贴)
關于SIMD(MMX、SSE、AVX)編程的資料一直很零散,于是我試圖進行收集整理,便于隨時翻閱學習。而且很多代碼是直接用匯編寫的,易讀性差、難以重用,于是我決定將其統一改寫為Intrinsics函數版。
一、Instructions函數對照表
在使用Instructions函數時,很多時候會發現?MSDN?說的不詳細,這時只有去翻閱Intel、AMD文檔了。但Intel、AMD文檔都是按照匯編指令名排序的,查起來不太方便。而且?SIMD?指令大多很復雜,文字描述難以詳細的解釋其功能,唯有偽代碼才能精確的解釋其功能。但Intel、AMD文檔上的偽代碼大多很長,不適合隨時翻閱。
于是我希望能有一份這樣的表格?:
? ? ? 1)?按照?Intrinsics?頭文件中的順序排序;
? ? ? 2)有函數名、匯編指令、功能描述、偽代碼?這四列,便于對照。
? ? ? 3)偽代碼只有一行,并盡可能簡短,便于表格化。
為簡化偽代碼,我借用C語言語法,可以寫循環和大括號語句塊,將?mm / xmm / ymm?寄存器看做聯合體、轉型等。
【例如】?PADDSB(飽和加法.無8位)指令的偽代碼為?—— ?for (i=0; i<8; ++i) { r.uB[i] = SU(m1.uB[i] + m1.uB[i]); }
【解釋】?r?:?返回值。?r.uB[i]表示,將r這個64位寄存器?看做?“無符號8位整數”的數組。
? ? m1、m2:輸入參數1與輸入參數2。 同理 "uB[i]"?也是指將其看做?“無符號8位整數”的數組。
? ? SU:無符號飽和處理。當運算超過上界或下界時數值會飽和到邊界,而不發生環繞。這對圖像處理等領域非常有用。
? uB等類型縮寫見《SIMD(MMX/SSE/AVX)變量命名規范心得?》
?SU等函數的說明?——
SIMD?Instructions函數對照表1 : ?mmintrin.h與MMX指令集 SIMD?Instructions函數對照表2 : ?xmmintrin.h與SSE指令集 SIMD?Instructions函數對照表3 : ?pmmintrin.h和tmmintrin.h與SSE3和SSSE3指令集?或?SSE3和SSSE3 Intrinsics各函數介紹二、SSE命令示例代碼 ? ? ?為了更好的理解SSE的各種命令代碼,編寫了一些示例代碼,參見: ? ? ? 1. ?SSE命令示例代碼(算術、邏輯、比較) ? ? ? 2. ?SSE命令示例代碼(轉換、加載、置位、存儲) ? ? ? 3.??SSE命令示例代碼(整型、讀寫控制寄存器、混雜、矩陣變換)?
總結
以上是生活随笔為你收集整理的SIMD学习笔记整理(索引贴)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 近邻取样插值和其速度优化
- 下一篇: SIMD(MMX/SSE/AVX)变量命