MMX、SSE、AVX等SIMD指令集说明
發展歷程
SIMD指令集頭文件對應查找表
頭文件?? ?指令集描述
intrin.h?? ?All Architectures
mmintrin.h?? ?MMX
xmmintrin.h?? ?SSE
emmintrin.h?? ?SSE2
pmmintrin.h?? ?SSE3
smmintrin.h?? ?SSE4.1
nmmintrin.h?? ?SSE4.2
immintrin.h?? ?AVX
zmmintrin.h?? ?AVX512
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位的帶符號和無符號整數。
每一種類型,從2個下劃線開頭,接一個m,然后是vector的位長度。
如果向量類型是以d結束的,那么向量里面是double類型的數字。如果沒有后綴,就代表向量只包含float類型的數字。
整形的向量可以包含各種類型的整形數,例如char,short,unsigned long long。也就是說,__m256i可以包含32個char,16個short類型,8個int類型,4個long類型。這些整形數可以是有符號類型也可以是無符號類型。
這些數據類型與寄存器的對應關系為——
64位MM寄存器(MM0~MM7):__m64。
128位SSE寄存器(XMM0~XMM15):__m128、__m128d、__m128i。
256位AVX寄存器(YMM0~YMM15):__m256、__m256d、__m256i
?
函數命名約定
_mm<bit_width>_<name>_<data_type>
<bit_width> 表明了向量的位長度,對于128位的向量,這個參數為空,對于256位的向量,這個參數為256。
<name>描述了內聯函數的算術操作。
<data_type> 標識函數主參數的數據類型。
ps 包含float類型的向量
pd 包含double類型的向量
epi8/epi16/epi32/epi64 包含8位/16位/32位/64位的有符號整數
epu8/epu16/epu32/epu64 包含8位/16位/32位/64位的無符號整數
si128/si256 未指定的128位或者256位向量
m128/m128i/m128d/m256/m256i/m256d 當輸入向量類型與返回向量的類型不同時,標識輸入向量類型
變量命名規范參考
? ? ? ? 參考匈牙利命名法(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:8位無符號整數。
uw:16位無符號整數。
ud:32位無符號整數。
uq:64位無符號整數。
ib:8位帶符號整數。
iw:16位帶符號整數。
id:32位帶符號整數。
iq: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個半精度浮點數)。
相關鏈接:
https://zhuanlan.zhihu.com/p/31271788
https://blog.csdn.net/just_sort/article/details/94393506
https://blog.triplez.cn/avx-avx2-learning-notes/
https://blog.csdn.net/vbskj/article/details/38408213
總結
以上是生活随笔為你收集整理的MMX、SSE、AVX等SIMD指令集说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MMX, SSE, SSE2
- 下一篇: MMX指令