SIMD函數整理:00 索引貼(2012-07-31更新)


作者: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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM