批量注冊算子 AI Core 配置)
AddConfigByArch 接口深度解析按 NPU 架構(gòu)批量注冊算子 AI Core 配置【免費下載鏈接】opbase本項目是CANN算子庫的基礎(chǔ)框架庫為算子提供公共依賴文件和基礎(chǔ)調(diào)度能力。項目地址: https://gitcode.com/cann/opbaseAddConfigByArch 是 CANN opbase 算子庫中ArchConfigHelper類的靜態(tài)成員函數(shù)用于在算子注冊O(shè)pDef 構(gòu)造階段按 NPU 架構(gòu)NpuArch一次性完成該架構(gòu)下所有 SoC 版本的 AI Core 配置注冊。本文以該接口為核心結(jié)合倉庫源碼逐層拆解其映射機制、參數(shù)語義與調(diào)用方式幫助讀者掌握在多 SoC 版本共存的算子庫中高效完成算子注冊的實戰(zhàn)方法。功能說明在 CANN 算子庫中一個算子往往需要適配多個 SoC 版本如 ascend910、ascend310p、ascend950 等。若逐個 SoC 調(diào)用AddConfig注冊代碼冗長且難以維護。AddConfigByArch將「架構(gòu) → SoC 版本」的映射關(guān)系內(nèi)置在接口內(nèi)部一對多開發(fā)者只需傳入一個 NPU 架構(gòu)常量即可完成該架構(gòu)對應(yīng)的所有 SoC 版本的注冊。該接口位于opbase命名空間下ArchConfigHelper類的靜態(tài)成員函數(shù)其類聲明與實現(xiàn)分別位于 op_arch_helper.h 與 op_arch_helper.cpp。接口內(nèi)部維護的「架構(gòu) → SoC 版本」映射表如下與 op_arch_helper.cpp 中g(shù)_archToSocNames定義一致NpuArch 常量Ops::Base 命名空間注冊的 SoC 版本DAV_1001ascend910DAV_2002ascend310pDAV_2201ascend910b、ascend910_93DAV_3002ascend310bDAV_3102ascend610liteDAV_3510ascend950從上表可見映射關(guān)系支持一對多DAV_2201一次調(diào)用即可同時注冊ascend910b與ascend910_93兩個 SoC 版本這正是該接口相對逐個調(diào)用AddConfig的核心價值所在。函數(shù)原型ArchConfigHelper提供了兩個重載版本static void AddConfigByArch(ops::OpAICoreDef aicore, NpuArch arch, ops::OpAICoreConfig aicoreConfig); static void AddConfigByArch(ops::OpAICoreDef aicore, NpuArch arch);三參數(shù)重載攜帶顯式的 AI Core 配置對象適用于需要定制配置如動態(tài)編譯、動態(tài)格式開關(guān)的場景兩參數(shù)重載不傳配置等價于對映射表內(nèi)各 SoC 版本分別調(diào)用AddConfig(soc)使用各 SoC 的默認(rèn)配置。參數(shù)說明參數(shù)名輸入/輸出說明aicore輸入/輸出算子的 AI Core 定義取 OpDef 實現(xiàn)類中this-AICore()的返回值。arch輸入NPU 架構(gòu)建議使用 op_const_def.h 中Ops::Base命名空間下定義的DAV_*常量。aicoreConfig輸入待注冊的 AI Core 配置不傳該參數(shù)時等價于對映射表內(nèi)各 SoC 版本分別調(diào)用AddConfig(soc)。其中aicore參數(shù)的類型為ops::OpAICoreDef即算子 AI Core 定義對象aicoreConfig為ops::OpAICoreConfig即待注冊的 AI Core 配置對象。arch參數(shù)的類型為NpuArch為枚舉型 NPU 架構(gòu)標(biāo)識。返回值說明無返回值void。接口的注冊結(jié)果體現(xiàn)在aicore對象內(nèi)部的狀態(tài)上。約束說明使用該接口時需注意以下約束入?yún)rch不在映射表內(nèi)時不注冊任何 SoC 版本接口直接返回不會報錯也不產(chǎn)生副作用該接口用于算子注冊O(shè)pDef 構(gòu)造階段不適用于 Tiling 階段傳入aicoreConfig的重載中同一個OpAICoreConfig對象會被注冊到映射表內(nèi)的所有 SoC 版本即多個 SoC 版本共享同一份配置。調(diào)用示例以下為官方文檔中的關(guān)鍵代碼示例僅供參考不支持直接拷貝運行#include op_common/op_host/util/op_arch_helper.h class HistogramV2 : public OpDef { public: explicit HistogramV2(const char* name) : OpDef(name) { // ... 算子輸入輸出與屬性定義 ... OpAICoreConfig aicoreConfig; aicoreConfig.DynamicCompileStaticFlag(true).DynamicFormatFlag(true); // 一次調(diào)用同時注冊ascend910b與ascend910_93 opbase::ArchConfigHelper::AddConfigByArch(this-AICore(), Ops::Base::DAV_2201, aicoreConfig); // 注冊ascend950使用默認(rèn)配置 opbase::ArchConfigHelper::AddConfigByArch(this-AICore(), Ops::Base::DAV_3510); } };示例要點解析頭文件包含op_arch_helper.h 本身已包含op_const_def.h因此Ops::Base::DAV_2201等常量可直接使用配置定制OpAICoreConfig支持鏈?zhǔn)秸{(diào)用示例中開啟了動態(tài)編譯靜態(tài)標(biāo)志DynamicCompileStaticFlag與動態(tài)格式標(biāo)志DynamicFormatFlag批量注冊DAV_2201一次調(diào)用同時覆蓋ascend910b與ascend910_93默認(rèn)配置DAV_3510使用兩參數(shù)重載走默認(rèn)配置注冊ascend950。源碼實現(xiàn)深入映射表與注冊循環(huán)結(jié)合 op_arch_helper.cpp可以看清接口的底層實現(xiàn)邏輯。映射表定義于匿名命名空間中以std::mapNpuArch, std::vectorstd::string存儲「架構(gòu) → SoC 版本名列表」const std::mapNpuArch, std::vectorstd::string g_archToSocNames { {Ops::Base::DAV_1001, {ascend910}}, {Ops::Base::DAV_2002, {ascend310p}}, {Ops::Base::DAV_2201, {ascend910b, ascend910_93}}, {Ops::Base::DAV_3002, {ascend310b}}, {Ops::Base::DAV_3102, {ascend610lite}}, {Ops::Base::DAV_3510, {ascend950}}, };兩個重載的實現(xiàn)結(jié)構(gòu)完全對稱先在g_archToSocNames中查找入?yún)rch若未找到iter g_archToSocNames.end()直接return不注冊任何 SoC——這與「約束說明」中描述的冪等行為一致若找到則遍歷該架構(gòu)對應(yīng)的 SoC 版本名列表逐個調(diào)用aicore.AddConfig(socName.c_str(), aicoreConfig)三參數(shù)版本或aicore.AddConfig(socName.c_str())兩參數(shù)版本。由此可以確認(rèn)AddConfigByArch本質(zhì)上是對OpAICoreDef::AddConfig的批量封裝它將「架構(gòu)常量 → 多個 SoC 名」的映射集中收斂到一處避免了在每個算子實現(xiàn)中重復(fù)書寫多個 SoC 字符串降低了拼寫錯誤與遺漏注冊的風(fēng)險。DAV_* 架構(gòu)常量與映射范圍Ops::Base命名空間下的DAV_*常量統(tǒng)一定義于 op_const_def.h均為constexpr ::NpuArch常量例如constexpr ::NpuArch DAV_1001 static_cast::NpuArch(1001); constexpr ::NpuArch DAV_2201 static_cast::NpuArch(2201); constexpr ::NpuArch DAV_3510 static_cast::NpuArch(3510);該頭文件共定義了 24 個DAV_*常量DAV_1001DAV_9301等。但需要注意只有映射表中列出的 6 個架構(gòu)常量DAV_1001、DAV_2002、DAV_2201、DAV_3002、DAV_3102、DAV_3510在AddConfigByArch中有效傳入其他常量如DAV_1002、DAV_3801時接口會因查找失敗而靜默返回。因此在使用前應(yīng)先對照映射表確認(rèn)目標(biāo)架構(gòu)是否受支持。適用場景與使用建議多 SoC 算子的注冊入口當(dāng)算子的 OpDef 需要同時覆蓋同架構(gòu)下的多個 SoC 版本典型如DAV_2201→ ascend910b ascend910_93時優(yōu)先使用AddConfigByArch而非逐個AddConfig注冊階段專用該接口面向 OpDef 構(gòu)造階段算子注冊Tiling 階段不應(yīng)使用共享配置語義三參數(shù)重載會將同一個OpAICoreConfig對象應(yīng)用到該架構(gòu)下所有 SoC 版本若不同 SoC 需要差異化配置仍需回到逐個AddConfig的方式統(tǒng)一配置偏好當(dāng)所有 SoC 版本均使用默認(rèn)配置時直接使用兩參數(shù)重載代碼最為簡潔。相關(guān)資源接口文檔AddConfigByArch.md、英文版op_host 接口總覽op_host.mdop_common 公共接口說明op_common_api_introduction.md、0_op_common_list.md接口聲明op_arch_helper.h接口實現(xiàn)op_arch_helper.cpp架構(gòu)常量定義op_const_def.h【免費下載鏈接】opbase本項目是CANN算子庫的基礎(chǔ)框架庫為算子提供公共依賴文件和基礎(chǔ)調(diào)度能力。項目地址: https://gitcode.com/cann/opbase創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考