[OpenCL] Apple M2 Air GPU實測

前情提要

[OpenCL] 環境配置 on MacOS

[OpenCL] GPU探照燈 – DeviceInfo

簡介

[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
補充

這次的實驗根本就不合理,但身為一個稱職的果粉,還是不免俗地做了這個實驗.

不合理的地方是

  1. 在Apple平台上,Metal比OpenCL更適合作為驅動程式
  2. MacBook Air2 本來就不是讓你拿來做平行運算的

不過從另一個角度來想,OpenCL的泛用性又比Metal還高

但人生就是這樣,不合理的事情太多了,在逆境中也必須向前航行,讓我們一起看看航道另一端的解答吧