造 KernelContext 的輸入指針設(shè)置)
人工智能深度學(xué)習(xí)算子庫(kù)CANNAscend【免費(fèi)下載鏈接】asc-devkit本項(xiàng)目是CANN 推出的昇騰AI處理器專用的算子程序開(kāi)發(fā)語(yǔ)言原生支持C和C標(biāo)準(zhǔn)規(guī)范主要由類庫(kù)和語(yǔ)言擴(kuò)展層構(gòu)成提供多層級(jí)API滿足多維場(chǎng)景算子開(kāi)發(fā)訴求。項(xiàng)目地址https://gitcode.com/cann/asc-devkit點(diǎn)擊查看免費(fèi)下載在 asc-devkit 的 Tiling 調(diào)測(cè)Utils-API / Tiling_tuning體系中開(kāi)發(fā)者經(jīng)常需要在脫離完整圖執(zhí)行引擎的情況下獨(dú)立驗(yàn)證自己編寫的 Tiling 函數(shù)與 TilingParse 函數(shù)。ContextBuilder類就是為此提供的上下文手工構(gòu)造工具而Inputs是其“kernel context builder”分組中的第一個(gè)接口它把一組void*指針組成的 vector 設(shè)置為 KernelContext 的 inputs。讀完本文你可以掌握Inputs的原型、參數(shù)語(yǔ)義與調(diào)用方式并結(jié)合 context_builder.h、context_builder.cpp 與單元測(cè)試 test_tiling.cpp 理解它內(nèi)部的轉(zhuǎn)發(fā)鏈路以及它與Outputs、BuildKernelRunContext配合使用時(shí)的完整調(diào)用鏈。功能定位Inputs 屬于哪一類構(gòu)造器ContextBuilder位于context_ascendc命名空間提供一系列鏈?zhǔn)?API支持兩類上下文的手工構(gòu)造見(jiàn) ContextBuilder 簡(jiǎn)介KernelContext 構(gòu)造用于TilingParse函數(shù)的驗(yàn)證相關(guān)接口為Inputs、Outputs、BuildKernelRunContextTilingContext 構(gòu)造用于 Tiling 函數(shù)的驗(yàn)證相關(guān)接口為SetOpNameType、NodeIoNum、AddInputTd、AddOutputTd、AddAttr、TilingData、Workspace、BuildTilingContext等。Inputs屬于前者。從 context_builder.h 的類聲明可以看到ContextBuilder將方法按注釋分組class ContextBuilder { public: // kernel context builder ContextBuilder Inputs(std::vectorvoid * inputs); ContextBuilder Outputs(std::vectorvoid * outputs); std::shared_ptrKernelRunContextHolder BuildKernelRunContext(); // OpInfo ... // Tiling Context Builder ... private: std::unique_ptrContextBuilderImpl impl_; };其中ContextBuilder禁止了移動(dòng)構(gòu)造與移動(dòng)賦值delete是一個(gè)以內(nèi)部ContextBuilderImplpimpl 模式為存儲(chǔ)核心的值類型對(duì)象。函數(shù)原型與參數(shù)說(shuō)明Inputs的函數(shù)原型為ContextBuilder Inputs(std::vectorvoid * inputs);參數(shù)說(shuō)明繼承自 Inputs.md 原文檔參數(shù)輸入/輸出說(shuō)明inputs輸入保存輸入的 void* 指針 vector返回值說(shuō)明當(dāng)前ContextBuilder的對(duì)象即*this的引用。這也是ContextBuilder全族接口的設(shè)計(jì)約定——所有 Setter 類方法均返回自身引用從而支持.Inputs(...).Outputs(...).BuildKernelRunContext()這樣的鏈?zhǔn)秸{(diào)用。約束說(shuō)明無(wú)原文檔約束為“無(wú)”。但從源碼結(jié)構(gòu)看接口內(nèi)部做了防御性檢查下文“實(shí)現(xiàn)剖析”一節(jié)會(huì)具體說(shuō)明。實(shí)現(xiàn)剖析Inputs 的轉(zhuǎn)發(fā)鏈路Inputs的公有實(shí)現(xiàn)位于 context_builder.cppContextBuilder ContextBuilder::Inputs(std::vectorvoid* inputs) { ASCENDC_ASSERT(impl_ ! nullptr, return *this, CXT_ASCENDC_LOGE(impl_ is nullptr!)); impl_-Inputs(inputs); return *this; }從源碼可以看到兩層設(shè)計(jì)空指針?lè)烙m然文檔約束說(shuō)明為“無(wú)”但實(shí)現(xiàn)上通過(guò)ASCENDC_ASSERT斷言內(nèi)部impl_非空若斷言失敗會(huì)打印錯(cuò)誤日志impl_ is nullptr!并直接返回*this不會(huì)使程序崩潰。這意味著即使出現(xiàn)內(nèi)部狀態(tài)異常鏈?zhǔn)秸{(diào)用也能安全地繼續(xù)走下去錯(cuò)誤在最終的BuildKernelRunContext階段以返回nullptr的形式暴露。pimpl 轉(zhuǎn)發(fā)真正的邏輯委托給ContextBuilderImpl::Inputs其定義在 context_builder_impl.cppvoid ContextBuilderImpl::Inputs(std::vectorvoid* inputs) { ASCENDC_ASSERT(kernelCtxBuilder_ ! nullptr, return, CXT_ASCENDC_LOGE(kernelCtxBuilder_ is nullptr!)); kernelCtxBuilder_-Inputs(inputs); }kernelCtxBuilder_是gert::OpKernelContextBuilder類型在 ContextBuilderImpl 構(gòu)造函數(shù) 中創(chuàng)建ContextBuilderImpl::ContextBuilderImpl() { kernelCtxBuilder_ std::make_uniquegert::OpKernelContextBuilder(); tilingCtxBuilder_ std::make_uniquegert::OpTilingContextBuilder(); tilingCtxBuilder_-OpName(default_name).OpType(default_type).IONum(1, 1); tilingCtxBuilder_-CompileInfo(default_compileinfo).PlatformInfo(default_platforminfo); kernelCtxBuilder_-OpName(default_name).OpType(default_type).IONum(1, 1); }因此完整的調(diào)用鏈為ContextBuilder::Inputs→ContextBuilderImpl::Inputs→gert::OpKernelContextBuilder::Inputs。指針 vector 最終被保存在底層的OpKernelContextBuilder中等待BuildKernelRunContext觸發(fā)kernelCtxBuilder_-Build()生成真正的gert::KernelContext對(duì)象見(jiàn) BuildKernelRunContext 實(shí)現(xiàn)。這里可以推斷inputs中每個(gè)元素指向的數(shù)據(jù)如 shape 結(jié)構(gòu)、TensorData結(jié)構(gòu)等由調(diào)用方負(fù)責(zé)其生命周期ContextBuilder只是保存指針本身這也是參數(shù)類型為void*而非具體結(jié)構(gòu)體的原因——它面向的是 TilingParse 約定的“第 N 個(gè)輸入?yún)?shù)地址”這一通用契約。調(diào)用示例原文檔給出的最小調(diào)用示例PlatformInfo platformInfo; auto contextBuilder context_ascendc::ContextBuilder().Inputs({nullptr, reinterpret_castvoid *(platformInfo)});示例中第一個(gè)元素為nullptr、第二個(gè)元素指向一個(gè)PlatformInfo對(duì)象演示了“按輸入序號(hào)放置參數(shù)指針”的用法。結(jié)合倉(cāng)庫(kù)單元測(cè)試 TestKernelContextBuild一個(gè)更貼近實(shí)戰(zhàn)的完整示例如下string active_type gelu; gert::Shape input1_shape {2, 1, 1, 1, 1, 1, 1, 2, 2}; int32_t input1_tensor_buffer[] {0, 2, 3, 3, 1, 0, 0, 1}; gert::TensorData input1_tensor_data{(void*)input1_tensor_buffer, nullptr}; gert::Shape output_shape {5, 3}; int64_t output_tensor_buffer[15]; gert::TensorData output_tensor_data{(void*)output_tensor_buffer, nullptr}; context_ascendc::ContextBuilder kernelRunContextBuilder; auto kernelHolder kernelRunContextBuilder .Inputs({reinterpret_castvoid*(input1_shape), reinterpret_castvoid*(input1_tensor_data)}) .Outputs({reinterpret_castvoid*(output_shape), reinterpret_castvoid*(output_tensor_data)}) .BuildKernelRunContext(); auto context kernelHolder-GetContextgert::KernelContext(); EXPECT_NE(context, nullptr);這段代碼演示了典型的 TilingParse 驗(yàn)證場(chǎng)景準(zhǔn)備兩個(gè)輸入?yún)?shù)gert::Shape輸入張量的 shape和gert::TensorData輸入張量數(shù)據(jù)內(nèi)部指向一個(gè)int32_t緩沖區(qū)調(diào)用Inputs時(shí)按 TilingParse 函數(shù)約定的輸入順序?qū)⒍叩刂贩湃?vector對(duì)稱地用Outputs設(shè)置輸出參數(shù)shape 與TensorData調(diào)用BuildKernelRunContext()得到KernelRunContextHolder的智能指針通過(guò)GetContextgert::KernelContext()取出上下文之后即可將其傳給 TilingParse 函數(shù)進(jìn)行驗(yàn)證。需要注意BuildKernelRunContext失敗時(shí)返回nullptr例如內(nèi)部構(gòu)建出錯(cuò)因此實(shí)際代碼中應(yīng)先判空再使用holder-GetContext...()。配套接口KernelRunContextHolder 與 OutputsInputs的產(chǎn)出最終由 KernelRunContextHolder 結(jié)構(gòu)體承載其定義見(jiàn) context_builder.hstruct KernelRunContextHolder { KernelRunContextHolder(); ~KernelRunContextHolder(); templatetypename T T *GetContext() const { return reinterpret_castT*(kernelContext); } gert::ComputeNodeInfo *MutableComputeNodeInfo(); std::unique_ptrValueHolderImpl valueHolder; std::unique_ptruint8_t[] computeNodeExtendHolder; KernelRunContext *context {nullptr}; // ...私有成員與私有構(gòu)造函數(shù)略 };關(guān)鍵成員與方法的含義GetContextT()將內(nèi)部kernelContext成員轉(zhuǎn)換為模板類型T的指針。T可選KernelContext及其子類如TilingContextMutableComputeNodeInfo()返回構(gòu)造出的gert::ComputeNodeInfo類指針valueHolder保證KernelRunContextHolder內(nèi)部值不析構(gòu)的智能指針computeNodeExtendHolder可轉(zhuǎn)化成ComputeNodeInfo類的智能指針context指向KernelRunContext類的指針。與Inputs配對(duì)的Outputs將void*指針 vector 設(shè)置為 KernelContext 的 outputs原型與語(yǔ)義完全對(duì)稱ContextBuilder Outputs(std::vectorvoid * outputs);兩者均返回當(dāng)前ContextBuilder對(duì)象且通常必須與BuildKernelRunContext組合使用才能拿到可用上下文。小結(jié)與驗(yàn)證入口ContextBuilder::Inputs是 Tiling 調(diào)測(cè)中“無(wú)框架手工構(gòu)造 KernelContext”三步曲Inputs→Outputs→BuildKernelRunContext的第一步。理解它時(shí)把握三點(diǎn)即可參數(shù)是std::vectorvoid *按 TilingParse 約定的輸入順序存放各輸入?yún)?shù)shape、TensorData等的地址返回ContextBuilder用于鏈?zhǔn)秸{(diào)用內(nèi)部經(jīng)ContextBuilderImpl轉(zhuǎn)發(fā)至gert::OpKernelContextBuilder并在斷言失敗時(shí)優(yōu)雅降級(jí)返回自身/空指針而不崩潰。相關(guān)的倉(cāng)庫(kù)驗(yàn)證入口包括頭文件聲明context_builder.h公有實(shí)現(xiàn)context_builder.cpp內(nèi)部實(shí)現(xiàn)context_builder_impl.cpp單元測(cè)試test_tiling.cppTestKernelContextBuild用例接口文檔族ContextBuilder.md、BuildKernelRunContext.md、Outputs.md贊分享人工智能深度學(xué)習(xí)算子庫(kù)CANNAscend【免費(fèi)下載鏈接】asc-devkit本項(xiàng)目是CANN 推出的昇騰AI處理器專用的算子程序開(kāi)發(fā)語(yǔ)言原生支持C和C標(biāo)準(zhǔn)規(guī)范主要由類庫(kù)和語(yǔ)言擴(kuò)展層構(gòu)成提供多層級(jí)API滿足多維場(chǎng)景算子開(kāi)發(fā)訴求。項(xiàng)目地址https://gitcode.com/cann/asc-devkit點(diǎn)擊查看免費(fèi)下載相關(guān)推薦asc-devkit Tiling 調(diào)測(cè)實(shí)踐ContextBuilder::AddInputTd 輸入 Tensor 描述接口詳解asc devkit Tiling 調(diào)測(cè)實(shí)踐ContextBuilder::AddInputTd 輸入 Tensor 描述接口詳解 在算子 Tiling 函數(shù)人工智能深度學(xué)習(xí)算子庫(kù)CANNAscendasc-devkit Tiling 調(diào)優(yōu)指南ContextBuilder::AddAttr 接口詳解與 TilingContext 屬性構(gòu)造實(shí)戰(zhàn)asc devkit Tiling 調(diào)優(yōu)指南ContextBuilder::AddAttr 接口詳解與 TilingContext 屬性構(gòu)造實(shí)戰(zhàn) 在 asc人工智能深度學(xué)習(xí)算子庫(kù)CANNAscendasc-devkit 中 ContextBuilder::CompileInfo 接口詳解向 TilingContext 注入編譯期信息的完整用法與源碼解析asc devkit 中 ContextBuilder::CompileInfo 接口詳解向 TilingContext 注入編譯期信息的完整用法與源碼解析人工智能深度學(xué)習(xí)算子庫(kù)CANNAscend上一篇Gatsby v2.27.0 發(fā)布解讀create-gatsby 交互式建站與 develop 開(kāi)發(fā)體驗(yàn)加速實(shí)驗(yàn)下一篇Tinycast 卸載應(yīng)用功能解析只進(jìn)廢紙簍、絕不刪除的 macOS 殘留清理設(shè)計(jì)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考