已关闭
Feat: 新增面向arch35的aclblasAxpyEx接口 #242
xutianze创建于  6月30日关闭于  6月30日
xutianze
xutianze成员
6月30日 创建

Background(背景信息)

aclblasAxpyEx 实现 BLAS Level-1 AXPY 操作 y := alpha*x + y 的扩展版本,支持多 dtype 数据类型,是线性代数与科学计算中最基础的向量运算之一。

数学定义

y[j] = alpha * x[i] + y[j]    for k = 0, 1, ..., n-1

其中:
  i = ix_0 + k * incx
  j = iy_0 + k * incy
  ix_0 = (incx >= 0) ? 0 : (1 - n) * incx
  iy_0 = (incy >= 0) ? 0 : (1 - n) * incy
  • incx/incy 为元素间隔(非字节),支持负值反向遍历(BLAS 标准语义)。
  • alpha 为标量乘数(FP32),可在 Host 或 Device 内存。
  • xType != ACL_FLOATyType != ACL_FLOAT 时,计算过程先将元素 Cast 到 FP32,完成 alpha * x + y 运算后,再将结果 Cast 回 yType 写回。

接口签名

aclblasStatus_t aclblasAxpyEx(
    aclblasHandle_t handle,
    int n,
    const void* alpha,
    aclDataType alphaType,
    const void* x,
    aclDataType xType,
    int incx,
    void* y,
    aclDataType yType,
    int incy,
    aclDataType executionType);

支持数据类型

参数 合法取值
alphaType ACL_FLOAT(固定)
xType ACL_FLOAT16ACL_BF16ACL_FLOAT
yType ACL_FLOAT16ACL_BF16ACL_FLOAT
executionType ACL_FLOAT(固定)

约束:初始版本要求 xType == yType,若 xType != yType 返回 ACLBLAS_STATUS_NOT_SUPPORTED

参数约束

条件 返回值
handle == nullptr ACLBLAS_STATUS_HANDLE_IS_NULLPTR
n < 0 ACLBLAS_STATUS_INVALID_VALUE
n == 0 ACLBLAS_STATUS_SUCCESS(no-op)
n > 0 && alpha/x/y == nullptr ACLBLAS_STATUS_INVALID_VALUE
incx == 0incy == 0 ACLBLAS_STATUS_INVALID_VALUE
alphaType != ACL_FLOAT ACLBLAS_STATUS_NOT_SUPPORTED
executionType != ACL_FLOAT ACLBLAS_STATUS_NOT_SUPPORTED
xType/yType ∉ {ACL_FLOAT16, ACL_BF16, ACL_FLOAT} ACLBLAS_STATUS_NOT_SUPPORTED
xType != yType ACLBLAS_STATUS_NOT_SUPPORTED

精度标准

采用 MERE_MARE(最大相对误差 + 最大绝对相对误差)模式:

dtype mereThreshold mareMultiplier
ACL_FLOAT (FP32) 2^-13(≈1.22e-4) 10.0
ACL_FLOAT16 (FP16) 2^-10(≈9.77e-4) 10.0
ACL_BF16 2^-7(≈7.81e-3) 10.0

目标芯片与架构

项目 内容
目标芯片 ascend950
目标架构 arch35(DAV_3510)
CANN 版本 9.0.0-beta.2

Workspace 需求

不需要额外 workspace。所有中间计算在 UB(Unified Buffer)中完成。

Origin(信息来源)

cann 开发者

Benefit / Necessity (价值/作用)

AXPY(y = alpha*x + y)是 BLAS Level-1 标准向量运算,广泛应用于线性代数、科学计算、迭代求解器(如共轭梯度法)、神经网络训练中的梯度更新等场景。

aclblasAxpyEx 作为 AXPY 的扩展版本,提供以下价值:

  1. 多 dtype 支持:支持 FP16/BF16/FP32 三种数据类型,满足不同精度与显存占用需求。FP16/BF16 适用于低精度场景,FP32 适用于高精度场景。
  2. BLAS 标准步长语义:支持 incx/incy 正负步长,覆盖连续访问与跨步访问两种内存布局,兼容标准 BLAS 调用模式。
  3. alpha Host/Device 双路径:alpha 标量可位于 Host 或 Device 内存,通过 aclrtPointerGetAttributes 动态判断,适配不同调用场景。
  4. Ex 接口风格:与仓内其他 Ex 算子保持一致的接口风格(alphaType/xType/executionType 参数),便于统一封装与调用。

Design(设计方案)

编程模型

采用 SIMD(连续路径)+ SIMT(跨步路径)双路径架构:

  • 连续路径incx==1 && incy==1):SIMD 编程模型,使用 DataCopy/DataCopyPad 搬运 x/y 向量到 UB,Axpy/Cast 向量 API 计算,多核均分元素。FP16/BF16 使用 SIMD VF RegBase 在寄存器内完成 UNPACK→Cast→Muls+Add→Cast→PACK,中间值不落 UB。
  • 跨步路径incx!=1incy!=1):SIMT 编程模型,__simt_vf__ 修饰计算函数,asc_vf_call 启动线程级并行,直接 GM 读写,块级连续+线程级交错混合分布。

Tiling 策略

  • 多核切分:连续路径自适应核数(MIN_ELEMS_PER_CORE=1024),按 perCoreN 均分,尾核处理 remainder;跨步路径 nthreads 向下对齐,消除空闲核。
  • UB 切分
    • FP32 路径:xBuf + yBuf = 8 B/elem。
    • FP16/BF16 路径:xBuf + yBuf = 4 B/elem(VF 寄存器内 Cast,无需 midBuf)。
  • TilingData 结构:无数组(R4 合规),incx/incy 保留符号支持负步长,startOffsetX/startOffsetY 在 Host 侧预计算。

Kernel 设计

  • FP32 路径:DataCopy x/y → Axpy(y, x, alpha, count) → DataCopy y。
  • FP16/BF16 路径:DataCopy x/y → VF(UNPACK→Cast→Muls+Add→Cast→PACK)→ DataCopy y。
  • SIMT 路径:线程直接 GM 读写,块级连续+线程级交错分布,FP32 直接计算,FP16/BF16 用 static_cast<float> 中转。
  • 多 dtype 分发:以 xType 为 key,if/else if/else 实例化不同模板参数的 Kernel。

Host 设计

  • 参数校验顺序:handle → n → dtype 合法组合 → 指针非空 → incx/incy 非零。
  • alpha 内存位置判断:aclrtPointerGetAttributes 动态判断 Host/Device,通过 TilingData.alphaIsDevice 标志传递。
  • 异步 launch:<<<>>> 异步启动 Kernel,launch 后直接返回,不调用 aclrtSynchronizeStream

参考算子

  • scalex(arch35):Ex 接口风格、多 dtype Cast 逻辑、alpha Host/Device 判断、SIMD+SIMT 双路径架构、TilingData 结构设计。
  • saxpy(arch35):AXPY 操作语义、Axpy() API 用法、SIMT 跨步模式、双向量 UB Buffer 规划。
likedislike
xutianzexutianze成员
6月30日 关联了pull request:Feat: 新增面向arch35的aclblasAxpyEx接口
wangzitaowangzitao成员
6月30日 将 xutianze 设为负责人
CANN-robotCANN-robot成员
6月30日 关闭了 issue
CANN-robotCANN-robot成员
6月30日 添加了label:resolved