已关闭
[Requirement|需求建议]: 新增 arch35 平台 aclblasSrot 接口(BLAS SROT 平面旋转) #255
陈思创建于  7月1日关闭于  7月3日
陈思
陈思成员
7月1日 创建

Background(背景信息)

ops-blas 库当前缺少面向 arch35(Ascend 950PR / 950DT)平台的 BLAS Level-1 SROT 接口实现。SROT(Givens 平面旋转)对两个等长 FP32 向量 x、y 按标量 c=cosθ、s=sinθ 原地施加平面旋转:

  • x[i] = c·x[i] + s·y[i]
  • y[i] = c·y[i] − s·x[i](使用原始 x[i])
    该运算是 QR 分解、线性方程组求解、特征值计算等数值线性代数算法的基础原语,需提供与 netlib/OpenBLAS 语义一致、满足 FP32 精度门限的接口供上层 CANN 业务调用。

Origin(信息来源)

ops-blas BLAS Level-1 算子在 arch35 平台的补全需求,由 PR #233(作者 @chensi79)提出并实现。

Benefit / Necessity(价值/作用)

  • 补全 arch35 平台 BLAS Level-1 rot 算子族,与 asum/nrm2/scal/scalex 等已有算子对齐
  • 为依赖平面旋转的上层算法(QR 分解、特征值/奇异值计算、线性方程组求解)提供高性能 NPU 加速原语
  • 接口与 CANN aclblas 风格一致,c/s 标量指针自动识别 Host/Device 内存,降低上层适配成本

Design(设计方案)

  • 接口签名:aclblasStatus_t aclblasSrot(aclblasHandle_t handle, int n, float* x, int incx, float* y, int incy, const float* c, const float* s);x/y 为 FP32、in-place 修改,按 incx/incy 步长访问
  • 按 stride 连续性分两条 kernel 路径(SIMD 与 SIMT 不可共存于同一二进制):
    • 连续路径(incx==1 && incy==1):AIV SIMD kernel,UB 内三 buffer 分块(tileSize = UB_SIZE/(3·sizeof(float))),DataCopy/DataCopyPad 搬运,Muls+Axpy / Muls+Add 计算
    • stride 路径:SIMT kernel,grid-stride 多线程,支持负 stride(尾端起算)与零 stride(退化为单线程串行,复现 netlib 语义)
  • host 端用 aclrtPointerGetAttributes 对 c、s 各自独立判定 Host/Device 内存;n≤0 短路返回 SUCCESS;(n−1)·stride 超 int32 范围返回 INVALID_VALUE
  • 精度对齐 OpenBLAS:连续路径刻意避免 FMA(防止 c==s/45° 时未舍入项发散),满足 MARE ≤ 10·2⁻¹³、MERE ≤ 2⁻¹³

关联 PR:https://gitcode.com/cann/ops-blas/pull/233

likedislike
陈思陈思成员
7月1日 添加了label:requirement
陈思陈思成员
7月1日 将 chensi79 设为负责人
CANN-robotCANN-robot成员
7月3日 关闭了 issue
CANN-robotCANN-robot成员
7月3日 添加了label:resolved