Pull Request已成功合入, 合并人@CANN-robot
(感谢 iuyi 的贡献)变更摘要
本次 PR 为 arch35 架构新增 GEAM(General Matrix Add)算子,提供 aclblasSgeam(单精度浮点)和 aclblasCgeam(单精度复数)两个公共接口,实现带标量缩放的矩阵加法 C = alpha * op(A) + beta * op(B),支持 NoTrans / Trans / ConjTrans 三种转置模式,采用列主序存储。整体实现覆盖公共 API 声明、主机端参数校验与 Tiling 计算、Vector 核心 kernel、以及完整的测试框架。
主要改动
-
新增公共 API 声明:在
include/cann_ops_blas.h中新增aclblasSgeam和aclblasCgeam两个函数声明,接口遵循 BLAS 标准(含handle、transa/transb、m/n、alpha/beta、lda/ldb/ldc等参数),扩展了算子的对外可用性。 -
新增主机端实现与参数校验:
sgeam_host.cpp和cgeam_host.cpp实现了 Tiling 数据计算(基于 UB 容量和MAX_BLOCK_COUNT=4095硬件限制)、2D 多核分解(colBlocks × mBlocks)、及 Kernel 启动;geam_host_common.h提供模板化的ValidateGeamParams,统一校验转置类型、维度、leading dimension、nullptr 输入(含alpha=nullptr等价于alpha=0的 BLAS 扩展语义)以及 in-place(C==A或C==B)合法性。 -
新增设备端 Vector Kernel:
sgeam_kernel.cpp采用TPipe+TQue<VECIN>/VECOUT+TBuf<VECCALC>架构,分 PATH A(NN 多列 strided DataCopyPad)和 PATH B(单列/转置/共轭转置)两条路径;cgeam_kernel.cpp采用交错复数存储,分别管理实部/虚部缓冲区和队列,支持alpha==0/beta==0缓冲区优化(beta==0时跳过 B 的 2 个缓冲区),并通过Muls+Sub/Add组合实现复数乘法与共轭处理。 -
新增 Tiling 数据结构:
sgeam_tiling_data.h和cgeam_tiling_data.h定义了 host/device 共享的 Tiling 参数结构体,包含矩阵维度、leading dimension、alpha/beta 标量、转置类型、零值标志位、2D 分块参数(colBlocks/perCoreN/remainder和mBlocks/perCoreMTile/mTileRemainder)以及tileM。SgeamTilingData额外包含colsIter用于 NN 多列路径。 -
新增测试框架与 golden 参考实现:
test/geam/下新增 sgeam 和 cgeam 的完整测试体系,包括 CSV 参数化测试用例、NPU wrapper(处理 device 内存分配及 in-place 场景的拷回逻辑)、geam_golden.h提供的 CPU 参考实现aclblasGeam_cpu(模板化支持 float 和std::complex<float>,内附conjugate辅助函数处理 C 转置下的共轭),以及各边界条件硬编码测试(null handle、nullptr 输入、非法转置、负维度、leading dimension 不足、in-place 约束违规等)。


/lgtm


/approve


描述
GEAM(General Matrix Add)执行带标量缩放的矩阵加法运算,支持对输入矩阵 A、B 分别施加可选的转置(Transpose)或共轭转置(ConjTrans)操作。数学定义为:
其中
op(X)根据转置参数取X(NoTrans)、X^T(Trans)或X^H(ConjTrans,仅复杂数有意义,浮点数等价于 Trans)。矩阵采用列主序(Column-Major)存储,X[i, j]的物理地址为X[i + j * ldX]。本算子提供两个接口:
aclblasSgeam(单精度浮点 float)与aclblasCgeam(单精度复数 aclblasComplex),覆盖实数与复数两类矩阵加法场景。关联的Issue
测试
test/geam/ 下测试全部通过
文档更新
blas/geam/README.md
类型标签