【2023 · CANN訓(xùn)練營(yíng)第一季】?jī)?nèi)存管理&數(shù)據(jù)運(yùn)輸初探
2023 · CANN訓(xùn)練營(yíng)第一季】?jī)?nèi)存管理&數(shù)據(jù)運(yùn)輸初探
一、接口簡(jiǎn)介
Note:
1.在Device側(cè),任何用于參與ACL運(yùn)算的內(nèi)存,都不能用C/C++原生的(Malloc、new),需要調(diào)用ACL的內(nèi)存管理接口
2.所有的加速運(yùn)算(數(shù)據(jù)集、模型等)都在Device側(cè)運(yùn)行計(jì)算。
3.以下接口都有對(duì)應(yīng)的非同步接口,非同步接口查看是否完成需要用到aclrtSynchronizeStream查看是否Stream運(yùn)行完成
接口:
aclError aclrtMalloc(void devPtr, size_t size, aclrtMemMallocPolicy policy) //在Device上申請(qǐng)size大小的線(xiàn)性?xún)?nèi)存,通過(guò)*devPtr返回已分配內(nèi)存的指針,同步接口。通過(guò)該接口申請(qǐng)的Device內(nèi)存都支持cache緩存,不需要用戶(hù)處理cpu與npu之間的cache一致性。
aclError aclrtFree(void *devPtr)//釋放Device上的內(nèi)存,同步接口。只能釋放非Host端申請(qǐng)的內(nèi)存
aclError aclrtMallocHost(void hostPtr, size_t size) //應(yīng)用在Host上運(yùn)行時(shí),調(diào)用該接口申請(qǐng)的是Host內(nèi)存,由系統(tǒng)保證內(nèi)存首地址64字節(jié)對(duì)齊。在Device側(cè)用這個(gè)接口還是申請(qǐng)的device內(nèi)存,不過(guò)需要首地址用戶(hù)來(lái)對(duì)其64字節(jié)
aclError aclrtFreeHost(void *hostPtr) //釋放aclrtMallocHost申請(qǐng)的內(nèi)存,同步接口
aclError aclrtMemset (void *devPtr, size_t maxCount, int32_t value, size_t count) //初始化內(nèi)存,將內(nèi)存中的內(nèi)容設(shè)置為指定的值,同步接口。
aclError aclrtMemcpy(void *dst, size_t destMax, const void *src, size_t count, aclrtMemcpyKind kind) //實(shí)現(xiàn)Host內(nèi)、Host與Device之間、Device內(nèi)、Device間的同步內(nèi)存復(fù)制。
aclError aclrtGetMemInfo(aclrtMemAttr attr, size_t free, size_t total) //獲取指定屬性的內(nèi)存的空閑大小和總大小。同步接口。
二、代碼驗(yàn)證學(xué)習(xí)
Cmake編譯:?

運(yùn)行結(jié)果:?

三、速度測(cè)試
搬移速度測(cè)試如下:(只是簡(jiǎn)單測(cè)試。沒(méi)有測(cè)試的很全)

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