PS:要轉載請註明出處,本人版權所有。
PS: 這個只是基於《我自己》的理解,
如果和你的原則及想法相沖突,請諒解,勿噴。
本文作為本人csdn blog的主站的備份。(BlogID=117)
由於業務需求,我們需要展示高通865的cpu/gpu/dsp的使用率,其中cpu/gpu是非常簡單的。但是對於dsp來說,我找了許久,才發現了一點點端倪,下面就是這一部分成果。
要實現高通dsp使用率的查詢,我們最開始查詢到的一點資料是一個sysmon tools,這個工具在高通的sdk中,這個工具可以檢視相關的利用率,所以我們按照這個方向走下去。
去此網站下載sdk並安裝(https://developer.qualcomm.com/software/hexagon-dsp-sdk/tools) 。注意,安裝需要java環境,請自備。
然後我們需要檢查我們的環境設定。
參考SDK目錄中Hexagon_SDK/3.5.4/docs/calculator_c++.html,然後進入Hexagon_SDK\3.5.4\examples\common\calculator_c++目錄,編譯生成target檔案及模擬檔案。然後安裝教學,將計算器例子拷貝到裝置相關目錄進行執行,成功得到計算結果。這代表環境設定正確。
注意:這裡可能會有很多問題,多看檔案,多對比。特別是裝置對應的dsp工具鏈選對,詳情參考:Hexagon_SDK/3.5.4/docs/feature_matrix.html。
在這一步的計算器例子執行完成之後,基本上,我們應該知道生成的檔案有3個,一個是android adb 可執行檔案,一個是可執行檔案對應的ndk庫。一個是ndk庫對應的dsp呼叫so。它們之間的關係是執行可執行檔案,查詢對應的符號,然後通過fastrpc呼叫dsp對應的符號,並得到結果。詳情參考:Hexagon_SDK/3.5.4/docs/APIs_FastRPC.html#FastRPC%20architecture
在Hexagon_SDK\3.5.4\tools\utils\sysmon,當我把sysMon_DSP_Profiler_V2.apk安裝到系統後,終於看到了cDSP使用率查詢的一絲方法。從圖中可知,我們得到了dsp的當前工作頻率,以及當前的使用率。但是我的需求是製作一個小工具,能夠直接列印出core utilization,所以需要想其他辦法。
當我瞭解到這些內容後,就得把目標放在高通sdk裡面的perf相關內容裡面,我查詢了相關api和檔案後(Hexagon_SDK/3.5.4/docs/APIs_DSP%20Clk%20&%20Rsrc%20Mgmt.html),發現了兩個相關的內容,DSP Power and Performance Management 以及 HAP PMU framework。但是這個時候,我還是沒有辦法知道官方的工具裡面顯示的使用率是怎麼算的。最開始:根據檔案Hexagon_SDK/3.5.4/docs/images/Hexagon_Document_Bundle.pdf 第9章 processor event symbols,我以為直接用COMMITTED_PKT_ANY及COMMITTED_PKT_SMT就能計算出使用率,但是經過我的分析,怎麼算都對不上,這個時候我又把重心轉向官方的分析工具,官方的分析工具能夠儲存資料,然後用官方的其他的工具來後處理之後進行分析,看看能否從這裡找到一些相關資訊。
再次使用官方工具分析dsp資訊然後儲存相關的資料檔案,然後dump到windows上,得到sysmon_CDSP.bin,用工具分析。在Hexagon_SDK\3.5.4\tools\utils\sysmon\parser_win_v2 目錄有兩個工具,一個是解析工具,一個是生成html報告,我們按照官方的方法生成html報告,如下圖。
我們開啟生成的html報告,我在報告中總算檢視到了QDSP6 Utilization和QDSP6 Core performance ,如下圖。通過閱讀相關含義,瞭解到了官方app中的core utilization的計算方法。其計算方法為:使用率=(總執行次數/當前頻率(hz) * 取樣時間(s))* 100。原理解釋:總執行次數除以當前頻率下滿載執行次數,得到使用率。這裡的總執行次數由HAP_perf_get_pcycles來得到,當前執行頻率由HAP_power_get得到。到此,整個技術上的鏈條打通了,現在開始編寫小程式。
首先,直接複製一個calculator_c++官方例子工程來作為模板,根據我瞭解到的資料,直接選取makefile作為作為編譯手段。通過編寫dsp的小程式,然後得到我們的使用率。下面是重要api的展示。
/**
* Data type to retrieve power values from the ADSP
* @param type - Identifies the type to retrieve.
* @param max_mips - Max mips supported
* @param max_bus_bw - Max bus bw supported
* @param client_class - Current client class
* @param clkFreqHz - Current core CPU frequency
* @param aggregateAVSMpps - Aggregate AVS Mpps used by audio and voice
* @param dcvsEnabled - Indicates if dcvs is enabled / disabled.
*/
typedef struct {
HAP_Power_response_type type;
union{
unsigned int max_mips;
uint64 max_bus_bw;
unsigned int client_class;
unsigned int clkFreqHz;
unsigned int aggregateAVSMpps;
boolean dcvsEnabled;
};
} HAP_power_response_t;
/**
* Method to retrieve power values from the ADSP
* @param context - Ignored
* @param request - Response.
*/
int HAP_power_get(void* context, HAP_power_response_t* response);
/*
HAP_perf_get_pcycles
Gets the current 64-bit processor cycle count
The processor cycle count is the current number of processor cycles executed
since the Hexagon processor was last reset.
Note that this counter stops incrementing whenever the DSP enters a low-power
state (such as clock gating), as opposed to the qtimer, which increments
regardless of the DSP power state.
Returns:
Integer -- Current count of Hexagon processor cycle count.
*/
uint64 HAP_perf_get_pcycles(void);
對於我們編寫dsp小程式來說,有一個值得注意的地方,這些api雖然我們是在android ndk程式裡面呼叫的,但是我們僅僅是在android ndk側找到符號,然後通過fastrpc將引數發給dsp端,dsp端呼叫對應的api後,將結果返回給android ndk端。此部分重點參考前文環境設定部分,對於新手來說,很難理解或者說適應這個東西。
由於高通的cDSP程式呼叫方式比較特殊,我們應該按照官方Hexagon_SDK/3.5.4/docs/calculator_c++.html例子中推薦的部署方式,如果需要自定義部署,請參考環境變數DSP_LIBRARY_PATH。也就是拷貝android側檔案到對應目錄,拷貝dsp側目錄到對應目錄。
此外,當你真的自定義程式並部署使用的時候,會遇到簽名問題。在開發階段,我們都是使用testsign,具體詳情參考:Hexagon_SDK/3.5.4/docs/Tools_Signing.html,就是按照官方方法生成一個對應的testsign-xxxx.so的檔案,此檔案包含了當前裝置的id,能夠讓執行在當前裝置上的程式免籤。但是這種方法只能夠用於偵錯,對於大規模使用,需要採取另外的部署方式,一種是聯絡廠家,提供批次簽名工具,另外就是使用 Unsigned PD 功能(Unsigned PD is a sandboxed low-rights process that allows the signature-free modules to run on the cDSP.)。Unsigned PD可以讓一些低權程式執行在dsp上,主要還是被用於神經網路推理。但是就是這個Unsigned PD也是不是那麼好用的,這裡直接copy小米mace框架裡面的so和程式碼,在執行任何dsp api之前呼叫hexnn_controller_request_unsigned_pd(https://github.com/XiaoMi/mace/blob/fa72958a647be9457cf0a19d2f1195205a4b1a58/mace/runtimes/hexagon/dsp/hexagon_dsp_wrapper.cc) 。 這裡不得不感嘆一句,這些廠家的py關係真好。
當所有部署完畢之後,執行dsp程式得到如下圖結果:
要實現高通dsp使用率的查詢,我們最開始查詢到的一點資料是一個sysmon tools,這個工具在高通的sdk中,所以我們按照這個方向走下去。
這裡關於dsp程式設計來說,我這裡可以說僅僅是一個小demo,這個部分最有價值的還是計算加速部分,一些重要的向量運算,這次我沒有這個需求就不去關注了。
但是換句話說,有了這一部分的經驗後,後面哪怕是學習一些深入的東西,也是有一點基礎在的。
[1]Qualcomm.Hexagon SDK 3.5.4 Doc
[2]RockChip.Rockchip_RKNPU_User_Guide_RKNN_API_V1.3.0_CN
PS: 請尊重原創,不喜勿噴。
PS: 要轉載請註明出處,本人版權所有。
PS: 有問題請留言,看到後我會第一時間回覆。
如某些圖片無法檢視,請嘗試開啟外網