 GEMM+AllReduce 融合算子:A2/A3 雙流重疊實戰(zhàn)指南)
PTO 實現(xiàn) GEMMAllReduce 融合算子A2/A3 雙流重疊實戰(zhàn)指南【免費下載鏈接】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.項目地址: https://gitcode.com/cann/pto-isa導(dǎo)讀本指南以 CANN pto-isa 倉庫中的 kernels/manual/a2a3/gemm_ar 示例為主線講解如何在 A2/A3 芯片上使用 PTOParallel Tile Operation指令集實現(xiàn)多卡GEMM AllReduce融合算子。該示例通過計算流 通信流雙流設(shè)計與逐 tile 級別的信號量握手讓 GEMM 計算與跨卡 AllReduce 通信并發(fā)執(zhí)行在參考平臺上獲得約1.443x端到端加速。讀完本文你將掌握該算子的整體架構(gòu)、計算/通信內(nèi)核的關(guān)鍵實現(xiàn)、無鎖就緒隊列與 RDMA 窗口編程模型以及構(gòu)建、運行、調(diào)參與性能解讀的完整實戰(zhàn)方法。功能概述與算子規(guī)格示例實現(xiàn)的多卡融合語義為$$ C_{final} \sum_{i0}^{nranks-1} A_i \times B $$其中A_i為各 rank 私有的M x K矩陣B為所有 rank 共享的K x N矩陣C_i是本地 GEMM 結(jié)果C_final是 AllReduce 之后的最終M x N輸出。默認(rèn)矩陣配置定義在 gemm_ar_config.h 中M5416、K6144、N1408。算子規(guī)格如下ItemValueOpTypeGEMM AllReduceInputA_i:M x K,float16,ND每 rank 私有B:K x N,float16,DN共享OutputC_final:M x N,float16,NDAllReduce 結(jié)果Compute kernel nameGemmComputeKernelCube 架構(gòu)dav-c220-cubeComm kernel nameGemmCommAllKernelVector 架構(gòu)dav-c220-vec目錄布局kernels/manual/a2a3/gemm_ar/ ├── CMakeLists.txt # 構(gòu)建配置3 個 targetcube 內(nèi)核、vec 內(nèi)核、host 可執(zhí)行程序 ├── run.sh # 一鍵構(gòu)建運行腳本自動計算 HCCL_BUFFSIZE 并定位 MPI ├── gemm_ar_config.h # 全局配置矩陣形狀、tile 尺寸、block 數(shù)量 ├── main.cpp # 入口MPI 初始化、數(shù)據(jù)生成、HCCL 初始化、窗口分配、性能測量、驗證 ├── gemm_compute_kernel.cpp # GEMM 計算內(nèi)核Cube 側(cè)L0C FP32 - GM FP16 自動轉(zhuǎn)換 ├── comm_kernel.cpp # 通信內(nèi)核Vector 側(cè)單內(nèi)核內(nèi)重疊 RS/AG 的 AllReduce ├── kernel_launchers.h # host 側(cè)內(nèi)核 launcher 聲明 ├── common.hpp # 設(shè)備側(cè) HcclRemotePtr 封裝RDMA 窗口地址轉(zhuǎn)換 ├── comm_context.h # HcclDeviceContext 結(jié)構(gòu)每個 rank 的 RDMA 窗口地址 ├── ready_queue.hpp # 多 block 無鎖 tile 隊列計算 - 通信信令 └── comm_mpi.h # MPI 動態(tài)加載封裝dlopen/dlsym無硬鏈接依賴說明README 目錄清單中標(biāo)注的hccl_context.h在當(dāng)前倉庫中實際命名為 comm_context.h其中定義了CommDeviceContext內(nèi)含rankId、rankNum、winSize以及每個 rank 的windowsIn[HCCL_MAX_RANK_NUM]/windowsOut[]RDMA 窗口地址數(shù)組??傮w架構(gòu)雙流通信-計算重疊示例采用雙流設(shè)計Compute Stream 上運行GemmComputeKernel24 個 AIC 塊Comm Stream 上運行GemmCommAllKernel24 個 AIV 塊。PTO 通信指令直接操作 HCCL RDMA 窗口完成 AllReduce計算與通信之間通過逐 tile 信號量進(jìn)行流水線交接而非設(shè)備級全局屏障。┌──────────────────────────────────────────────────────────────────────────────┐ │ Compute Stream (24 AIC) Comm Stream (24 AIV) │ │ │ │ GemmComputeKernel: GemmCommAllKernel: │ │ ┌─────────────────────────┐ ┌──────────────────────────────┐ │ │ │ for each tile: │ │ RS/AG overlap loop │ │ │ │ K-loop (L1 - L0 - Cube) │ poll Ready Queue │ │ │ │ TSTORE - gemm_output │──Ready──→ │ TLOAD tile from gemm_output│ │ │ │ pipe_barrier(ALL) │ Queue │ TSTOREAtomicAdd - owner │ │ │ │ Enqueue tile_idx │ │ subtile-ready / summary │ │ │ └─────────────────────────┘ │ drain ready subtiles for AG│ │ │ │ TLOAD - TSTORE to remote │ │ │ │ ready-driven AG handoff │ │ │ │ subtile-level overlap │ │ │ │ │ │ │ └──────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────────────────┘從源碼角度看main.cpp中分別通過aclrtCreateStream創(chuàng)建computeStream與commStreamhost 側(cè)LaunchCompute調(diào)用launchGemmCompute見 gemm_compute_kernel.cpp 底部LaunchComm調(diào)用launchGemmCommAll見 comm_kernel.cpp 底部launcher 聲明統(tǒng)一放在 kernel_launchers.h 中。計算內(nèi)核實現(xiàn)細(xì)節(jié)計算內(nèi)核的時間流水線可概括為Time - L1 (MTE2): [TLOAD A0,B0] [TLOAD A1,B1] ... L0 (MTE1): [TEXTRACT k0] [k1] [k2] [k3] [TEXTRACT k0] ... Cube (M): [TMATMUL k0] [ACC k1] [ACC k2] [ACC k3] [TMATMUL k0] ... ^ full three-stage overlap ^每個 AIC 按block_idx x tiles_per_block方式領(lǐng)取 tile 子集對每個 tile 依次執(zhí)行Block Swizzle 映射SwizzleTileIndex()把線性 tile 索引映射為之字形遍歷順序奇數(shù)行反轉(zhuǎn)使相鄰 tile 在 L1 中復(fù)用矩陣B的列K 循環(huán)每stepKa4次迭代做一次批量TLOAD將 4 個 K 片拉入 L1之后每次用TEXTRACT取出一個 K 片到 L0再做TMATMUL/TMATMUL_ACC累加見ProcessKIteration()TSTOREL0C 中的 FP32 結(jié)果經(jīng) FixPipe 自動轉(zhuǎn)成 FP16 后寫回gemm_outputpipe_barrier(PIPE_ALL)確保 GM 寫完成MultiBlockEnqueueFast將tile_idx入隊通知通信內(nèi)核。源碼中相關(guān)常量與斷言位于 gemm_compute_kernel.cpp 的G_K_LOOP、G_STEP_KA/G_STEP_KB 4處static_assert強制G_K_LOOP可被stepK整除、stepKa stepKb且G_BASE_K固定為 64。tile 類型別名TileMatAData、TileMatBData、ResTileT分別對應(yīng) L1 面板、L0 切片與 L0C 累加器。通信內(nèi)核實現(xiàn)細(xì)節(jié)通信內(nèi)核GemmCommAllImpl()見 comm_kernel.cpp把 RSReduceScatter生產(chǎn)與 AGAllGather消費交織在同一個循環(huán)里同步點是逐 subtile 計數(shù)器而不是設(shè)備級屏障。RS 生產(chǎn)者路徑每個通信 block 認(rèn)領(lǐng)的隊列子集為queues(block b) { b, b num_comm_blocks, b 2*num_comm_blocks, ... }默認(rèn)COMPUTE_BLOCK_NUM COMM_BLOCK_NUM 24時退化為 1:1通信 block 更少時一個 block 通過RsPollQueues()/RsWaitOnQueue()輪詢多個計算隊列。對每個出隊的 tile沿M方向把 tile 拆成G_COMM_SUBTILES_PER_TILE G_BASE_M / G_COMM_SUB_M個定高 subtileRsPipelineStep()使用 ping/pong 兩塊 UB tile使當(dāng)前 subtile 的TLOAD與上一 subtile 的TSTOREAtomicAdd重疊RS 目的地是 owner rankowner tile_idx % nranks歸約直接寫進(jìn)該 rank 的reduced_output。RS/AG 重疊同步重疊協(xié)議使用 owner rank 的signal_matrix中的兩類計數(shù)器subtile-ready[local_subtile_id]統(tǒng)計有多少 rank 已對某個 owner-local subtile 完成 RSag-summary[summary_block]面向負(fù)責(zé)該 subtile 的 AG block 的粗粒度喚醒門鈴。發(fā)布側(cè)遵循RsPublishSubtileReady()先pipe_barrier(PIPE_ALL)沖刷本地流水線再dsb(DSB_DDR)保證reduced_output寫全局可見隨后RsNotifySubtileReady()遞增 owner-local 就緒計數(shù)、RsNotifyAgSummary()遞增由AgSummaryBlockForSubtile()選出的 AG 喚醒計數(shù)兩者底層均為pto::comm::TNOTIFY(..., NotifyOp::AtomicAdd)。消費側(cè)遵循AgDrainReadyAssignedSubtiles()用TTEST(..., nranks, GE)探測本 block 認(rèn)領(lǐng)的subtile-ready計數(shù)一次 drain pass 首次命中時只執(zhí)行一次 acquire fencepipe_barrier dsb即可消費該批全部就緒 subtile將每個就緒 subtile 搬運到所有遠(yuǎn)端 rank若無法推進(jìn)則AgWaitAssignedSummary()阻塞在summary_ack_count 1等待下一次分配的喚醒。AgSummaryBlockForSubtile()采用反轉(zhuǎn)條帶reversed-stripe映射讓 AG 重的 block 落在 RS 輕的 block 上從而拉平rs_work ag_work的組合負(fù)載。AG 執(zhí)行器路徑AG 工作在 owner-local subtile 空間分配total_local_subtiles my_tile_count * G_COMM_SUBTILES_PER_TILE assigned_ids(block b) { num_comm_blocks - 1 - b k*num_comm_blocks }對每個就緒的 assigned subtileAgDecodeLocalSubtile()把 owner-local subtile id 映射回reduced_output的全局行偏移AgTransferSubtileToAll()恰好向每個遠(yuǎn)端 rank 廣播G_COMM_SUB_M行首個遠(yuǎn)端 peer 按local_subtile_id % (nranks - 1)輪轉(zhuǎn)避免所有 block 同時錘擊同一目的地。該設(shè)計使 AG 可以在某個 owner-local subtile 被所有 rank 完全歸約后立即開始無需等待整卡 RS 結(jié)束。就緒隊列機制┌─────────────┐ ┌─────────────┐ │ AIC 0 │ │ AIV 0 │ │ (Compute) │──Queue──│ (Comm) │ │ block_idx0│ 0 │ block_idx0│ └─────────────┘ └─────────────┘ ┌─────────────┐ ┌─────────────┐ │ AIC 1 │ │ AIV 1 │ │ (Compute) │──Queue──│ (Comm) │ │ block_idx1│ 1 │ block_idx1│ └─────────────┘ └─────────────┘ ... ... ┌─────────────┐ ┌─────────────┐ │ AIC 23 │ │ AIV 23 │ │ (Compute) │──Queue──│ (Comm) │ │ block_idx23│ 23 │ block_idx23│ └─────────────┘ └─────────────┘實現(xiàn)位于 ready_queue.hpp每個隊列是 64 字節(jié)對齊的PerBlockQueue含count生產(chǎn)者側(cè)單調(diào)遞增計數(shù)與data[]tile 索引數(shù)組槽位通過GetQueueSlot()輔助函數(shù)尋址不依賴隱式的data[idx]布局假設(shè)生產(chǎn)者AICPerBlockQueueEnqueueFast通過GetQueueSlot()寫目標(biāo)槽再遞增count并用dcci刷新緩存狀態(tài)使條目對 AIV 可見由調(diào)用方跟蹤槽位可將 dcci 次數(shù)從 5 次降到 2 次消費者AIVPerBlockQueueTryDequeue用硬件TTEST檢查count head1經(jīng)GetQueueSlot()刷新目標(biāo)槽后返回 tile id無就緒數(shù)據(jù)返回-1長時間空閑后退化為硬件TWAIT當(dāng)COMM_BLOCK_NUM COMPUTE_BLOCK_NUM時一個通信 block 按輪詢順序排空多個隊列隊列分配是靜態(tài)的因此無需跨 block 原子仲裁設(shè)計為單生產(chǎn)者-單消費者隊列內(nèi)部無需任何原子操作。內(nèi)存布局與 HCCL 窗口只有被遠(yuǎn)端TPUT或TNOTIFY寫入的緩沖區(qū)才必須放在 HCCL RDMA 窗口內(nèi)僅本地讀寫使用的緩沖區(qū)可用普通aclrtMalloc分配BufferSizeLocationWhyreduced_outputM x N x 2BHCCL windowRSAtomicAdd與 AG 遠(yuǎn)端TPUT寫入FP16signal_matrixG_SIGNAL_TOTAL_SLOTS x 4B按 64B 對齊HCCL windowsubtile-ready 與 AG-summary 計數(shù)外加保留的舊版 barrier 槽位gemm_outputM x N x 2BaclrtMalloc僅本地讀寫FP16src0_dev,src1_dev輸入矩陣FP16aclrtMalloc僅本地讀寫main.cpp中AllocDeviceBuffers通過WindowAlloc(windowBase, ...)從hostCtx.windowsIn[rankId]起步分配reduced_output與signal_matrix并校驗winOffset winSize否則報 HCCL window too small。窗口大小由環(huán)境變量HCCL_BUFFSIZE控制run.sh按 padded 后的reduced_output占用自動計算并附加較大余量pad(M, G_BASE_M) x pad(N, G_BASE_N) x 2 / 1MB 64MBsignal_matrix位于同一窗口內(nèi)相對64MB余量可忽略。關(guān)于跨 rank 尋址common.hpp 的CommRemotePtr(ctx, localPtr, pe)以本 rank 窗口基址計算偏移再疊加到目標(biāo) rank 的windowsIn[pe]上得到遠(yuǎn)端地址設(shè)備上下文由 comm_context.h 的CommDeviceContext承載。拓?fù)溥m配方面main.cpp在 MESH 拓?fù)銩2下直接復(fù)用 HCCL 返回的上下文結(jié)構(gòu)在 RING 拓?fù)銩3下通過hccl_compat兼容結(jié)構(gòu)從CommOpResParam的remoteRes提取遠(yuǎn)端 RDMA 地址并手工組裝 host 上下文。性能數(shù)據(jù)參考值以下數(shù)據(jù)來自當(dāng)前subtile-ready / AG-summary overlap實現(xiàn)采集環(huán)境為 8 卡 Ascend 910BM5416, K6144, N1408pad 為5504 x 1536258 tiles (43 x 6)compute_blocks24、comm_blocks24。每個 rank 計算完整 GEMMC_i A_i x BAllReduce 對 8 個C_i求和。MetricValueCompute-only368.1 us254546 GFLOPSSequential808.9 uscompute371.6 us comm437.3 us 63.6 GB/sPipelined560.6 uscompute done367.2 uscomm done560.6 us 49.7 GB/sSpeedup1.443xTime saved248.4 us30.7%Overlap eff66.8%Throughput1337307 GFLOPStotalmain.cpp中PrintTimingDetails給出了上述指標(biāo)的完整計算口徑Speedup Sequential / PipelinedTime saved seq_avg - pipe_avgOverlap eff (seq_comp seq_comm - pipe) / min(seq_comp, seq_comm)。指標(biāo)解讀Compute-only純 GEMM 無通信的執(zhí)行時間反映單卡 Cube 利用率上限Sequential先計算后通信、無重疊的路徑808.9 us371.6 us計算 437.3 us通信Pipelined雙流并發(fā)路徑560.6 us相對 Sequential 為1.443x加速重疊效率66.8%Overlap efficiency較短階段被重疊隱藏的比例66.8%表示約三分之二的短階段被隱藏。優(yōu)化歷史下表為歷史優(yōu)化檢查點最后一行是當(dāng)前subtile-ready / AG-summary overlap路徑的最新端到端結(jié)果。較早行應(yīng)視為背景參考而非當(dāng)前路徑的字面分解。OptimizationPipelined (us)GainConclusionBaseline808--Block Swizzle793-1.8%KeptRSAtomicAdd移除獨立 Reduce 階段736-6.6%KeptAG 行級扁平化調(diào)度623-15.4%歷史檢查點48 AIVRSskip AGparticipate639RS 僅 24 AIVAG 48 AIVRevertedAIC干擾48 AIV 雙隊列1 AIC : 2 AIV667RS 與 AG 均在 48 AIVRevertedAIC干擾當(dāng)前subtile-ready / AG-summary overlap路徑560.6較623 us歷史檢查點約-10.0%當(dāng)前結(jié)果性能調(diào)優(yōu)指南1. 優(yōu)先做多核劃分每個 AIC 按block_idx x tiles_per_block領(lǐng)取 tile 子集塊間互不干擾。檢查清單調(diào)節(jié)COMPUTE_BLOCK_NUM使每個 block 分到相近數(shù)量的 tile不同矩陣形狀下按G_NUM_TILES (M_padded/128) x (N_padded/256)重算總 tile 數(shù)。配套源碼gemm_ar_config.h 中的GEMM_AR_BLOCK_TILE_COUNT/GEMM_AR_BLOCK_START_TILE宏實現(xiàn)了余數(shù)攤給前remainder個 block的均衡劃分避免經(jīng)典 ceil 劃分產(chǎn)生1 個矮塊 N-1 個滿塊的負(fù)載不均。2. 選擇合適的 base tileL0A 與 L0B 采用 ping/pong 雙緩沖每個緩沖限制為 32 KiB。對于 FP16 輸入2 bytes/elemL0A tile 字節(jié) ~baseM x baseK x 2128 x 64 x 2 16 KiBL0B tile 字節(jié) ~baseK x baseN x 264 x 256 x 2 32 KiB通信 tile 尺寸為baseM x baseN x sizeof(FP16) 128 x 256 x 2 64 KB3. 用 L1stepK緩存提升復(fù)用stepKastepKb4時一次TLOAD將 4 個 K 片帶入 L1之后逐個TEXTRACT拉入 L0。L1 占用2 x 64KB (A) 2 x 128KB (B) 384KB 1024KB增大stepK可減少 DMA 啟動開銷但總量必須仍能裝進(jìn) L1。4. 保住流水線重疊性能關(guān)鍵來自兩件事的組合計算內(nèi)核內(nèi)部雙緩沖L1/L0A/L0B計算與通信之間的雙流重疊。當(dāng)觀察到communication time compute time計算側(cè)已高效應(yīng)聚焦改善通信或提升重疊度compute time communication time通信已被完全隱藏應(yīng)聚焦計算側(cè)。5. 調(diào)節(jié)通信 block 數(shù)量COMM_BLOCK_NUM控制通信內(nèi)核的 AIV 并行度可通過--comm-blocks調(diào)整。在 Ascend 910B 上將COMM_BLOCK_NUM從 24 提升到 48 會使 AIC 計算時間顯著增加約24%原因是 HBM 帶寬爭用與 TSCH 調(diào)度開銷因此默認(rèn)穩(wěn)定取 24。6. 約束條件K必須能被G_BASE_K x G_STEP_KA整除默認(rèn)64 x 4 256M自動 pad 到 128 的倍數(shù)N自動 pad 到 256 的倍數(shù)所有 HCCL 窗口緩沖區(qū)必須在每個 rank 上以相同偏移分配每次迭代前必須用aclrtMemset重置signal_matrix見main.cpp中ResetDeviceState。構(gòu)建與運行配置 Ascend CANN 環(huán)境export ASCEND_CANN_PATH/usr/local/Ascend/cann-version/set_env.sh source ${ASCEND_CANN_PATH}激活提供 Python 與 NumPy 的 conda 環(huán)境conda activate your-conda-env以 8 rank 運行示例cd ${git_clone_path}/kernels/manual/a2a3/gemm_ar ./run.sh --nranks 8 --soc-version Ascend910B1指定起始設(shè)備編號FIRST_DEVICE0 ./run.sh --nranks 8 --soc-version Ascend910B1使用自定義計算/通信 block 數(shù)量./run.sh --nranks 8 --compute-blocks 20 --comm-blocks 4運行成功時程序打印GEMM AllReduce demo completed successfully.腳本 run.sh 內(nèi)部會按getopt解析-r/--run-mode、-v/--soc-version、-n/--nranks、-d/--ndevices、--compute-blocks、--comm-blocks等參數(shù)先清理遺留 HCCL 共享內(nèi)存狀態(tài)rm -rf /dev/shm/sem.hccl*; ipcrm -a按PAD_M * PAD_N * 2 / 1024 / 1024 64MB自動抬升HCCL_BUFFSIZE再調(diào)用cmake與make最后執(zhí)行mpirun -n ${NRANKS} ./gemm_allreduce --first-device ${FIRST_DEVICE}。環(huán)境變量Environment VariablePurposeDefault BehaviorASCEND_CANN_PATHCANNset_env.sh腳本的完整路徑自動 glob/usr/local/Ascend/cann-*/set_env.sh并取最新MPI_SEARCH_DIRSMPIbin/目錄搜索路徑空格分隔搜索/usr/local/mpich/bin、/home/mpich/bin等常見位置ASCEND_DRIVER_PATHCMake 使用的 Ascend 驅(qū)動路徑默認(rèn)/usr/local/Ascend/driverMPI_LIB_PATH運行時動態(tài)加載的libmpi.so絕對路徑由run.sh按發(fā)現(xiàn)的 MPI 安裝自動設(shè)置HCCL_BUFFSIZEHCCL RDMA 窗口大小MB由run.sh根據(jù) paddedM/N占用自動計算FIRST_DEVICE起始 NPU 設(shè)備編號默認(rèn)0修改矩陣維度更新 gemm_ar_config.h 中的CONFIG_G_M、CONFIG_G_K、CONFIG_G_N注意宏帶#ifndef保護(hù)源碼通過 include 共享配置。也可以直接從 CMake 傳入cmake -DCONFIG_G_M8192 -DCONFIG_G_K8192 -DCONFIG_G_N2048 ..約束K必須能被G_BASE_K x G_STEP_KA整除默認(rèn)64 x 4 256HCCL_BUFFSIZE由run.sh自動計算。此外 gemm_ar_config.h 還支持CONFIG_G_BASE_M、CONFIG_G_BASE_K、CONFIG_G_BASE_N、CONFIG_COMPUTE_BLOCK_NUM、CONFIG_COMM_BLOCK_NUM、CONFIG_COMM_SUB_M等編譯期參數(shù)并帶有static_assert如G_COMM_SUB_M必須整除G_BASE_M、AG summary 槽至少占一個 cache line 等作為配置安全網(wǎng)。FAQProblemCause and FixHCCL window too small窗口必須覆蓋 paddedreduced_output占用加上signal_matrix。檢查是否手動覆蓋了HCCL_BUFFSIZErun.sh會自動按pad(M) x pad(N) x 2 / 1MB 64MB抬升HcclGetRootInfo failed: 7上次運行的遺留臟狀態(tài)。執(zhí)行rm -rf /dev/shm/sem.hccl*; ipcrm -a或等待約 30 秒重試HCCL 初始化后掛起通常是 rank 同步問題。檢查所有 rank 是否都到達(dá)了CommMpiBarrier通信內(nèi)核段錯誤通常是窗口地址非法。驗證windowsIn[]條目非零信號等待死鎖或 AG 停滯signal_matrix未在迭代間清零或 subtile-ready / AG-summary 歸屬映射錯誤。檢查resetState是否對signal_matrix調(diào)用了memset校驗時max_diff過大FP16 精度有限。校驗容差為atol1.0, rtol0.01見main.cpp的VerifyOutput。若 diff 異常大檢查 subtile-ready / AG-summary 同步與 owner 映射aclInit repeat init100002無害。代碼已對單進(jìn)程重復(fù)aclInit做了防護(hù)--allow-run-as-root失敗本項目使用 MPICH該選項是 OpenMPI 專有構(gòu)建系統(tǒng)CMakeLists.txt 定義了三個 targetCompilerbishengCANN 內(nèi)置 clang 15.0.5Cube 內(nèi)核 flags--cce-aicore-archdav-c220-cube -DMEMORY_BASEgemm_compute_kernel鏈接runtime--cce-fatobj-linkVector 內(nèi)核 flags--cce-aicore-archdav-c220-vec -DMEMORY_BASEcomm_kernelHost 可執(zhí)行程序標(biāo)準(zhǔn)-xc編譯gemm_allreduce鏈接gemm_compute_kernel、comm_kernel、runtime/ascendcl/hcomm/m/tiling_api等pto-comm-isa的 include 路徑必須放在最前以覆蓋 CANN 自帶的pto_tile.hppinclude_directories中${PROJECT_SOURCE_DIR}/../../../../include即倉庫根include/目錄CMAKE_CCE_COMPILE_OPTIONS中開啟--cce-pto-enable并設(shè)置了 aicore 棧大小、溢出記錄、地址變換等 LLVM 選項RUN_MODE為sim時鏈接runtime_camodel以支持模擬器。變更日志DateChange2025-12-15初始版本雙流 GEMM AllReduce 融合2026-04-01適配 CANN 9.0.0移除廢棄的hccl/hccl.h依賴2026-04-02RSAtomicAdd移除獨立 Reduce 階段AG 扁平化改善負(fù)載均衡2026-04-21通信模式由RS - DeviceBarrier - AG改為subtile-ready / AG-summary overlap延伸閱讀該示例依賴的 PTO 通信指令說明可參考 docs/isa/comm 目錄及 docs/PTO-Virtual-ISA-Manual_zh.md本倉庫更多手動算子示例位于 kernels/manual/a2a3 與 kernels/manual/a5算子融合與多核流水線的基礎(chǔ)知識見 docs/coding/operator-fusion_zh.md 與 docs/coding/multi-core-programming_zh.md?!久赓M下載鏈接】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.項目地址: https://gitcode.com/cann/pto-isa創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考