SIMD(MMX/SSE/AVX)變數命名規範心得

來源:互聯網
上載者:User

  當使用Intrinsics函數來操作SIMD指令集(MMX/SSE/AVX等)時,會面對不同長度的SIMD資料類型,其中又分為多種緊縮格式。為此,我設計了一套SIMD變數命名規範,可以有效提高代碼的可讀性。

一、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變數命名規範

  參考匈牙利命名法(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個半精度浮點數)。

 

三、範例程式碼

  例如SSE累加求和程式——

int sum3_Intrinsics(int *a, int size){    if (NULL==a)    return 0;    if (size<0)    return 0;    int s = 0;    // 傳回值    __m128i xidSum = _mm_setzero_si128();    // 累積。[SSE2] 賦初值0    __m128i xidLoad;    // 載入    int cntBlock = size / 4;    // 塊數。SSE寄存器能一次處理4個DWORD    int cntRem = size & 3;    // 剩餘數量    __m128i* p = (__m128i*)a;    for(int i = 0; i < cntBlock; ++i)    {        xidLoad = _mm_load_si128(p);    // [SSE2] 載入        xidSum = _mm_add_epi32(xidSum, xidLoad);    // [SSE2] 帶符號32位緊縮加法        ++p;    }    // 處理剩下的    int* q = (int*)p;    for(int i = 0; i < cntRem; ++i)    s += q[i];    // 將累加值合并    xidSum = _mm_hadd_epi32(xidSum, xidSum);    // [SSSE3] 帶符號32位水平加法    xidSum = _mm_hadd_epi32(xidSum, xidSum);    s += _mm_cvtsi128_si32(xidSum);    // [SSE2] 返回低32位    return s;}

   代碼出自——
http://topic.csdn.net/u/20120102/01/fc8d7aa4-bffc-4d9a-a34a-5056c6d27b54.html
#9樓

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.