文件最后提交记录最后更新时间
refactor(blas): flatten directory structure and fix README files Co-authored-by: wuyi_huawei<wuyi36@hisilicon.com> # message auto-generated for no-merge-commit merge: !180 merge docs/issue-167-flatten-blas-structure into master refactor(blas): flatten directory structure and fix README files Created-by: zhanghua145 Commit-by: wuyi_huawei Merged-by: cann-robot Description: ## 描述 统一 blas/ 下所有算子的目录结构规范:算子主目录放置 README.md,arch22/arch35 子目录仅存放源码文件。 具体变更: 1. **移除冗余的算子子目录层级**:将 blas/<op>/<variant>/ 扁平化为 blas/<op>/,涉及 35 个算子目录 2. **融合多架构 README**:将 dot、gemv、gemv_batched、scal、swap、trmv 的 s/c 变体 README 合并为统一文档 3. **清理 arch 子目录 README**:删除 dot/arch35、rotm/arch22、sbmv/arch35、spmv/arch22、spmv/arch35、symv/arch35 下的 README.md,将有效内容合并至主目录 README 4. **更新目录结构引用**:修正 29 个算子 README 中的目录结构描述,对齐扁平化后的实际路径 ## 关联的Issue [#167](https://gitcode.com/cann/ops-blas/issues/167) ## 测试 目录结构重构,不涉及功能变更,原有测试用例不受影响。 ![47e8113b-862a-466f-9bce-857d39fb524e.png](https://raw.gitcode.com/user-images/assets/8916851/4976ba82-e35c-4f1a-96f2-e0a6e77c60b3/47e8113b-862a-466f-9bce-857d39fb524e.png '47e8113b-862a-466f-9bce-857d39fb524e.png') ## 文档更新 - 融合 6 个算子的多架构 README(dot/gemv/gemv_batched/scal/swap/trmv) - 删除 6 个 arch 子目录 README 并合并内容(dot/rotm/sbmv/spmv/symv) - 更新 29 个算子 README 的目录结构引用 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [x] 其他,请描述:目录结构重构 See merge request: cann/ops-blas!1806 天前
[bugfix] 标杆数据调整 Co-authored-by: justsheldon<taoxudong@huawei.com> # message auto-generated for no-merge-commit merge: !191 merge fix_precision into master [bugfix] 标杆数据调整 Created-by: justsheldon Commit-by: justsheldon Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 修复 BLAS 单精度(s 前缀)系列算子在 arch35 架构下的 CPU 标杆数据精度问题: 1. **标杆数据对齐标准 BLAS**:dot/scal/asum 等算子的 golden 从手动实现改为统一调用 Netlib BLAS(通过 cblas_compat.h),消除负步长处理、累积精度等行为与标准参考的差异 2. **补齐测试驱动**:为 sbmv、spmv、symv 等算子补齐 golden 实现(golden.h)、参数解析(param.h)、NPU 封装(npu_wrapper.h)和 CSV 用例(test.csv) 3. **Host 侧实现整改**:Tiling data 改为 const 引用值传递,workspace 统一复用 handle 的 effective workspace 4. **文档更新**:各算子 README 补充测试结构与测试用例覆盖说明,测试输出格式统一为 [PASS] {op}_test 涉及算子(共 12 个):sasum、sdot、gemv_batched、sger、srotm、ssbmv、sscal、scalex、sspmv、ssymv、stbmv、strmv ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> - #189 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> - 基于 GTest + CSV 参数化驱动框架 - golden 调用标准 Netlib BLAS(cblas_sdot / cblas_sscal 等) - 测试输出:[PASS] {op}_test ![image.png](https://raw.gitcode.com/user-images/assets/8916851/6ee91373-0ce7-4682-8edf-31882df6b2a7/image.png 'image.png') ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 更新 blas/{asum,dot,gemv_batched,ger,rotm,sbmv,scal,scalex,spmv,symv,tbmv,trmv}/README.md,补充测试结构与测试用例覆盖说明 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!19119 小时前
[bugfix] 标杆数据调整 Co-authored-by: justsheldon<taoxudong@huawei.com> # message auto-generated for no-merge-commit merge: !191 merge fix_precision into master [bugfix] 标杆数据调整 Created-by: justsheldon Commit-by: justsheldon Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 修复 BLAS 单精度(s 前缀)系列算子在 arch35 架构下的 CPU 标杆数据精度问题: 1. **标杆数据对齐标准 BLAS**:dot/scal/asum 等算子的 golden 从手动实现改为统一调用 Netlib BLAS(通过 cblas_compat.h),消除负步长处理、累积精度等行为与标准参考的差异 2. **补齐测试驱动**:为 sbmv、spmv、symv 等算子补齐 golden 实现(golden.h)、参数解析(param.h)、NPU 封装(npu_wrapper.h)和 CSV 用例(test.csv) 3. **Host 侧实现整改**:Tiling data 改为 const 引用值传递,workspace 统一复用 handle 的 effective workspace 4. **文档更新**:各算子 README 补充测试结构与测试用例覆盖说明,测试输出格式统一为 [PASS] {op}_test 涉及算子(共 12 个):sasum、sdot、gemv_batched、sger、srotm、ssbmv、sscal、scalex、sspmv、ssymv、stbmv、strmv ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> - #189 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> - 基于 GTest + CSV 参数化驱动框架 - golden 调用标准 Netlib BLAS(cblas_sdot / cblas_sscal 等) - 测试输出:[PASS] {op}_test ![image.png](https://raw.gitcode.com/user-images/assets/8916851/6ee91373-0ce7-4682-8edf-31882df6b2a7/image.png 'image.png') ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 更新 blas/{asum,dot,gemv_batched,ger,rotm,sbmv,scal,scalex,spmv,symv,tbmv,trmv}/README.md,补充测试结构与测试用例覆盖说明 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!19119 小时前
README.md

