contributed by<BodomMoon
>
SSE 是一套 SIMD 的擴充指令集,請先了解 SIMD 是啥再回來閱讀本文。
首先必須要了解以下 6 個函數的行為
__m128i : 一種 128 bits 的資料型態,可對應 SSE 特有的 128 bits register 操作。
__m128i _mm_loadu_si128 (__m128i *p):透過指標讀取一個 128 bit 的值。
__m128i I0 = _mm_loadu_si128((__m128i *)(array));
void _mm_storeu_si128 (__m128i *p, __m128i a):透過指標將一個 128 bit 的值存入目標記憶體地址
_mm_storeu_si128((__m128i *)(array), I0);
__m128i _mm_unpacklo_epi32 (__m128i a, __m128i b):將兩個 m128i 變數的前兩筆 32 bits 資料交錯擺放。
假設我們將一個 m128i 的資料型態視為 int[4] 的話示意如下
而今天我們轉置一個矩陣時使用以下程式碼
雖然乍看之下覺得似乎很不太容易理解,但其實只要把步驟如下拆解就很容易解讀。以一個4*4的矩陣為例
並且 4 * 4 是這個算法處理的基礎單位,若是 8 * 8 的矩陣則延伸成以下形式
此為 column order 的實作方式。
後面實驗部份請至 2018 software-pipelining - SSE 矩陣實驗及 prefetch 論文實證 部份接續閱讀