文件最后提交记录最后更新时间
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!1916 小时前
[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!1916 小时前
README.md

symv算子实现

概述

BLAS symv算子实现。

symv(Symmetric Matrix-Vector Multiplication)算子实现了对称矩阵与向量的乘法运算,是BLAS基础线性代数库中的核心算子之一。

该算子针对对称矩阵的存储特性进行了优化,并高效完成矩阵与向量的乘加运算。

产品支持情况

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

目录结构介绍

blas/symv/
├── README.md                       // 说明文档
├── arch22/
│   ├── ssymv_host.cpp              // Host 侧实现(arch22)
│   └── ssymv_kernel.cpp            // Kernel 侧实现(arch22)
└── arch35/
    ├── ssymv_host.cpp              // Host 侧实现(arch35)
    ├── ssymv_kernel.cpp            // Kernel 侧实现(arch35)
    └── ssymv_tiling_data.h         // Tiling 数据结构(arch35)

test/symv/ssymv/
├── CMakeLists.txt                  // 测试构建文件
├── ssymv_param.h                   // CSV 参数解析结构体
├── ssymv_golden.h                  // CPU golden(cblas_ssymv)
├── arch22/
│   └── ssymv_test.cpp              // 测试代码(arch22)
└── arch35/
    ├── ssymv_test.cpp              // 测试代码(arch35,GTest 参数化)
    ├── ssymv_test.csv              // CSV 测试用例
    └── ssymv_npu_wrapper.h         // NPU wrapper

算子描述

  • 算子功能:
    symv算子实现了对称矩阵乘以向量。对应的数学表达式为:
y = alpha * A * x + beta * y

A为对称矩阵,x和y是向量,alpha和beta是标量。结果直接写回y(in-place)。

对称矩阵A仅存储上三角或下三角部分(由uplo参数指定),未存储的部分通过对称性推断。矩阵按列主序(column-major)存储,主维为lda。

对应的接口为:

aclblasStatus_t aclblasSsymv(aclblasHandle_t handle, aclblasFillMode_t uplo, int n, const float *alpha,
             const float *A, int lda, const float *x, int incx,
             const float *beta, float *y, int incy);
参数 symv 参数说明
参数列表 Param. Memory in/out 含义
uplo in 指定矩阵 A 存储上三角(ACLBLAS_UPPER)或下三角(ACLBLAS_LOWER)。
n in 对称矩阵 A 的行数和列数。
alpha host/device in 用于乘法的 float 标量。
A device in 对称矩阵 float 数组,维度为 lda x n。仅存储 uplo 指定的三角部分。
lda in 用于存储矩阵A的二维数组的主维,lda >= max(1, n)。
x device in float 向量,包含 n 个元素。
incx in x 中连续元素之间的步长,incx != 0。
beta host/device in 用于乘法的 float 标量。如果 beta == 0,则 y 不必是有效输入。
y device in/out float 向量,包含 n 个元素。输入为初始 y 值,输出为计算结果。
incy in y 中连续元素之间的步长,incy != 0。
  • 算子规格:

    算子类型(OpType)symv
    算子输入nameshapedata typeformat
    Alda x NfloatND
    xNfloatND
    yNfloatND
    alpha1floatND
    beta1floatND
    算子输出yNfloatND
    核函数名ssymv_kernel (arch35) / symv_kernel (arch22)
  • 算子实现:

    arch35 (SIMT):采用 SIMT 编程模型,使用 grid-stride loop 实现线程级并行。每个线程计算输出向量 y 的一个或多个元素,通过 asc_vf_call 分发到不同模板特化(按 uplo 区分 UPPER/LOWER)。Tiling 数据通过传值方式(by value)从 host 传入 kernel,无需分配 GM 设备内存。Host 侧通过 GetAivCoreCount() 获取 AIV 核数,异步 launch kernel 后直接返回。

    arch22 (AscendC):采用 AscendC 编程模型,使用 tile-based 分块计算。将输入数据从 A、x、y 的 GM 地址分块搬运到 UB,进行计算后再搬出到 z(临时缓冲区)所在的 GM 地址,最后拷贝回 y。Tiling 数据通过 GM 地址传入 kernel(结构体较大,不适合传值)。

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

编译运行

在本样例根目录下执行如下步骤,编译并执行算子。

  • 配置环境变量
    请根据当前环境上CANN开发套件包的安装方式,选择对应配置环境变量的命令。

    • 默认路径,root用户安装CANN软件包

      source /usr/local/Ascend/cann/set_env.sh
      
    • 默认路径,非root用户安装CANN软件包

      source $HOME/Ascend/cann/set_env.sh
      
    • 指定路径install_path,安装CANN软件包

      source ${install_path}/cann/set_env.sh
      
  • 样例执行

    bash build.sh --ops=symv --run # --ops=<算子名> --run可选参数,执行测试样例
    

    执行结果如下,说明所有测试用例通过。

    [  PASSED  ] 32 tests.