度中的作用)
opbase 平臺工具解析GetNddmaDcacheSize 獲取 NDDMA DCache 大小及其在 broadcast 調(diào)度中的作用【免費下載鏈接】opbase本項目是CANN算子庫的基礎(chǔ)框架庫為算子提供公共依賴文件和基礎(chǔ)調(diào)度能力。項目地址: https://gitcode.com/cann/opbase本篇介紹 CANN opbase 平臺信息獲取接口GetNddmaDcacheSize的函數(shù)原型、參數(shù)與返回值含義并結(jié)合 platform_util.h 的實際實現(xiàn)和 broadcast_tiling.h 中的真實調(diào)用說明該接口在算子 tiling 階段獲取 NDDMA DCache 容量、并據(jù)此決定 broadcast 走 NDDMA 還是 UB 通道的決策邏輯。讀完本文你將理解該接口的當(dāng)前取值來源、它在 platform 工具族中的定位以及它如何作為尾軸 4096B 閾值參與 kernel 類型選擇。功能說明GetNddmaDcacheSize用于獲取平臺 NDDMA DCache 的大小單位為 bytes。該接口屬于 platform 平臺信息獲取工具族與GetUbSize、GetCacheLineSize、GetWorkspaceSize等接口并列供算子 host 端tiling 階段查詢設(shè)備側(cè)的存儲/緩存參數(shù)。函數(shù)原型template typename T uint32_t GetNddmaDcacheSize([[maybe_unused]] const T *context)聲明位置platform_util.h處于Ops::Base命名空間內(nèi)。參數(shù)說明參數(shù)名輸入/輸出說明context輸入Tiling 的上下文信息類型為TilingContext/TilingParseContext。從源碼結(jié)構(gòu)看該模板參數(shù)標(biāo)記為[[maybe_unused]]即當(dāng)前實現(xiàn)并不實際讀取 context 的內(nèi)容。這與同文件中GetUbBlockSize、GetVRegSize、GetCacheLineSize等同樣返回固定常量的接口風(fēng)格一致而GetAivCoreNum、GetUbSize等需要查詢平臺信息的接口則會對 context 做非空校驗并調(diào)用context-GetPlatformInfo()獲取真實硬件參數(shù)。因此GetNddmaDcacheSize的 template 參數(shù)T主要起占位與統(tǒng)一調(diào)用形態(tài)的作用便于與其他 platform 接口以相同方式調(diào)用。返回值說明uint32_t返回平臺 NDDMA DCache 大小當(dāng)前為 8192 bytes。對應(yīng)源碼實現(xiàn)/** * Get the dcache size of nddma */ template typename T uint32_t GetNddmaDcacheSize([[maybe_unused]] const T* context) { return 8192U; }參見 platform_util.h。當(dāng)前實現(xiàn)直接返回常量8192U即 8KB不依賴 context 傳入的上下文信息。約束說明官方文檔標(biāo)注為無。結(jié)合實現(xiàn)可以推斷調(diào)用時傳入的 context 可以為任意指針包括nullptr函數(shù)內(nèi)部不會解引用它因此不存在空指針風(fēng)險。調(diào)用示例關(guān)鍵代碼示例如下僅供參考不支持直接拷貝運行compileInfo-nddmaDcacheSize GetNddmaDcacheSize(context_);真實調(diào)用鏈broadcast tiling 的 kernel 類型選擇該接口在倉庫中最典型的調(diào)用點是 broadcast 類算子的 tiling 實現(xiàn) broadcast_tiling.h。其中IsBigNLastBrc()方法L526-L557用于判斷是否為 nlast broadcast 且尾軸較大的場景auto inputDesc context_-GetInputDesc(i); OP_CHECK_NULL_WITH_CONTEXT(context_, inputDesc); auto inputDtype inputDesc-GetDataType(); int64_t dTypeSize ge::GetSizeByDataType(inputDtype); int64_t nddmaDcacheSize static_castint64_t(Ops::Base::GetNddmaDcacheSize(context_)); // 判斷尾軸是否大于nddma dcache size 的一半 if (tilingData.dims[i].back() * dTypeSize nddmaDcacheSize / VALUE_TWO) { return true; }其判定邏輯是對 copyInBrc 輸入若除尾軸外存在 broadcast 軸則計算尾軸的字節(jié)數(shù)尾軸元素數(shù) × 單元素字節(jié)數(shù)當(dāng)尾軸字節(jié)數(shù)大于等于 NDDMA DCache 大小的一半即 8192 / 2 4096 bytes時返回 true。IsBigNLastBrc()的結(jié)果進一步被IsUbBroadcast()消費L567 起其決策優(yōu)先級為——若顯式設(shè)置了kernelType以kernelType為準(zhǔn)KERNEL_TYPE_NDDMA/KERNEL_TYPE_UB_BROADCAST定義見 broadcast_tiling_base.h所有輸入都不需要 broadcast 時走 NDDMA沒有 copyInBrc 節(jié)點時走 NDDMA命中 nlastBig 場景即IsBigNLastBrc()為 true則走 UB broadcastB8/B16 且尾軸對齊場景走 UB broadcast。也就是說NDDMA DCache 的 8KB 容量直接派生出 4096B 的尾軸閾值當(dāng)輸入尾軸足夠大、可能超出 NDDMA 搬運效率區(qū)間時調(diào)度器傾向于切換到 UB broadcast 路徑從而將緩存容量參數(shù)轉(zhuǎn)化為實際的 kernel 選型依據(jù)。小結(jié)GetNddmaDcacheSize是 platform 工具族中的接口之一聲明于 include/op_common/op_host/util/platform_util.h文檔見 GetNddmaDcacheSize.md當(dāng)前實現(xiàn)返回固定常量 81928KBcontext 參數(shù)僅用于統(tǒng)一調(diào)用形態(tài)在 broadcast tiling 中該值的一半4096B被用作 nlast broadcast 場景的尾軸閾值參與 NDDMA / UB broadcast 兩條執(zhí)行路徑的選擇若后續(xù)版本改為從PlatformInfo查詢真實硬件值類似GetUbSize的實現(xiàn)方式調(diào)用方代碼可以保持不變這正是模板化接口設(shè)計的收益所在?!久赓M下載鏈接】opbase本項目是CANN算子庫的基礎(chǔ)框架庫為算子提供公共依賴文件和基礎(chǔ)調(diào)度能力。項目地址: https://gitcode.com/cann/opbase創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考