前情提要
簡介
[OpenCL] GPU探照燈 – DeviceInfo中有提到GPU的架構,及如何最佳化的使用GPU
建議先看這部Thread Blocks And GPU Hardware – Intro to Parallel Programming 影片來了解GPU的架構,其中的分層結構為
GPU -> Streaming Multiprocessors-> Simple Processors
依照影片中的顏色來說明,一顆GPU裡有多顆Streaming Multiprocessors,一顆Streaming Multiprocessor裡有多顆Simple Processors
依據WIKI的M2架構來看,一顆Streaming Multiprocessor裡有16顆Simple Processors
接下來由程式碼cl_get_devices()可取得以下參數,以我的MacBook M2為例
Max Compute Units: 10 -> 代表一顆GPU裡有十顆Streaming Multiprocessors
Preferred Vector Widths: Char: 1, Short: 1, Int: 1, Long :1, Float: 1, Double: 1
|—-> 其中每顆Simple Processor適合處理1個工作項
從上述數據來看,GPU中一共有10*16 = 160顆Simple Processors,最多每次可平行處理160個工作項
實驗(程式碼)
實驗一:
GPU中一共有10*16*1 = 160顆Simple Processors,最多每次可平行處理160個工作項
整個系統中的上限為 Max Work Group Size: 256
此次實驗為如何運用GPU運算960KB的資料
究竟是一個工作組包含160個工作項較佳,還是直接堆滿256個工作項較佳
從結果來看,沒有太大的差異,可能這兩者配置都很接近最佳效能了
實驗環境 | 完成所需時間 |
並行160個工作項 | 0.031161 ms |
並行256個工作項 | 0.032566 ms |
實驗二:
MacBook M2推薦一次運算一個純量,但就理論而言,一次平行運算能節省更多的時間
跑下去之後,發現向量運算實際上比純量運算還慢了許多,真正的原因可能要由硬體的架構去理解,但我不是蘋果工程師也不是搞GPU的,想知道解答的讀者,建議直接去蘋果上班,然後你可能就會在理解這個問題的過程中,意外地賺到很多錢
實驗環境(改用向量運算) | 完成所需時間 |
並行160個工作項 -> 改成4組向量運算,每組40個工作項 | 0.593025 ms |
並行256個工作項 -> 改成4組向量運算,每組40個工作項 | 0.486748 ms |
補充
這次的實驗根本就不合理,但身為一個稱職的果粉,還是不免俗地做了這個實驗.
不合理的地方是
- 在Apple平台上,Metal比OpenCL更適合作為驅動程式
- MacBook Air2 本來就不是讓你拿來做平行運算的
不過從另一個角度來想,OpenCL的泛用性又比Metal還高
但人生就是這樣,不合理的事情太多了,在逆境中也必須向前航行,讓我們一起看看航道另一端的解答吧