一、Acosh 算子概述

Acosh(反双曲余弦)算子位于ops-math开源仓,是数值计算与 AI 框架中常用的元素级数学算子,核心功能是对输入张量的每个元素执行反双曲余弦运算,其数学表达式为:yi=cosh−1(xi)=ln⁡(x+x2−1)y_{i}=cosh^{-1}(x_{i}) = \ln(x + \sqrt{x^2 - 1})yi=cosh1(xi)=ln(x+x21 )(其中 x≥1x \geq 1x1)。该算子广泛应用于机器学习、科学计算等领域,尤其在 Ascend 910芯片下,针对不同数据类型和硬件特性做了深度优化,以兼顾计算精度与执行效率。

二、CANN 平台下 Acosh 算子的产品支持与核心特性

1. 产品支持范围

Acosh 算子的硬件适配具有明确的边界,支持Ascend 910系列,这与不同硬件架构的指令集、算力分配策略密切相关。

2. 数据类型与格式约束

  • 输入类型:支持 INT8、INT16、INT32、INT64、UINT8、BOOL、FLOAT、BFLOAT16、FLOAT16、DOUBLE,其中整型 / 布尔型输入会先转换为 FLOAT32 运算,输出为 FLOAT32;
  • 输出类型:FLOAT、BFLOAT16、FLOAT16、DOUBLE,保证浮点运算的精度需求;
  • 数据格式:支持 ND(多维)格式,且兼容非连续 Tensor(维度不超过 8),输入与输出的 shape 需严格一致。

3. 调用方式

支持aclnn接口调用,接口名为aclnnAcosh

三、Acosh 算子的底层实现逻辑

1. 核心设计思路

Ascend 910系列芯片下的 Acosh 算子通过模板类KernelAcosh实现,核心模板参数包括:

  • T:数据类型(half/float/bfloat16_t);
  • BUFFER\_MODE:缓冲模式(0 = 单缓冲,1 = 双缓冲)。

针对不同数据类型的特性,算子设计了差异化的计算路径:

  • FLOAT32 路径:直接调用 Ascend C 原生Acosh原语,无溢出风险;
  • FLOAT16/BFLOAT16 路径:因原生原语存在溢出问题(如 FLOAT16 大值 65504 计算x2x^2x2时溢出),采用 “类型转换回退策略”:Cast\(fp16/bf16→fp32\) → Acosh\(fp32\) → Cast\(fp32→fp16/bf16\),其中 fp32 转 bf16 用CAST\_RINT(就近取整),转 fp16 用CAST\_ROUND(四舍五入),平衡精度与性能。

2. 核心执行流程

KernelAcosh类通过Init-Process-CopyIn/Compute/CopyOut三级流程完成计算:

  1. 初始化(Init):确定当前核处理的元素数量、UB(Unified Buffer)单次处理量,初始化全局张量(GM)、输入 / 输出队列、中转缓冲(仅 fp16/bf16 需要);
  2. 数据拷贝(CopyIn/CopyOut):通过DataCopyPad完成 GM 与 UB 之间的数据传输,保证数据对齐;
  3. 计算(Compute):根据数据类型选择计算路径,完成反双曲余弦运算后将结果写入输出队列;
  4. 流程调度(Process):按 UB 切分粒度循环执行 “拷贝 - 计算 - 输出”,处理尾部余量(最后一次循环可能处理少于 UB 因子的元素)。

3. Tiling(切分)策略

Tiling 是多核并行的核心,acosh\_tiling\.cpp实现了精细化的切分逻辑:

  • 多核切分:将总元素数均分到各 AI Core,尾部核处理余量;

  • UB 切分:根据 UB 大小、缓冲模式、数据类型计算ubFactor(单次 UB 处理元素数):

    • FLOAT32:单缓冲占用 2 个 UB 缓冲区,双缓冲占用 4 个;
    • FLOAT16/BFLOAT16:因需 fp32 中转,单缓冲占用 3 个 UB 缓冲区,双缓冲占用 6 个;
  • 缓冲模式选择:总元素数 > 1024 时启用双缓冲,减少数据传输等待,提升并行效率。

四、性能优化关键点

1. 缓冲策略优化

双缓冲模式通过 “预取数据 + 并行计算” 隐藏数据拷贝延迟,尤其在大张量计算时,相比单缓冲可显著提升吞吐量。

2. UB 资源高效利用

通过FloorAlign对齐 UB 块大小,避免 UB 空间浪费;针对不同数据类型的字节数(fp32=4B,fp16/bf16=2B)差异化计算ubFactor,最大化利用硬件资源。

3. 多核负载均衡

CeilDiv\(totalNum, coreNum\)均分元素数,保证各 AI Core 负载接近,避免 “核闲不均” 问题。

五、应用场景与注意事项

1. 典型应用场景

  • 机器学习:非线性变换、特征归一化(如处理大于 1 的连续特征);
  • 科学计算:信号处理、几何计算中的反双曲函数求解;
  • 深度学习:激活函数变种、梯度计算中的数值变换。

2. 开发与部署注意事项

  • 硬件适配:仅在 Ascend 950PR/950DT 上验证通过,需确认产品型号;
  • 数据范围:输入需满足x≥1x \geq 1x1,否则会因对数函数定义域问题返回无效值;
  • 精度控制:FLOAT16/BFLOAT16 场景需关注类型转换的精度损失,敏感场景建议使用 FLOAT32;
  • 性能调优:大张量(元素数>1024)启用双缓冲,小张量用单缓冲减少开销。

六、总结

Acosh 算子作为基础数学算子,在 Ascend 平台下的实现充分结合了硬件架构特性:通过差异化计算路径解决数据溢出问题,通过 Tiling 切分和缓冲策略提升并行效率,通过灵活的调用接口适配不同开发场景。理解其底层实现逻辑与优化策略,有助于开发者在 AI 推理 / 训练中合理使用该算子,兼顾计算精度、性能与硬件适配性。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