十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ATVOSS 三元运算符基类 TernaryOp 详解:表达式模板体系中的三操作数算子基座

ATVOSS 三元运算符基类 TernaryOp 详解:表达式模板体系中的三操作数算子基座 ATVOSS 三元运算符基类 TernaryOp 详解表达式模板体系中的三操作数算子基座【免费下载链接】atvossATVOSSAscend C Templates for Vector Operator Subroutines是一套基于Ascend C开发的Vector算子库致力于为昇腾硬件上的Vector类融合算子提供极简、高效、高性能、高拓展的编程方式。项目地址: https://gitcode.com/cann/atvossTernaryOp 是 ATVOSSAscend C Templates for Vector Operator SubroutinesCompute 表达式层中面向三操作数运算的基类模板为 Vector 融合算子的三输入表达式提供统一类型载体。本文基于 docs/api/TernaryOp.md 展开结合其头文件实现 include/expression/expr_template.h 与兄弟接口 UnaryOp、BinaryOp 的源码对照完整讲解其模板参数语义、内部类型定义、约束机制以及它在表达式模板体系中的定位与当前工程状态读者读后可掌握如何在自定义 Vector 算子中理解并使用这一基座类型。功能说明所有三元运算符的基类在 ATVOSS 的 Compute 表达式层中用户通过占位符 PlaceHolder 声明参数、用运算符搭建计算关系最终由调度层将表达式翻译为昇腾硬件上的执行逻辑。按操作数个数运算符基类被划分为三档一元运算符UnaryOp基类模板承接单操作数运算二元运算符BinaryOp基类模板承接双操作数运算三元运算符TernaryOp基类模板承接三操作数运算是所有三元运算符的公共基座。在 docs/api/README.md 的接口列表中TernaryOp与UnaryOp、BinaryOp并列归属 Compute 层接口所属头文件均为/include/expression/expr_template.h。所属头文件头文件include/expression/expr_template.h命名空间Atvoss该头文件集中定义了Expression、Param、LocalVar、UnaryOp、BinaryOp、TernaryOp以及OpAssign、OpAndThen等表达式模板基础设施是整个 Compute 表达式层的心脏。函数原型template typename T, typename U, typename V, typename R struct TernaryOpTernaryOp是一个聚合类型的类模板struct四个模板参数分别对应三个操作数的类型与返回结果类型。与 BinaryOp 继承自Util::CompressedPairT, U的压缩存储方式不同TernaryOp没有使用压缩存储工具类而是以三个公开数据成员lhs、rhs、ths平铺保存操作数源码位于 include/expression/expr_template.h 第 436-451 行template typename T, typename U, typename V, typename R struct TernaryOp { static_assert( !(std::is_rvalue_reference_vT || std::is_rvalue_reference_vU), [ERROR]: [Atvoss][Expression] Rvalue references cannot be stored); using IsBinaryOp void; using LhsType T; using RhsType U; using VhsType V; using TensorType typename T::TensorType; using RetType std::decay_tR; T lhs; U rhs; V ths; };从源码结构看TernaryOp直接以公开成员存储三个操作数配合Expression包装即可构成完整的表达式节点属于表达式模板中典型的“类型即表达式”设计。参数说明四个模板参数均为编译期类型参数含义如下参数名称参数类型输入/输出数据类型参数说明默认值T模板参数输入NA第一个操作数的类型NAU模板参数输入NA第二个操作数的类型NAV模板参数输入NA第三个操作数的类型NAR模板参数输入NA三元操作符返回结果的类型NA结合源码补充的类型语义T、U、V分别映射为内部类型别名LhsType、RhsType、VhsType代表三个操作数在表达式树中的静态类型可以是 Param 参数、LocalVar局部变量、标量或其它嵌套表达式节点R是三元操作的返回结果类型内部以RetType std::decay_tR规约后暴露与 BinaryOp 中RetType R默认取自std::decay_tT::RetType的推导策略略有差异TensorType从第一个操作数T中提取用于标识该表达式最终作用于的张量类型。返回值说明返回值数据类型返回值说明TernaryOp返回一个三元运算符对象需要说明的是TernaryOp本身是类型层面的基座并非计算函数。实际使用中它通常不会直接构造而是作为自定义三元算子结构体的基类或直接以ExpressionTernaryOp...形式被包装进表达式节点参与计算图构建。约束说明原文档约束说明为 NA但从 include/expression/expr_template.h 源码可确认以下编译期约束T、U不允许是右值引用类型static_assert(!(std::is_rvalue_reference_vT || std::is_rvalue_reference_vU))触发时输出[ERROR]: [Atvoss][Expression] Rvalue references cannot be stored因为表达式对象需要在编译期持久保存操作数右值引用无法安全存储与 UnaryOp、BinaryOp 一致操作数类型需满足Expression体系的基本要求具备RetType、TensorType等类型别名或可推导得出RetType对R执行std::decay_t规约因此R不应显式传入引用或 const 限定类型否则会被自动衰减为值类型。使用示例原文档使用示例为 NA。参照 BinaryOp 文档中的使用示例struct OpAdd : BinaryOpT, U { ... }与源码中DeclareBinaryOp宏的生成模式可以推导出TernaryOp的典型派生用法以下为基于源码结构的示例性写法// 参照 BinaryOp 使用示例推导的三元算子派生模式 template typename T, typename U, typename V, typename R typename std::decay_tT::RetType struct OpFmaLike : TernaryOpT, U, V, R { OpFmaLike() default; constexpr OpFmaLike(T t, U u, V v) : TernaryOpT, U, V, R{t, u, v} {} };需要注意的是截至当前仓库版本源码中尚未提供DeclareTernaryOp之类的声明宏对比 include/operators/math_expression.h 中已有的DeclareUnaryOp/DeclareBinaryOp宏也即工程内尚无直接落地的三元算子。上述示例仅用于说明继承与聚合构造方式具体算子落地时需自行补充求值Evaluate与调度Schedule侧的实现。在表达式模板体系中的定位三层运算符基类家族UnaryOp、BinaryOp、TernaryOp构成完整的运算符元数体系均定义于 include/expression/expr_template.h基类模板参数操作数存储关键类型别名特征标记UnaryOpT, R1 个操作数 结果类型Util::CompressedDataT压缩存储DataType、RetType、TensorTypeIsUnaryOpBinaryOpT, U, R2 个操作数 结果类型Util::CompressedPairT, U压缩存储LhsType、RhsType、RetTypeIsBinaryOpTernaryOpT, U, V, R3 个操作数 结果类型公开成员lhs/rhs/ths平铺LhsType、RhsType、VhsType、RetTypeIsBinaryOp值得注意的实现细节TernaryOp内部仍以using IsBinaryOp void;声明特征标记。从源码结构看这一做法使Detail::ParamCollector、Detail::LocalVarCollector等编译期收集器include/expression/expr_template.h 第 151-238 行在处理三元节点时可按IsBinaryOp_vT分支对LhsType、RhsType递归收集参数与局部变量从而复用现有的“按序收集参数”基础设施。同理这也意味着在语法树遍历层面三元算子暂可归入“多操作数节点”的统一处理路径。与 Compute 表达式的衔接在 ATVOSS 的编程模型中用户在 Compute 中书写形如out expr(in1, in2, in3)的运算关系ExpressionTernaryOp...类型的节点会被 Params 收集器展开为按编号排序的参数列表进而由 Kernel/Block 层调度执行。TernaryOp因此是算子三输入场景例如按掩码选择、融合乘加等的类型化基座为后续扩展三操作数算子预留了稳定的表达入口。当前工程状态与扩展路径从仓库现状看TernaryOp的工程进度可以归纳为三点基类已就绪TernaryOp结构体已在 include/expression/expr_template.h 中完整定义类型别名、约束检查齐备算子层仍在预留include/operators/tile_shape.h 中的Operation枚举已列出Unary、Binary、Ternary三档但Ternary明确标注为// Ternary operation (reserve)属于保留状态同时 include/operators/math_expression.h 已实现 - * /、Exp、Power、Sqrt、Abs、Cast、Max等一元/二元算子尚无对应的三元算子缺少声明宏与求值实现未提供DeclareTernaryOp宏也未在求值器如 include/operators/math_evaluator.h中出现Fma/Select类的三操作数指令封装。因此开发者若需在 ATVOSS 中落地三元算子可沿以下路径推进仅描述查看与使用思路不改动仓库以TernaryOpT, U, V, R为基类定义算子结构体 → 参考 BinaryOp 示例提供 constexpr 构造 → 在求值层补充三操作数计算指令 → 复用IsBinaryOp标记使参数收集与调度链路自动识别该节点。参考与延伸阅读基类源码include/expression/expr_template.h一元基类文档docs/api/UnaryOp.md二元基类文档docs/api/BinaryOp.md参数占位与数据流docs/api/PlaceHolder.md、docs/api/ParamUsage.md表达式层算子集合include/operators/math_expression.h调度层 Operation 枚举include/operators/tile_shape.h完整接口清单docs/api/README.md【免费下载链接】atvossATVOSSAscend C Templates for Vector Operator Subroutines是一套基于Ascend C开发的Vector算子库致力于为昇腾硬件上的Vector类融合算子提供极简、高效、高性能、高拓展的编程方式。项目地址: https://gitcode.com/cann/atvoss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表