CANN/cannbot-skills HIVM内建指令操作

CANN/cannbot-skills HIVM内建指令操作
HIVM 内建指令操作【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills关键词IntrinOp, GET.BLOCK.IDX, SET.FLAG.IMM, WAIT.FLAG.IMM, BARRIER, SET.FFTS.BASE.ADDR, SET.CROSS.CORE, INTRA.BLOCK概述HIVM 内建指令操作Intrinsic Operations是 HIVM 方言中最底层的操作直接对应 NPU 硬件指令。这些操作从 HIVMIntrinOps.td 定义继承自LLVM_IntrOpBase在 Lowering 的最终阶段由高层 HIVM 操作转换而来。内建指令操作通常不由用户直接编写而是由编译器 Pass 自动生成。了解这些操作有助于理解 HIVM IR 到硬件指令的映射关系。指令分类1. Block 索引指令指令高层操作说明hivm.GET.BLOCK.IDXhir.get_block_idx获取当前 Block 索引hivm.GET.BLOCK.NUMhir.get_block_num获取 Block 总数hivm.GET.SUBBLOCKIDhir.get_sub_block_idx获取当前 Sub-Block 索引hivm.GET.SUBBLOCKDIMhir.get_sub_block_num获取 Sub-Block 总数2. Pipe 同步指令指令参数说明hivm.SET.FLAG.IMMset_pipe(I64Attr), wait_pipe(I64Attr), event_id(I64Attr)设置 Event Flag立即数模式hivm.WAIT.FLAG.IMMset_pipe(I64Attr), wait_pipe(I64Attr), event_id(I64Attr)等待 Event Flag立即数模式hivm.SET.FLAG.REGset_pipe(I64Attr), wait_pipe(I64Attr), event_id(I64)设置 Event Flag寄存器模式hivm.WAIT.FLAG.REGset_pipe(I64Attr), wait_pipe(I64Attr), event_id(I64)等待 Event Flag寄存器模式hivm.BARRIERpipe(I64Attr)Pipeline 屏障3. FFTS 同步指令指令参数说明hivm.SET.FFTS.BASE.ADDRaddr(I64)设置 FFTS 基地址寄存器hivm.SET.CROSS.COREpipe(I64Attr), config(I64)FFTS 跨核同步指令hivm.WAIT.FLAG.DEV.REGflag_id(I64)FFTS Block/Sub-Block 同步等待寄存器hivm.WAIT.FLAG.DEV.PIPE.IMMpipe(I64Attr), flag_id(I64Attr)FFTS 同步等待Pipe Flag 立即数hivm.WAIT.FLAG.DEV.PIPE.REGpipe(I64Attr), flag_id(I64)FFTS 同步等待Pipe 立即数 Flag 寄存器4. Intra-Block 同步指令指令参数说明hivm.SET.INTRA.BLOCK.modepipe(I64Attr), sync_id(I64)Block 内同步设置寄存器模式hivm.WAIT.INTRA.BLOCK.modepipe(I64Attr), sync_id(I64)Block 内同步等待寄存器模式hivm.SET.INTRA.BLOCKI.modepipe(I64Attr), sync_id(I64Attr)Block 内同步设置立即数模式hivm.WAIT.INTRA.BLOCKI.modepipe(I64Attr), sync_id(I64Attr)Block 内同步等待立即数模式5. 控制指令指令参数说明hivm.SET.MASK.NORM无设置 Mask 为正常模式hivm.GET.CTRL无获取控制寄存器值hivm.SET.CTRLconfig(I64)设置控制寄存器hivm.SBITSET0x(I64), idx(I64)设置状态位为 0hivm.SBITSET1x(I64), idx(I64)设置状态位为 16. 缓存指令指令参数说明hivm.DCCI.DSTptr(LLVMPointer), entire(I64), dst(I64)清除/无效化 GM 数据缓存hivm.DCCI.DST.UBptr(LLVMPointer), entire(I64), dst(I64)清除/无效化 UB 数据缓存指令详细说明SET.FLAG.IMM / WAIT.FLAG.IMM立即数模式的 Pipe 同步指令Event ID 编码在指令中。// 参数 set_pipe: I64Attr -- 发送信号的 Pipe立即数 wait_pipe: I64Attr -- 接收信号的 Pipe立即数 event_id: I64Attr -- Event ID立即数 // 无返回值SET.FLAG.REG / WAIT.FLAG.REG寄存器模式的 Pipe 同步指令Event ID 来自寄存器值。// 参数 set_pipe: I64Attr -- 发送信号的 Pipe立即数 wait_pipe: I64Attr -- 接收信号的 Pipe立即数 event_id: I64 -- Event ID寄存器值 // 无返回值SET.CROSS.COREFFTS 跨核同步指令发送数据包括模式和 Flag ID到 FFTS 目标地址。// 参数 pipe: I64Attr -- Pipe 类型立即数 config: I64 -- 配置值寄存器 // config 编码格式 // config (0x0001 | ((mode 0x0f) 4) | ((flagID 0x0f) 8)) // // mode: // 0: inter block synchronization // 1: inter subblock synchronization // 2: intra block synchronization // // flagID: 8-bit flag ID每个 flag ID 有一个计数器INTRA.BLOCK 同步指令Block 内 Cube Core 和 Vector Core 之间的同步指令。ID 映射规则Mix-Mode Block1 CUBECORE 2 VECCORESET 来源目标ID 映射VECCORE0 ID 0-15CUBECOREID 0-15VECCORE1 ID 0-15CUBECOREID 16-31CUBECORE ID 0-15VECCORE0ID 0-15CUBECORE ID 16-31VECCORE1ID 0-15同步机制每个 sync ID 有一个 4-bit 计数器SET 操作递增对方 Core 对应 ID 的计数器不阻塞当前 PipelineWAIT 操作如果对应 ID 的计数器为 0 则阻塞否则递减计数器高层操作到内建指令的映射高层操作内建指令说明hir.get_block_idxhivm.GET.BLOCK.IDXBlock 索引查询hir.get_block_numhivm.GET.BLOCK.NUMBlock 数量查询hir.set_flag(静态 Event ID)hivm.SET.FLAG.IMM立即数模式同步hir.set_flag(动态 Event ID)hivm.SET.FLAG.REG寄存器模式同步hir.wait_flag(静态 Event ID)hivm.WAIT.FLAG.IMM立即数模式等待hir.wait_flag(动态 Event ID)hivm.WAIT.FLAG.REG寄存器模式等待hir.pipe_barrierhivm.BARRIERPipeline 屏障hir.set_ffts_base_addrhivm.SET.FFTS.BASE.ADDRFFTS 基地址设置hir.sync_block_sethivm.SET.CROSS.CORE/hivm.SET.INTRA.BLOCKI.mode跨核/核内同步hir.sync_block_waithivm.WAIT.FLAG.DEV.REG/hivm.WAIT.INTRA.BLOCKI.mode跨核/核内等待hir.set_mask_normhivm.SET.MASK.NORMMask 模式设置hir.set_ctrlhivm.SET.CTRL控制寄存器设置hir.dccihivm.DCCI.DST/hivm.DCCI.DST.UB缓存操作常见问题Q: 为什么有 IMM 和 REG 两种模式A: IMMImmediate模式将参数编码在指令中适用于编译时已知的常量参数执行效率更高。REGRegister模式从寄存器读取参数适用于运行时计算的动态参数。Q: SET.CROSS.CORE 的 config 如何编码A:config 0x0001 | ((mode 0x0f) 4) | ((flagID 0x0f) 8)其中 mode 为同步模式0跨Block1跨Sub-Block2Block内flagID 为 8-bit Flag ID。Q: INTRA.BLOCK 同步的 ID 映射规则是什么A: 在 Mix-Mode Block 中CUBECORE 有 32 个 ID每个 VECCORE 有 16 个 ID。VECCORE0 的 ID 0-15 映射到 CUBECORE 的 ID 0-15VECCORE1 的 ID 0-15 映射到 CUBECORE 的 ID 16-31反之亦然。相关文档源码参考HIVMIntrinOps.td高层同步操作04-Synchronization/01-pipe-sync.md跨核同步04-Synchronization/02-block-sync.md【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考