級形狀重解釋(Bitwise Reshape))
CANN PTO 指令 TRESHAPE 詳解Tile 的零拷貝字節(jié)級形狀重解釋Bitwise Reshape【免費(fèi)下載鏈接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.項(xiàng)目地址: https://gitcode.com/cann/pto-isaTRESHAPE 是 Parallel Tile OperationPTO虛擬指令集中用于字節(jié)級重解釋的指令它不搬運(yùn)、不計(jì)算只是把同一塊底層字節(jié)以另一種 Tile 類型/形狀重新看待是算子開發(fā)中實(shí)現(xiàn)零拷貝視圖變換的核心工具。本文基于倉庫 docs/isa/TRESHAPE.md 展開結(jié)合 CPU 模擬器與 Ascend A2/A3、A5 等平臺的底層實(shí)現(xiàn)和測試用例說明其匯編語法、C 內(nèi)建接口、編譯期約束、后端實(shí)現(xiàn)原理與典型用法讀完即可在自己的 PTO 算子里安全使用 TRESHAPE 完成形狀重構(gòu)。指令概述為什么需要位級reshapeTRESHAPETile Reshape的語義一句話概括將 Tile 重新解釋為另一種 Tile 類型/形狀同時(shí)保留底層字節(jié)不變。它是bitwise操作不改變?nèi)魏螖?shù)值只改變同一段字節(jié)緩沖被看待的方式它不做數(shù)據(jù)搬移、不做類型轉(zhuǎn)換運(yùn)算因此理論上代價(jià)極低可視為一次視圖或別名操作它適用于需要以不同張量形狀訪問同一份數(shù)據(jù)、又希望避免顯式拷貝/重排的場景例如把float 16×16的 Tile 直接當(dāng)作float 8×32來訪問。匯編語法從 PTO 匯編到 DPS 三級別基礎(chǔ) PTO 匯編形式%dst treshape %src : !pto.tile...AS Level 1SSA 形式SSA 形式顯式給出輸入與輸出 Tile 類型%dst pto.treshape %src : !pto.tile... - !pto.tile...AS Level 2DPS 形式DPSDataflow/dual-operand 風(fēng)格形式以ins/outs聲明數(shù)據(jù)流pto.treshape ins(%src : !pto.tile_buf...) outs(%dst : !pto.tile_buf...)自動模式與手動模式PTO 支持兩種資源管理方式詳見 docs/isa/conventions.md 的指令約定自動模式Auto ModeTile 的放置與調(diào)度由編譯器/運(yùn)行時(shí)統(tǒng)一管理只需寫出指令本身# Auto mode: compiler/runtime-managed placement and scheduling. %dst pto.treshape %src : !pto.tile... - !pto.tile...手動模式Manual Mode必須先顯式綁定資源再發(fā)射指令。當(dāng)指令包含 Tile 操作數(shù)時(shí)可用pto.tassign把邏輯值綁定到具體地址示例中的地址僅為演示# Manual mode: resources must be bound explicitly before issuing the instruction. # Optional for tile operands: # pto.tassign %arg0, tile(0x1000) # pto.tassign %arg1, tile(0x2000) %dst pto.treshape %src : !pto.tile... - !pto.tile...C 內(nèi)建接口在算子代碼中調(diào)用 TRESHAPEPTO 提供了與匯編一一對應(yīng)的 C 內(nèi)建接口。公共包含頭為pto/pto-inst.hpp見 include/pto/pto-inst.hpp內(nèi)部聲明位于 include/pto/common/pto_instr.hpptemplate typename TileDataOut, typename TileDataIn, typename... WaitEvents PTO_INST RecordEvent TRESHAPE(TileDataOut dst, TileDataIn src, WaitEvents ... events);接口要點(diǎn)模板參數(shù)TileDataOut/TileDataIn由編譯器從實(shí)參推導(dǎo)均為Tile類型is_tile_data_v約束可變參數(shù)WaitEvents... events用于事件同步實(shí)現(xiàn)中先調(diào)用detail::PtoWaitEvents(events...)等待相關(guān)事件再通過MAP_INSTR_IMPL(TRESHAPE, dst, src)宏分發(fā)到目標(biāo)平臺的TRESHAPE_IMPL實(shí)現(xiàn)見 include/pto/common/pto_instr.hpp#L2075-L2081返回值RecordEvent可繼續(xù)作為后續(xù)指令的等待事件形成依賴鏈。編譯期約束由 TRESHAPE_IMPL 強(qiáng)制執(zhí)行TRESHAPE 的所有約束都在編譯期以static_assert形式由TRESHAPE_IMPL強(qiáng)制執(zhí)行不合法用法直接編譯失敗約束說明對應(yīng)斷言Tile 類型必須匹配輸入與輸出 Tile 的LocTileType必須一致Loc NewLoc總字節(jié)數(shù)必須匹配輸入與輸出的元素大小 × 元素個(gè)數(shù)相等sizeof(InElem) * InNumel sizeof(OutElem) * OutNumel元素類型必須兼容去掉const后類型相同或同為浮點(diǎn)、同為整型CPU 后端額外約束std::is_same_v...或同類別檢查禁止 boxed/non-boxed 互轉(zhuǎn)不能在SLayout::NoneBox與 boxed 布局之間 reshapeSFractal兩側(cè)同為 NoneBox 或同為 boxed前三/四條約束的完整實(shí)現(xiàn)見 include/pto/cpu/TReshape.hpp#L35-L50CPU 后端NPU A2/A3 后端版本見 include/pto/npu/a2a3/TReshape.hpp#L40-L49。文檔中列出的約束為Tile 類型匹配、字節(jié)數(shù)匹配、禁止 boxed/non-boxed 轉(zhuǎn)換三條源碼實(shí)現(xiàn)還額外對元素類型類別做了兼容性檢查浮點(diǎn)/整型類別內(nèi)允許重解釋跨類別禁止使用時(shí)應(yīng)一并遵守。由于 reshape 不改變字節(jié)布局含義它不產(chǎn)生數(shù)值誤差也沒有有效區(qū)域之外的寫入行為除非另有說明其數(shù)學(xué)語義定義在有效區(qū)域上目標(biāo)相關(guān)的邊界行為標(biāo)記為實(shí)現(xiàn)定義見 docs/isa/TRESHAPE.md 的 Math Interpretation 說明。后端實(shí)現(xiàn)原理CPU 模擬與 NPU 上的別名語義CPU 模擬后端CPU 后端的TRESHAPE_IMPL位于 include/pto/cpu/TReshape.hpp。從源碼結(jié)構(gòu)看在__CPU_SIM分支下實(shí)現(xiàn)為指針別名dst.data() reinterpret_castNewElemType*(src.data())即dst直接引用src的底層存儲在非__CPU_SIM分支通用回退路徑下則按字節(jié)逐元素拷貝N sizeof(ElemType) * ElemNum個(gè)字節(jié)到dst文檔所述byte-for-byte copy對應(yīng)此路徑。因此在使用 CPU 模擬器做功能驗(yàn)證時(shí)dst與src共享同一塊底層存儲對任一方的寫入對另一方立即可見。NPU A2/A3 及 A5/A6 后端NPU 側(cè)的實(shí)現(xiàn)位于 include/pto/npu/a2a3/TReshape.hpp非自動模式__PTO_AUTO__未定義下實(shí)現(xiàn)為TASSIGN_IMPL(dst, reinterpret_castuintptr_t(src.data()))即把src的數(shù)據(jù)地址直接賦給dst二者引用同一底層存儲是名副其實(shí)的別名/零拷貝實(shí)現(xiàn)自動模式__PTO_AUTO__下通過__cce_alias(dst.data(), src.data(), 0)向編譯器聲明別名關(guān)系供編譯器做別名分析與優(yōu)化。A5 平臺通過 include/pto/npu/a5/TReshape.hpp 直接復(fù)用 A2/A3 的實(shí)現(xiàn)A6 平臺也提供了對應(yīng)的 include/pto/npu/a6/TReshape.hpp。可以推斷在 Ascend 各 NPU 平臺上 TRESHAPE 均以指向同一存儲的別名方式實(shí)現(xiàn)運(yùn)行時(shí)開銷趨近于零。完整示例16×16 → 8×32 的形狀重解釋以下示例來自 docs/isa/TRESHAPE.md展示把float 16×16的 Tile 重新解釋為float 8×32#include pto/pto-inst.hpp using namespace pto; void example() { using Src TileTileType::Vec, float, 16, 16; using Dst TileTileType::Vec, float, 8, 32; static_assert(Src::Numel Dst::Numel); Src src; Dst dst; TRESHAPE(dst, src); }要點(diǎn)Src::Numel256與Dst::Numel256相等滿足總字節(jié)數(shù)匹配約束sizeof(float) * 256 sizeof(float) * 256兩個(gè) Tile 的Loc均為TileType::Vec滿足Tile 類型匹配元素類型同為float滿足元素兼容性檢查若改為整型與浮點(diǎn)互轉(zhuǎn)將在編譯期被static_assert拒絕。測試驗(yàn)證別名語義的可觀測證據(jù)倉庫在 CPU 模擬器測試中專門覆蓋了 TRESHAPE 的別名行為測試文件為 tests/cpu/st/testcase/treshape/main.cpp。核心用例AliasesBackingStorageInCpuSim構(gòu)造SrcTile TileTileType::Vec, float, 2, 16與DstTile TileTileType::Vec, float, 1, 32元素總數(shù)均為 32滿足字節(jié)匹配對src逐元素寫入數(shù)據(jù)后執(zhí)行TRESHAPE(dst, src)斷言dst.data() src.data()通過src.data()[17] 123.0f后從dst讀回相同值、以及反向?qū)懭腧?yàn)證雙向可見從而證明二者共享同一底層存儲。該測試說明在 CPU 模擬路徑上TRESHAPE 的語義與 NPU 一致——零拷貝、共享存儲開發(fā)者可以在模擬器上放心驗(yàn)證依賴別名語義的邏輯。使用建議與注意事項(xiàng)優(yōu)先用于視圖變換而非數(shù)據(jù)復(fù)制TRESHAPE 是換視角而非搬數(shù)據(jù)適合在需要以不同形狀訪問同一緩沖時(shí)使用若需要真正獨(dú)立的副本請改用顯式拷貝指令嚴(yán)格遵守編譯期約束Tile 類型Loc、總字節(jié)數(shù)、元素類型類別、boxed/non-boxed 布局一致性均由static_assert在編譯期把關(guān)代碼書寫時(shí)先做static_assert(Src::Numel Dst::Numel)之類的自檢可快速定位問題注意別名帶來的寫副作用在 NPU 與 CPU 模擬器上dst與src共享存儲對dst的寫會同時(shí)改變src的內(nèi)容需要原值時(shí)應(yīng)在 reshape 前完成讀取或復(fù)制布局一致性不要嘗試在SLayout::NoneBox與 boxed 布局如分形布局之間 reshape——這類跨布局的視圖變換語義不成立應(yīng)在 reshape 之前/之后用專門的布局轉(zhuǎn)換指令完成。延伸閱讀指令約定與自動/手動模式說明docs/isa/conventions.mdTRESHAPE 底層依賴的地址賦值指令docs/isa/TASSIGN.mdTile 類型與TileTileType, T, ...模板的編程模型docs/coding/Tile.md公共內(nèi)建接口頭文件include/pto/pto-inst.hpp【免費(fèi)下載鏈接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.項(xiàng)目地址: https://gitcode.com/cann/pto-isa創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考