Scal算子实现

概述

BLAS Scal算子实现,包含实数向量缩放(Sscal)和复数向量缩放(Cscal)。

Scal(Scale)算子实现了向量缩放运算,是BLAS基础线性代数库中的核心算子之一。

该算子包含以下接口:

  • aclblasSscal:实数向量乘以标量,x[i] = alpha * x[i]
  • aclblasCscal:复数向量乘以复数标量,(a+bi)*(c+di) = (ac-bd) + (ad+bc)i

产品支持情况

产品 是否支持 架构
Ascend 950PR / Ascend 950DT arch35
Atlas A3 训练系列产品/Atlas A3 推理系列产品 arch22
Atlas A2 训练系列产品/Atlas A2 推理系列产品 arch22

目录结构介绍

blas/scal/
├── README.md                       // 说明文档
├── arch22/
│   ├── cscal_host.cpp              // Cscal Host 侧实现(arch22)
│   ├── cscal_kernel.cpp            // Cscal Kernel 侧实现(arch22)
│   ├── sscal_host.cpp              // Sscal Host 侧实现(arch22)
│   └── sscal_kernel.cpp            // Sscal Kernel 侧实现(arch22)
└── arch35/
    ├── sscal_host.cpp              // Sscal Host 侧实现(arch35)
    ├── sscal_kernel.cpp            // Sscal Kernel 侧实现(arch35)
    └── sscal_tiling_data.h         // Sscal Tiling 数据结构(arch35)

测试代码位于 test/scal/

test/scal/
├── cscal/
│   ├── CMakeLists.txt              // 编译工程文件
│   └── arch22/
│       └── cscal_test.cpp          // 精度测试(arch22)
└── sscal/
    ├── CMakeLists.txt              // 编译工程文件
    ├── sscal_param.h               // CSV 参数解析
    ├── sscal_golden.h              // CPU golden(调用 cblas_sscal)
    └── arch35/
        ├── sscal_test.cpp          // GTest 精度测试(arch35)
        ├── sscal_test.csv          // CSV 测试用例
        └── sscal_npu_wrapper.h     // NPU 调用封装

算子描述

Sscal(实数向量缩放)

  • 算子功能:

sscal算子实现了实数向量x乘以标量alpha。对应的数学表达式为:

