【2023 · CANN訓(xùn)練營第一季】運行資源管理初探
【2023 · CANN訓(xùn)練營第一季】運行資源管理初探
一、申請運行資源
申請運行管理資源順序:Device->Context->Stream
推薦這三者都顯式的創(chuàng)建,這樣有助于我們理清初始化的思路。
但是也可以隱式創(chuàng)建:
創(chuàng)建Device后不調(diào)用函數(shù)創(chuàng)建Context和Stream,系統(tǒng)會在調(diào)用Device創(chuàng)建函數(shù)時默認創(chuàng)建的Context和Stream,如果二者需要作為借口參數(shù)時,直接傳NULL即可。
不顯式創(chuàng)建Device,則需要顯式創(chuàng)建Context和Stream,創(chuàng)建Context時系統(tǒng)內(nèi)部會調(diào)用接口指定運行的Device。
所用到的函數(shù):
note:Context創(chuàng)建后只能在該線程下使用,跨線程使用的時無法使用其他線程的Context。
二、API內(nèi)容
1.Device管理
相關(guān)函數(shù):
aclError aclrtSetDevice(int32_t deviceId) //指定當(dāng)前進程或線程中用于運算的Device,同時隱式創(chuàng)建默認Context。同步接口。
aclError aclrtResetDevice(int32_t deviceId) //復(fù)位當(dāng)前運算的Device,釋放Device上的資源,包括默認Context、默認Stream以及默認Context下創(chuàng)建的所有Stream,同步接口
aclError aclrtGetDevice(int32_t *deviceId) 獲取當(dāng)前正在使用的Device的ID,同步接口。
aclError aclrtGetRunMode(aclrtRunMode *runMode)//獲取當(dāng)前昇騰AI軟件棧的運行模式
aclError aclrtGetDeviceCount(uint32_t count)//獲取可用Device的數(shù)量,同步接口。
2.Context管理
相關(guān)函數(shù):
aclError aclrtCreateContext(aclrtContext *context, int32_t deviceId) //在當(dāng)前進程或線程中顯式創(chuàng)建一個Context。同步接口
aclError aclrtDestroyContext(aclrtContext context) //銷毀一個Context,釋放Context的資源,同步接口。只能銷毀通過aclrtCreateContext接口創(chuàng)建的Context。
aclError aclrtSetCurrentContext(aclrtContext context) //設(shè)置線程的Context,同步接口。
aclError aclrtGetCurrentContext( aclrtContext *context) //獲取線程的Context,同步接口。如果用戶多次調(diào)用aclrtSetCurrentContext接口設(shè)置當(dāng)前線程的Context,則獲取的是最后一次設(shè)置的Context。
3.Stream管理
相關(guān)函數(shù):
aclError aclrtCreateStream(aclrtStream stream) //在當(dāng)前進程或線程中創(chuàng)建一個Stream,同步接口。
aclError aclrtDestroyStream(aclrtStream stream) //銷毀指定Stream,只能銷毀通過aclrtCreateStream接口創(chuàng)建的Stream,同步接口。
三、申請&釋放運行資源代碼驗證學(xué)習(xí)
簡單測試這些函數(shù)的用法:
編譯使用的cmake如下,隨便在sample中找了個C++的工程簡單改了改,有空后面弄個makeFile用一下,要簡單一些
為了輸入編譯cmake簡單,搞了個簡單腳本build.sh協(xié)助運行一下
測試的代碼,其內(nèi)容為:acl初始化后讀取device數(shù)量,并設(shè)置要用的device,依次創(chuàng)建Context和Stream等,并按照創(chuàng)建順序的逆序銷毀。
這里切用戶踩了一個小坑,就是發(fā)現(xiàn)切完沒有用戶,搗鼓了半天,突然看到網(wǎng)上有人建議輸入 bash 一下,才出來用戶?

運行build.sh?

生成makefile文件,輸入make?

在out下生成了main執(zhí)行文件,運行它?

發(fā)現(xiàn)報錯,在社區(qū)文檔中查詢aclError?

于是我們創(chuàng)建該文件,再次運行。運行成功?

ps:該文僅是為了記錄CANN訓(xùn)練營的學(xué)習(xí)過程所用,不參與任何商業(yè)用途,有代碼問題可以私下與我交流修改