作者:zyl910
關於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變量命名規范心得 》(http://www.cnblogs.com/zyl910/archive/2012/04/23/simd_var_name.html)。
SU等函數的說明——
Code | 名稱 | Demo |
SS | 帶符號飽和處理 | |
SU | 無符號飽和處理 | |
SX | 帶符號擴展 | |
ZX | 無符號擴展 | |
BM | 邏輯掩碼 | 0為全0,非0為全1 |
EFLAGS | 根據比較結果設置EFLAGS寄存器,並返回[ZF,PF,CF] | |
TRUNC | 截尾法舍入(Truncate) | |
SBIT | 提取最高符號位 | 結果為0或1 |
SIGN | 符號傳遞 | 為-1,0,1 |
MIN | 最小值 | |
MAX | 最大值 | |
AVG | 平均值 | (A+B+1)>>1 |
ABS | 絕對值 | |
Round | 舍入。詳見ROUNDPD的舍入控制。 |
文章——
01 mmintrin.h與MMX指令集
http://www.cnblogs.com/zyl910/archive/2012/07/19/intrin01_mmx.html
02 xmmintrin.h與SSE指令集
http://www.cnblogs.com/zyl910/archive/2012/07/31/intrin02_sse.html
二、我的整理
根據書籍或其他途徑獲得的SIMD匯編代碼,我將其改寫為Intrinsics函數版。
變量命名規范——
http://www.cnblogs.com/zyl910/archive/2012/04/23/simd_var_name.html
http://blog.csdn.net/zyl910/article/details/7490598
函數命名規范——
1.函數名全部小寫,用下划線分隔不同的單詞。
2.函數名的格式為“md_<功能>_<類型>[_<版本>]”。
3.函數名以“md_”開頭。即“Multiple Data”。
4.<類型>是“_xxx”或“_yyy4xxx”。xxx、yyy是3個字母的類型描述(即“變量命名規范”的前綴),“4”指“For”表示類型轉換(xxx轉為yyy)。
5.<版本>是可選的,用於評比算法時。
整理——
01 《PC平台新技術MMX(上冊):開發編程指南》第8章 MMX編碼技術
http://www.cnblogs.com/zyl910/archive/2012/04/26/md01_mmxguide_ch08.html
http://blog.csdn.net/zyl910/article/details/7516127
三、我的原創
[x86]SIMD指令集發展歷程表(MMX、SSE、AVX等)
http://www.cnblogs.com/zyl910/archive/2012/02/26/x86_simd_table.html
http://blog.csdn.net/zyl910/article/details/7296125
Intrinsics頭文件與SIMD指令集、Visual Studio版本對應表
http://www.cnblogs.com/zyl910/archive/2012/02/28/vs_intrin_table.html
http://blog.csdn.net/zyl910/article/details/7304063
[VC6] 檢查MMX和SSE系列指令集的支持級別(最高SSE4.2)
http://www.cnblogs.com/zyl910/archive/2012/03/01/checksimd.html
http://blog.csdn.net/zyl910/article/details/7310932
深入探討用位掩碼代替分支(7):MMX指令集速度測試
http://www.cnblogs.com/zyl910/archive/2012/04/09/noifopex7.html
http://blog.csdn.net/zyl910/article/details/7443141
深入探討用位掩碼代替分支(8):SSE指令集速度測試
http://www.cnblogs.com/zyl910/archive/2012/04/12/noifopex8.html
http://blog.csdn.net/zyl910/article/details/7455830
AVX指令集中的32種浮點比較關系詳解(NaN、無序、有序等)
http://www.cnblogs.com/zyl910/archive/2012/04/19/avx_cmp_imm8.html
http://blog.csdn.net/zyl910/article/details/7478094
http://software.intel.com/zh-cn/blogs/2012/05/09/avx32/
[TurboC++] 如何在DOS下的16位C++編譯器中使用CPUID指令獲取CPU信息
http://www.cnblogs.com/zyl910/archive/2012/05/14/dos16_getcpuid.html
如何在各個版本的VC及64位下使用CPUID指令
http://www.cnblogs.com/zyl910/archive/2012/05/21/vcgetcpuid.html
http://blog.csdn.net/zyl910/article/details/7588204
[VC兼容32位和64位] 檢查MMX和SSE系列指令集的支持級別
http://www.cnblogs.com/zyl910/archive/2012/05/25/checksimd64.html
[VC] CPUIDFIELD:CPUID字段的統一編號、讀取方案。范例:檢查SSE4A、AES、PCLMULQDQ指令
http://www.cnblogs.com/zyl910/archive/2012/06/29/getcpuidfield.html
http://blog.csdn.net/zyl910/article/details/7702466
[VC] 檢測AVX系列指令集的支持級別(AVX、AVX2、F16C、FMA、FMA4、XOP)
http://www.cnblogs.com/zyl910/archive/2012/07/04/checkavx.html
http://blog.csdn.net/zyl910/article/details/7715558
[VC] ccpuid:CPUID信息模塊。范例:顯示所有的CPUID信息
http://www.cnblogs.com/zyl910/archive/2012/07/11/ccpuid.html
http://blog.csdn.net/zyl910/article/details/7737145
四、網上資源
4.1 手冊或指令參考
Intel手冊:http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
AMD手冊:http://developer.amd.com/documentation/guides/Pages/default.aspx#manuals
Compiler Intrinsics:http://msdn.microsoft.com/en-us/library/26td21ds(v=vs.110).aspx
INTEL 體系結構 MMX? 技術開發者手冊:http://dev.gameres.com/Program/Other/Fmmx/index.htm
4.2 心得教程
Introduction to MMX Programming:http://www.codeproject.com/Articles/4505/Introduction-to-MMX-Programming
基於MMX指令集的程序設計簡介:http://dev.gameres.com/Program/Other/mmxintro.htm
Introduction to SSE Programming:http://www.codeproject.com/Articles/4522/Introduction-to-SSE-Programming
基於SSE指令集的程序設計簡介:http://dev.gameres.com/Program/Other/sseintro.htm
Introduction to Intel? Advanced Vector Extensions:http://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions/
在C/C++代碼中使用SSE等指令集的指令(1)介紹:http://blog.csdn.net/gengshenghong/article/details/7007100
Pentium III處理器的SSE入門:http://www.vckbase.com/document/viewdoc/?id=322
4.3 案例分析
4.4 論壇討論
帶符號32位數的累加求和(SSSE3):http://topic.csdn.net/u/20120102/01/fc8d7aa4-bffc-4d9a-a34a-5056c6d27b54.html