x[i] = alpha * x[i]  (i = 0 .. n-1,步长为 incx)
  • 对应的接口为:
aclblasStatus_t aclblasSscal(aclblasHandle_t handle, int n, const float* alpha, float* x, int incx);
参数 sscal 参数说明
参数列表 Param. Memory in/out 含义
handle host in ACL 流 handle,用于传入 stream。
n in 向量 x 中的元素个数。
alpha host in 标量乘数(float 指针)。
x device in/out float 向量,包含 n 个元素。
  • 算子规格:

    算子类型 (OpType)Sscal
    算子输入nameshapedata typeformat
    xNfloatND
    算子输出xNfloatND
    核函数名sscal_kernel
  • 算子实现:

    根据步长分两条路径:

    • incx=1 路径(AIV):单kernel sscal_aiv_kernel 实现。Host侧通过GetAivCoreCount()获取AIV核数并均分元素到各核,Tiling数据通过值传递(无需GM分配)。使用 TPipe + TQue(VECIN/VECOUT) 双队列流水:(1) MTE3: DataCopy / DataCopyPad 将 x 从 GM 搬入 UB(32B 对齐,tail 用 Pad 补齐);(2) V: Muls 指令完成向量乘标量;(3) MTE3: DataCopy / DataCopyPad 将结果写回 GM。多核并行按 AIV core 数量均分 n 个元素,每个 core 处理 perCoreN 个(ELEMENTS_PER_BLOCK=8 对齐),末尾 core 吸收余数,Tile 循环避免 UB 溢出。
    • incx≠1 路径(SIMT):单kernel sscal_simt_kernel 实现。通过SIMT多线程并行,每个线程按步长跨步访问向量元素并完成乘标量操作。

    Host侧为异步执行,不包含流同步操作,由调用方负责同步。

Cscal(复数向量缩放)

  • 算子功能:

cscal算子实现了复数向量x乘以复数标量alpha。对应的数学表达式为:

x = alpha * x

复数乘法公式:(real, imag) * (alpha_r, alpha_i) = (real*alpha_r - imag*alpha_i, real*alpha_i + imag*alpha_r)

  • 对应的接口:
int aclblasCscal(aclblasHandle handle, std::complex<float> *x, const std::complex<float> alpha,
                 const int64_t n, const int64_t incx);
参数 cscal 参数说明
参数列表 Param. Memory in/out 含义
handle host in ACL流handle,用于传入stream。
x device in/out 复数向量,包含n个complex元素。
alpha host in 用于乘法的复数标量。
n in 向量x中的复数元素个数。
incx in x中连续元素之间的步长。
  • 算子规格:

    算子类型(OpType)Cscal
    算子输入nameshapedata typeformat
    xNcomplexND
    算子输出xNcomplexND
    核函数名cscal
  • 算子实现:

    将复数向量从GM搬运到UB,使用vreducev2进行虚实分离,分别计算实部实部、实部虚部、虚部实部、虚部虚部,再使用add_v合并结果,最后通过vgather进行虚实合并并搬运回GM。

  • 调用实现 使用内核调用符<<<>>>调用核函数。

测试用例覆盖

测试基于 GTest + CSV 驱动框架,golden 实现调用 Netlib BLAS cblas_sscal

分组 用例数 覆盖场景
异常 5 x空指针、n=0提前退出、n<0提前退出、incx=0无效入参
L0 6 AIV路径(incx=1):n=1/2/4/32/128/512
L1 25 AIV路径(incx=1):alpha=0/1/负/小/大、n=64~16384、全零/全一/NaN/Inf/Extreme特殊数据、非2幂n=7/33/100/1000
L2 18 SIMT路径(incx≠1):incx=2/3/5/7/11、负步长incx=-1/-2/-3、alpha=0/负/小

编译运行

在仓库根目录下执行如下步骤,编译并运行算子测试。

  • 配置环境变量

    source /usr/local/Ascend/cann/set_env.sh
    
  • 编译并执行测试

    bash build.sh --ops=sscal --run --soc=ascend950
    bash build.sh --ops=cscal --run
    

    执行结果如下,说明精度对比成功。

    [PASS] sscal_test