前言:2023年5月昇騰AI開(kāi)發(fā)者峰會(huì)上,昇騰CANN首席架構(gòu)師閆長(zhǎng)江老師解密了全新的TIK C算子編程體系肛搬。正好CANN訓(xùn)練營(yíng)開(kāi)設(shè)了TIK C算子開(kāi)發(fā)的課程,學(xué)習(xí)完成后再聽(tīng)大神的串講,有種豁然開(kāi)朗的感覺(jué)来涨。
CANN訓(xùn)練營(yíng)的TIK C算子課程參見(jiàn):
https://www.hiascend.com/zh/developer/courses/detail/1627494761683783682
????????閆老師的演講包括三部分內(nèi)容:第一部分是基礎(chǔ)概念塔橡,包括CANN的基礎(chǔ)知識(shí)梅割,以及Ascend C算子并行計(jì)算的硬件和理論基礎(chǔ);第二部分講述了Ascend C算子編程的關(guān)鍵概念(核函數(shù)和編程范式)和編程實(shí)踐葛家,以及算子測(cè)試程序的編程方法户辞;第三部分講述了Ascend C算子在cpu和npu上的孿生調(diào)試。
????????下面是老師演講的PPT惦银。
一咆课、基礎(chǔ)知識(shí)
一)異構(gòu)計(jì)算架構(gòu)CANN
二)算子的硬件基礎(chǔ)
????????下面這張圖末誓,清晰展示了AICore的內(nèi)部架構(gòu)及模塊功能,也講述了Global Mem和Local Mem的關(guān)系书蚪,Local Mem靠近計(jì)算單元喇澡,帶寬非常高,但容量不大殊校,一般是幾百KB到幾MB晴玖;而Global Mem容量大,但帶寬不高为流。因此需要將Global Mem的數(shù)據(jù)搬運(yùn)到Local Mem上呕屎,進(jìn)行運(yùn)算,運(yùn)算完成后再將運(yùn)算結(jié)構(gòu)從Local Mem搬運(yùn)到Global Mem上敬察。
下面這張圖講述了一個(gè)Aicore的內(nèi)部的計(jì)算單元秀睛,其中的向量和矩陣計(jì)算單元都是單指令多數(shù)據(jù)計(jì)算,也就是一個(gè)指令周期可以實(shí)現(xiàn)一組數(shù)據(jù)的加和乘莲祸。
三)并行計(jì)算? ? ? ??
????????下面這張圖蹂安,講述了并行計(jì)算中的兩種常見(jiàn)方法:SPMD和流水線,這兩種方法都會(huì)提現(xiàn)到Ascend C的編程模型和編程方法中锐帜。
二田盈、Ascend C算子編程
核函數(shù)體現(xiàn)的是SPMD的編程思想,同時(shí)簡(jiǎn)化了用戶的代碼實(shí)現(xiàn)缴阎。開(kāi)發(fā)代碼時(shí)允瞧,只需要寫單個(gè)AI Core核的實(shí)現(xiàn)代碼。
Ascend C算子采用標(biāo)準(zhǔn)的C++和一組專門的類庫(kù)API進(jìn)行編程的蛮拔。這些API包括計(jì)算的述暂,數(shù)據(jù)搬運(yùn)以及同步等操作的API。API的操作對(duì)象是Tensor语泽,Tensor根據(jù)存儲(chǔ)位置不同分為GlobalTensor和LocalTensor贸典。
????????TPIPE的編程范式,實(shí)現(xiàn)了前述的流水線方式的并行計(jì)算踱卵。
算子編寫完成后廊驼,可以通過(guò)host側(cè)的應(yīng)用開(kāi)發(fā)接口,調(diào)用開(kāi)發(fā)好的算子進(jìn)行測(cè)試惋砂,驗(yàn)證妒挎。
????????下圖講述的是直接調(diào)用核函數(shù)的方式進(jìn)行算子代碼測(cè)試的。包括CPU和NPU兩種測(cè)試方法西饵,通過(guò)“__CCE_KT_TEST__”宏定義區(qū)分是運(yùn)行在CPU上的代碼還是NPU上的代碼酝掩。
三、Ascend C算子孿生調(diào)試
????????TIK C算子的調(diào)試手段豐富眷柔,可以在CPU期虾,也可以在NPU上調(diào)試原朝。這就是算子的孿生調(diào)試技術(shù)。
一)CPU域調(diào)試調(diào)優(yōu)
????????在CPU側(cè)調(diào)試時(shí)镶苞,可以使用gdb工具進(jìn)行調(diào)試喳坠,還有指令LOG和NPUcheck主動(dòng)錯(cuò)誤分析工具兩大神器。指令log功能會(huì)把真正執(zhí)行的指令隊(duì)列列出來(lái)茂蚓,也就是在運(yùn)行CPU的核函數(shù)調(diào)用方式的編譯運(yùn)行后壕鹉,會(huì)生成*.cce的文件,數(shù)量和定義的AiCore的數(shù)量一致聋涨,里面記錄某個(gè)核上的實(shí)際指令序列晾浴。
二)NPU的仿真調(diào)試能力??
????????提供了強(qiáng)大的指令日志和數(shù)據(jù)日志功能,便于分析和調(diào)試問(wèn)題牍白。從下面的圖脊凰,可以看出double buffer的作用。
三)上板運(yùn)行調(diào)試能力:打印板上運(yùn)行統(tǒng)計(jì)淹朋,以及支持打印數(shù)據(jù)功能
最后笙各,閆老師對(duì)本次演講的內(nèi)容做了小結(jié):