2016q3 Homework3 (mergesort-concurrent)
contribute by <kevinbird61
>
SIMD = Single Instruction Multiple Data,主要把原本一個指令中的數值分成多個部份,分配給多個執行緒執行完後再統整程最後結果,加速執行速度
SIMD 優化

- Auto/Semi-Auto method
- 讓compiler來做vectorization處理(ex: #pragma)
- 把原本serial的執行變成平行化處理的方式
- IR Optimization: 對中間語言(intermediate representation)的優化
- 為何選擇IR? reason 1: 在從高階語言轉換產生IR後,時常會有一些冗餘的計算,這時候就會成為優化的對象
- 為何選擇IR? reason 2: 由於使用者會使用for loop來做一些型式類似並且多次的運算,減少所寫的code數量。而有時compiler就會做loop unrolling的動作來優化。
- Compiler Intrinsics
- 類似函數,主要差別在於compiler編譯時,會被直接編譯成組合語言
- Specific Framework/Infrastructure
- Data Parallel Framework,主要設計就是為了平行化的目的
- Ex: Apple Accelerate、OpenCV、ffmpeg/x264(影音串流服務的格式,OBS裡頭就有看過)、fftw/Ne10
- Coding in Assembly
SIMD 優化 - 困難部份
- Finding Parallelism in Algorithm(找出原本程式中可以做平行運算的部份)
- Portability between different intrinsics(不同架構中的轉換;Ex: sse -> neon \ neon -> sse)
- Boundary handling
- 提到Padding、Predication、Fallback,但不是很懂
- Divergence
- 提到Predication、Fallback to scalar,也不是很懂
Branch Divergence
: occurs when threads inside warps branch to different execution paths.

- Register Spilling
- 編譯產生組合語言時,所使用的variable數量 > register的數量的情況發生稱之
- Non-Regular Access/Processing Pattern/Dependency
- Unsupported Operations
- Floating-Point
作業要求
- 使原本mergesort能夠讀取phonebook的資料,我必須改變原本資料儲存的方式、讀入的參數、儲存時的動作
- 原本的開頭字母作為sorting值
- 再structure中加上原本的字串資料