SIMD(MMX/SSE/AVX)变量命名规范心得
【轉載】:SIMD(MMX/SSE/AVX)變量命名規范心得
當使用Intrinsics函數來操作SIMD指令集(MMX/SSE/AVX等)時,會面對不同長度的SIMD數據類型,其中又分為多種緊縮格式。為此,我設計了一套SIMD變量命名規范,可以有效的提高代碼的可讀性。
1、SIMD數據類型簡介
SIMD數據類型有:
__m64???:64位緊縮整數(MMX)。
__m128??:128位緊縮單精度(SSE)。
__m128d?:128位緊縮雙精度(SSE2)。
__m128i??:128位緊縮整數(SSE2)。
__m256??:256位緊縮單精度(AVX)。
__m256d?:256位緊縮雙精度(AVX)。
__m256i??:256位緊縮整數(AVX)。
?注:緊縮整數包括了8位、16位、32位、64位的帶符號和無符號整數。
這些數據類型與寄存器的對應關系為:
64??位MM寄存器?(MM0~MM7)? ? ?:?__m64。
128位SSE寄存器(XMM0~XMM15):__m128、__m128d、__m128i。
256位AVX寄存器(YMM0~YMM15):__m256、__m256d、__m256i。
? ? ?SIMD 數據類型關鍵字:
? ? ?p ?:?緊密,指令對寄存器中的每個元素進行運算
? ep : 擴充緊密
? ?s :標量,只將寄存器中的第一個元素參與運算?
2、SIMD變量命名規范
參考匈牙利命名法(Hungarian notation),在變量名前面增加類型前綴。
類型前綴為3個小寫字母,首字母代表寄存器寬度,最后兩個字母代表緊縮數據類型。
寄存器寬度(首字母)——
? ? ? m:?64位MM寄存器。?對應?__m64
? ? ? x:128位SSE寄存器。對應?__m128、__m128d、__m128i。
? ? ? y:256位AVX寄存器。對應?__m256、__m256d、__m256i。
?緊縮數據類型(兩個字母)——
? ? ?mb:8位數據。用于只知道長度、不知道具體緊縮格式時。(b:Byte)
? ? ?mw:16位數據。(w:Word)
? ? ?md:32位數據。(d:DoubleWord)
? ? ?mq:64位數據。(q:QuadWord)
? ? ?mo:128位數據。(o:OctaWord)
? ? ?mh:256位數據。(h:HexWord)
? ? ?ub / uw / ud / uq:8位?/ 16位?/ 32位?/ 64位?無符號整數。
? ? ?ib / iw / id / iq???:8位?/ 16位?/ 32位?/ 64位?帶符號整數。
? ? ?fh:16位浮點數,即半精度浮點數。(h:Half)
? ? ?fs:32位浮點數,即單精度浮點數。(s:Single)
? ? ?fd:64位浮點數,即雙精度浮點數。(d:double)
? ? 例如?——
? ? mub:64位緊縮字節(64位MMX寄存器,其中存放了8個8位無符號整數)。
? ? xfs:128位緊縮單精度(128位SSE寄存器,其中存放了4個單精度浮點數)。
? ? xid:128位緊縮帶符號字(128位SSE寄存器,其中存放了4個32位帶符號整數)。
? ? yfd:256位緊縮雙精度(256位AVX寄存器,其中存放了4個雙精度浮點數)。
? ? yfh:256位緊縮半精度(256位AVX寄存器,其中存放了16個半精度浮點數)。
?3、示例代碼
? ??SSE累加求和程序?:
? ?
? ??測試上面的函數: ? ?
? ??上述測試代碼中的?__declspec(align(16))?主要是為了讓數據?a?的地址是16字節對齊。否則的話?_mm_load_si128?會報錯。也可以將函數_mm_load_si128?改為?_mm_loadu_si128,這樣就不需要將數組進行16字節對齊,也可以獲得正確結果,但是效率可能會低一些。
總結
以上是生活随笔為你收集整理的SIMD(MMX/SSE/AVX)变量命名规范心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SIMD学习笔记整理(索引贴)
- 下一篇: SSE3 和 SSSE3 Intrins