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