一、優化原則
- 最大化算術強度;
- 減少內存操作花費時間;
- 合併全局內存訪問;
- 避免線程發散;
- 把高頻使用數據移動到共享內存;
二、縱向
優化的流程與步驟一般包括如下步驟:
1.1 分析
分析程序的瓶頸、什麼地方需要做並行、能夠提供資源。不要依賴直覺,儘量藉助工具:
- gProf
- VTune
- VerySleepy
1.2 並行
這個階段考慮使用並行庫(OpenMP是CPU上的並行,OpenACC)、指令、選擇好算法等。
1.3 優化
測試程序的內存、帶寬和佔用率等指標是否達到硬件或者貼近硬件的極限。最重要的是,是否滿足要求。
1.4 部署
在預算內考慮更加符合場景的硬件等設備。
三、橫向
在考慮cpu與GPU還是所有不同。考慮CPU運行效率時一般只考慮時間效率,但是考慮GPU時,除了時間效率,還有能夠並行的程度。如下面的GPU例子中的堆排序,堆排序對於CPU是一個較好的排序算法,但是對於GPU卻不是,因爲它並行程度很低。