MegEngine 使用小技巧:用 mperf 進(jìn)行安卓 opencl 算子的 roofline 分析
前言
roofline 分析是一種簡單評(píng)估當(dāng)前計(jì)算任務(wù)對(duì)當(dāng)前平臺(tái)計(jì)算/訪存能力的利用情況的方法,可以幫助分析算子的優(yōu)化方向和優(yōu)化潛力。mperf 實(shí)現(xiàn)了安卓 mali/adreno 兩種 gpu 平臺(tái)的 roofline 分析能力,下面以 mali 平臺(tái)為例,簡單介紹一下操作步驟。
編譯和集成
下載 repo 代碼
編譯安裝
項(xiàng)目集成
關(guān)于編譯和集成部分,詳見 mperf readme(https://github.com/MegEngine/mperf#readme)
獲取 roofline 數(shù)據(jù)
獲取 opencl 算子執(zhí)行過程的 GFLOPs 和 GBPs
詳細(xì)測(cè)試樣例,參見 mali_gpu_pmu_test(https://github.com/MegEngine/mperf/blob/master/apps/gpu_mali_pmu_test.cpp)
獲取當(dāng)前 gpu 平臺(tái)的峰值計(jì)算能力和訪存帶寬
將編譯階段得到的 build_dir/apps 目錄下的 gpu_inst_gflops_latency 和 gpu_spec_dram_bw 拷貝到手機(jī)上執(zhí)行,即可拿到 gpu 的實(shí)際峰值算力和峰值帶寬
峰值性能測(cè)試的詳細(xì)邏輯,參見 gpu_inst_gflops_latency 和 gpu_spec_dram_bw
繪制 roofline
上一步拿到了 opencl 算子執(zhí)行過程的 GFLOPs 和 GBPs 和 gpu 的實(shí)測(cè)峰值算力和峰值帶寬,現(xiàn)在可以借助 mperf plot_roofline(https://github.com/MegEngine/mperf/blob/master/apps/scripts/roofline/plot_roofline.py) 腳本繪制 roofline 曲線:
編輯 roofline_data.txt:
執(zhí)行 python 腳本:

比如上面得到的 roofline 曲線中,算子的計(jì)算訪存比小于機(jī)器平衡點(diǎn)(通常將屋檐和屋頂轉(zhuǎn)折點(diǎn)的橫坐標(biāo)稱為機(jī)器平衡點(diǎn)),所以可以初步判斷該算子在該平臺(tái)上主要 bound 在訪存部分,平臺(tái)的算力資源對(duì)于該算子來說還是有富裕的。并且可以根據(jù)算子的實(shí)際帶寬跟機(jī)器的峰值帶寬的比值,來評(píng)估后續(xù)訪存優(yōu)化的空間有多大。
同時(shí)提醒一點(diǎn),在獲取算子 GBPs 的時(shí)候,我們是拿到了算子實(shí)際發(fā)生的 ddr 訪存量的,這個(gè)訪存量可以跟算子輸入輸出變量總的內(nèi)存占用大小做一個(gè)比較,從而衡量出算子有多少重復(fù)訪存沒有被 cache 和寄存器 cover 住,而產(chǎn)生的對(duì) ddr 的重復(fù)訪問。如果觀察到 ddr 訪存量顯著大于輸入輸出總的內(nèi)存占用,那么我們就需要去審視算子的訪存邏輯是不是不夠 cache 友好,是不是有些重復(fù)訪存可以通過加一些緩存邏輯來避免等等。
拓展思考
通過上面的步驟,我們獲取了 roofline 數(shù)據(jù),這可以幫助我們判斷當(dāng)前算子在當(dāng)前平臺(tái)是計(jì)算 bound 還是訪存 bound,以及相對(duì)峰值算力和峰值帶寬的 gap 大小。但是,單單依靠 roofline 分析又很難進(jìn)一步具化瓶頸的位置和緩解的對(duì)策,比如訪存 bound 的原因是因?yàn)槟囊患?jí)存儲(chǔ)的訪存效率低下?計(jì)算 bound 是因?yàn)橹噶钜蕾囘€是某一類 alu 硬件資源緊張?
為了解決這些問題,mperf 還做了一些硬件參數(shù)探測(cè)、PMU 數(shù)據(jù)加工分析、opencl kernel 的動(dòng)靜態(tài)代碼分析(動(dòng)靜態(tài)代碼分析的功能,還在內(nèi)部迭代開發(fā)中,尚未推到開源 repo 中)等嘗試,盡可能讓算子性能分析和優(yōu)化更加有跡可循,或者說心智負(fù)擔(dān)更低。
附:
更多 MegEngine 信息獲取,您可以:查看文檔:https://www.megengine.org.cn/doc/stable/zh/
GitHub 項(xiàng)目: https://github.com/MegEngine
加入 MegEngine 用戶交流 QQ 群:1029741705
歡迎參與 MegEngine 社區(qū)貢獻(xiàn),成為?Awesome MegEngineer:https://www.megengine.org.cn/community-AMGE,榮譽(yù)證書、定制禮品享不停。