当前位置: 首页 > news >正文

cann/cannbot-skills HIVM三元向量运算

HIVM 三元向量运算

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

关键词:HIVM, Ternary, vsel, select, conditional

概述

HIVM 三元向量运算继承自HIVM_ElementwiseTernaryOp,对三个输入操作数执行逐元条件选择运算。目前仅有一个操作hir.vsel,它根据条件向量的值从两个数据源向量中选择元素。

Python API 对应:tl.where(condition, x, y)— 条件选择操作。

IR 操作定义

基类:HIVM_ElementwiseTernaryOp

class HIVM_ElementwiseTernaryOp<string mnemonic, list<Trait> traits = []> : HIVM_ElementwiseNaryOp<mnemonic, !listconcat([ElementwiseNaryOpTrait<3>], traits)>;

源码参考:HIVMVectorOps.td#L1016-L1018


hir.vsel — 逐元条件选择

TableGen 定义
def VSelOp : HIVM_ElementwiseTernaryOp<"vsel", [StaticMaxRankTrait<1>, OperElemTypeConstraints<[/*condition=*/0], [I1,I8]>, OperElemTypeConstraints<[/*src0=*/1, /*src0=*/2], [I1, AnyI8, AnyI16, F16, BF16, AnyI32, F32, I64]>, DeclareOpInterfaceMethods<ExtraBufferOpInterface, ["getExtraBufferSize"]>, BroadcastableOTF]> { let summary = "Elementwise Vector Selection Op"; let description = baseClassDescription # [{ Select elements from two source vector according to the binary `condition` vector. If the corresponding bit of the indicator is 1, select `src0`. Otherwise, select `src1`. Additional constraints: 1. The input vectors and output vector must have the same ranks. 2. The element type of indicator vector must be bool. }]; let arguments = (ins Variadic<AnyType>:$src, Variadic<AnyShaped>:$dst, Optional<AnyMemRef>:$temp_buffer, DefaultValuedAttr<DenseI64ArrayAttr, "{}">:$transpose, DefaultValuedAttr<DenseI64ArrayAttr, "{}">:$broadcast ); let assemblyFormat = [{ attr-dict `ins` `(` $src `:` type($src) `)` `outs` `(` $dst `:` type($dst) `)` (`temp_buffer` `(` $temp_buffer^ `:` type($temp_buffer) `)`)? (`->` type($result)^)? }]; }

源码参考:HIVMVectorOps.td#L1020-L1050

参数说明
参数类型必选说明约束
$src[0]AnyType条件向量(condition/indicator)元素类型 I1 或 I8
$src[1]AnyType数据源 src0(条件为真时选择)元素类型 I1/AnyI8/AnyI16/F16/BF16/AnyI32/F32/I64
$src[2]AnyType数据源 src1(条件为假时选择)与 src0 相同元素类型
$dstVariadic<AnyShaped>输出向量与 src0/src1 相同元素类型
$temp_bufferOptional<AnyMemRef>临时缓冲区ExtraBufferOpInterface
$transposeDenseI64ArrayAttr (默认 {})OTF 转置维度-
$broadcastDenseI64ArrayAttr (默认 {})OTF 广播维度-
数据类型约束
操作数位置语义支持的元素类型约束来源
$src[0]条件I1, I8OperElemTypeConstraints<[0], [I1, I8]>
$src[1]数据源0I1, AnyI8, AnyI16, F16, BF16, AnyI32, F32, I64OperElemTypeConstraints<[1, 2], [I1, AnyI8, AnyI16, F16, BF16, AnyI32, F32, I64]>
$src[2]数据源1I1, AnyI8, AnyI16, F16, BF16, AnyI32, F32, I64OperElemTypeConstraints<[1, 2], ...>
语义说明
dst[i] = condition[i] ? src0[i] : src1[i]

当条件向量的对应位为 1 时,选择 src0 的元素;否则选择 src1 的元素。

IR 示例
%result = hivm.hir.vsel ins(%cond, %src0, %src1 : tensor<23x77xi1>, f32, tensor<23x77xf32>) outs(%dst : tensor<23x77xf32>) -> tensor<23x77xf32> %result = hivm.hir.vsel ins(%cond, %a, %b : i1, tensor<5x?x10xf32>, tensor<5x?x10xf32>) outs(%dst : tensor<5x?x10xf32>) -> tensor<5x?x10xf32>

完整使用示例(来自测试文件):

%cond = hivm.hir.vcmp ins(%a, %b : tensor<23x77xf32>, f32) outs(%init : tensor<23x77xi1>) compare_mode = <ne> -> tensor<23x77xi1> %result = hivm.hir.vsel ins(%cond, %val_true, %val_false : tensor<23x77xi1>, f32, tensor<23x77xf32>) outs(%dst : tensor<23x77xf32>) -> tensor<23x77xf32>

IR 层约束与验证

  1. 条件类型约束:条件向量($src[0])的元素类型必须为 I1 或 I8
  2. 数据源类型一致性:src0 和 src1 必须具有相同的元素类型
  3. Rank 一致性:所有输入向量和输出向量必须具有相同的 rank
  4. 最大 Rank 限制:StaticMaxRankTrait<1>,仅支持 1 维
  5. BroadcastableOTF:支持 OTF 广播,允许条件或数据源在指定维度上进行广播

与其他 IR 操作的关系

HIVM 操作上游降级HFusion 降级说明
vsellinalg.select-语义等价于 linalg.select

vsel 通常与 vcmp 配合使用,形成条件选择模式:

vcmp → vsel (比较后选择)

降级示例:

%cond = hivm.hir.vcmp ... compare_mode = <ne> -> tensor<Nxi1> %result = hivm.hir.vsel ins(%cond, %a, %b : ...) -> tensor<Nxf32> %result = linalg.select ins(%cond, %a, %b : tensor<Nxi1>, tensor<Nxf32>, tensor<Nxf32>) -> tensor<Nxf32>

常见问题

Q: vsel 的条件向量为什么支持 I8 而不仅仅是 I1?A: 硬件实现中,条件判断可以基于 I8 类型的非零值,不仅仅是布尔值。这提供了更大的灵活性,允许直接使用比较结果或掩码向量。

Q: vsel 支持标量条件吗?A: 是的。从 IR 示例可以看到,$src 支持 AnyType(而非仅 AnyShaped),因此条件可以是标量i1值。当条件为标量时,所有元素使用相同的条件值。

Q: vsel 的最大 Rank 为什么只有 1?A: 这是当前硬件实现的限制。对于多维条件选择,需要先展平为 1 维操作,或在编译阶段通过循环分解处理。

相关文档

  • Python API:docs_triton_ascend 中的tl.where()文档
  • 源码参考:
    • HIVMVectorOps.td - VSelOp
    • convert-hivm-to-upstream.mlir

【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1167291/

相关文章:

  • 卡地亚中国官方售后服务中心|服务热线及具体地址权威信息公示(2026年7月最新) - 卡地亚官方售后中心
  • 2026安徽中考100-200分落榜?别乱择校,合肥省属公办建工院校正在招生 - 小张zc
  • (4-4-02)Bellman-Ford路径规划
  • 2026西安幼儿园除甲醛实用指南 服务明细与机构选择建议 - 西安治泉环保
  • g2o图优化库从源码编译安装:Ubuntu环境下的完整指南与问题排查
  • 盐城黄金换新服务实测:四家主流门店核心维度对比 - 招财兔数字员工
  • PlantCV性能优化:如何提升植物图像处理速度与精度
  • Mysql二进制日志binglog文件如何删除是否磁盘空间
  • 收藏!前端小白也能轻松上手AI大模型,私有云部署实操全解析
  • 传统交互与数字人智能语音交互的异同解析,解锁智能交互新优势✨
  • 《2026海归求职服务行业白皮书:避坑指南与标杆案例解析》 - 招财兔数字员工
  • (4-4-01)Bellman-Ford路径规划
  • 2026 成都奢侈品回收对比解析:估价维度与变现渠道考量 - 生活时报
  • Claude Code多文件编辑能力深度解密(企业级开发团队已禁用单文件模式)
  • PARD-Llama-3.2-1B模型架构详解:理解16层Transformer与并行草稿机制
  • WannierTools入门指南:紧束缚哈密顿量后处理核心教程
  • 大模型训练范式深度解析:从预训练到对齐优化
  • 新手后端开发者如何选择合适的技术栈
  • 双节锂电池均衡方案:MP2672A与PIC18F4685实战解析
  • Cache 性能分析实战:MyCache 模拟器 3 大参数调优,失效率最低降至 0.16%
  • 3种主流云存储方案对比:腾讯云COS、阿里云OSS、自建MinIO文件上传API差异
  • 关于发布2026年宝珀中国官方腕表保养售后服务信息调整公告(最新直营热线及线下售后门店完整名录) - 宝珀官方维修中心
  • 2026嘉兴靠谱防水服务商:卫生间免砸砖、外墙、地下室、楼顶渗漏维修 本地正规报价(7月最新) - 吉林同城获客
  • 盐城老庙黄金实测评测:场景适配与本地服务深度解析 - 招财兔数字员工
  • Hearthstone-Script炉石传说脚本:3步实现智能自动化,轻松刷取游戏资源
  • 2026年7月泉州惠普售后设备深度养护方案|延长设备使用寿命全攻略.txt - 品牌引荐
  • 3大技术策略破解微信机器人自动化瓶颈:WeChatFerry的企业级解决方案
  • 178、数据增强全景总结:7 种策略的单独使用与组合使用的 20 组消融矩阵
  • 远程桌面双向信任痛点下一代架构——东方仙盟
  • sake任务运行器源码解读:核心执行引擎的设计与实现