| feat: 新增面向 arch35 的 aclblasScalex 混合精度向量缩放接口 Co-authored-by: chensi79<chensi79@huawei.com> # message auto-generated for no-merge-commit merge: !162 merge aclblasScalex into master feat: 新增面向 arch35 的 aclblasScalex 混合精度向量缩放接口 Created-by: chensi79 Commit-by: chensi79 Merged-by: cann-robot Description: ## 描述 新增面向 Ascend950(arch35 / DAV_3510)的 aclblasScalex 算子,实现混合精度向量标量乘 x[j] = alpha * x[j](j = (i-1) * incx)。该算子是 BLAS SCAL 的扩展,支持 FP16 / BF16 / FP32 三种向量数据类型,计算始终以 FP32 精度执行后写回原类型。 ### 改动原因 ops-blas 库现有 aclblasSscal 仅支持纯 FP32 向量缩放,无法覆盖半精度(FP16/BF16)输入 + FP32 计算精度的混合精度场景。aclblasScalex 在同一接口下统一覆盖:alpha 固定 FP32(Host 或 Device 指针)、x 支持 FP16/BF16/FP32、executionType 固定 FP32。 ### 改动方法 - include/cann_ops_blas.h:新增 aclblasScalex 接口声明 - include/cann_ops_blas_common.h:新增 aclblasDataType_t 枚举(ACLBLAS_R_16F=150 / ACLBLAS_R_32F=151 / ACLBLAS_R_16BF=152) - blas/scalex/arch35/scalex_host.cpp:参数校验 + 按 incx 分发(==1 → SIMD,≠1 → SIMT)+ 多核切分 - blas/scalex/arch35/scalex_kernel.cpp:双路径 kernel - SIMD(scalex_aiv_kernel):连续访问,DataCopy + Muls - SIMT(scalex_simt_kernel):跨步访问,asc_vf_call 启动 SIMT 线程,支持 incx<0 反向遍历 - FP16/BF16 路径:Cast→FP32 → Muls → Cast 回原类型 - blas/scalex/arch35/scalex_tiling_data.h:tiling 数据结构 - blas/scalex/README.md:接口/参数/数据类型/支持规格/精度要求/调用示例 ### 支持规格 | 项目 | 内容 | |------|------| | 数据类型 | alpha=FP32, x∈{FP16, BF16, FP32}, execution=FP32 | | 目标芯片 | Ascend950(Ascend950DT / Ascend950PR)| | 目标架构 | arch35(DAV_3510)| | 编程模型 | SIMD(incx=1)+ SIMT(incx≠1)| ## 关联的Issue - https://gitcode.com/cann/ops-blas/issues/157 ## 测试 test/scalex/ 基于 gtest + CSV 参数化: - scalex_test.csv 覆盖 L0 边界与正常用例:n<0 / n==0 / n==1 / nullptr / incx==0 / 不支持类型 / FP16·BF16·FP32·incx=1 - scalex_npu_wrapper.h:NPU 端调用 wrapper;scalex_golden.h:FP32 精度参考实现 - 运行:bash build.sh --ops=scalex --run --soc=ascend950 ## 文档更新 新增 blas/scalex/README.md:完整接口、参数表、数据类型枚举、支持规格、精度要求(MARE/MERE)、返回值、调用示例(FP32 / FP16 混合精度 / incx 非连续三场景)。 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!162 | 8 天前 |