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

📅 2026/7/11 15:38:06 👁️ 阅读次数 📝 编程学习
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(I<64>)设置 FFTS 基地址寄存器
hivm.SET.CROSS.COREpipe(I64Attr), config(I<64>)FFTS 跨核同步指令
hivm.WAIT.FLAG.DEV.REGflag_id(I<64>)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(I<64>)FFTS 同步等待(Pipe 立即数 + Flag 寄存器)

4. Intra-Block 同步指令

指令参数说明
hivm.SET.INTRA.BLOCK.modepipe(I64Attr), sync_id(I<64>)Block 内同步设置(寄存器模式)
hivm.WAIT.INTRA.BLOCK.modepipe(I64Attr), sync_id(I<64>)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(I<64>)设置控制寄存器
hivm.SBITSET0x(I<64>), idx(I<64>)设置状态位为 0
hivm.SBITSET1x(I<64>), idx(I<64>)设置状态位为 1

6. 缓存指令

指令参数说明
hivm.DCCI.DSTptr(LLVMPointer), entire(I<64>), dst(I<64>)清除/无效化 GM 数据缓存
hivm.DCCI.DST.UBptr(LLVMPointer), entire(I<64>), dst(I<64>)清除/无效化 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: I<64> -- Event ID(寄存器值) // 无返回值

SET.CROSS.CORE

FFTS 跨核同步指令,发送数据(包括模式和 Flag ID)到 FFTS 目标地址。

// 参数 pipe: I64Attr -- Pipe 类型(立即数) config: I<64> -- 配置值(寄存器) // 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 Block,1 CUBECORE + 2 VECCORE):

SET 来源目标ID 映射
VECCORE0 ID 0-15CUBECOREID 0-15
VECCORE1 ID 0-15CUBECOREID 16-31
CUBECORE ID 0-15VECCORE0ID 0-15
CUBECORE ID 16-31VECCORE1ID 0-15

同步机制

  • 每个 sync ID 有一个 4-bit 计数器
  • SET 操作:递增对方 Core 对应 ID 的计数器,不阻塞当前 Pipeline
  • WAIT 操作:如果对应 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: IMM(Immediate)模式将参数编码在指令中,适用于编译时已知的常量参数,执行效率更高。REG(Register)模式从寄存器读取参数,适用于运行时计算的动态参数。

Q: SET.CROSS.CORE 的 config 如何编码?A:config = 0x0001 | ((mode & 0x0f) << 4) | ((flagID & 0x0f) << 8),其中 mode 为同步模式(0=跨Block,1=跨Sub-Block,2=Block内),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-15,VECCORE1 的 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),仅供参考