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

Dot算子实现

概述

BLAS Dot算子实现,包含实数点积(Sdot)和复数点积(Cdot)两类接口。

Dot(点积)算子实现了两个向量的点积运算,是BLAS基础线性代数库中的核心算子之一。

该算子包含以下接口:

  • aclblasSdot:实数向量点积,result = Σ(x[i] * y[i])
  • aclblasCdotu:无共轭的复数点积,result = Σ(x[i] * y[i])
  • aclblasCdotc:共轭的复数点积,result = Σ(conj(x[i]) * y[i])

广泛应用于信号处理、统计学、量子计算和线性代数等领域。

产品支持情况

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

目录结构介绍

blas/dot/
├── README.md                       // 说明文档
├── arch22/
│   ├── cdot_host.cpp               // Cdot Host 侧实现(arch22)
│   ├── cdot_kernel.cpp             // Cdot Kernel 侧实现(arch22)
│   ├── sdot_host.cpp               // Sdot Host 侧实现(arch22)
│   └── sdot_kernel.cpp             // Sdot Kernel 侧实现(arch22)
└── arch35/
    ├── sdot_host.cpp               // Sdot Host 侧实现(arch35)
    ├── sdot_kernel.cpp             // Sdot Kernel 侧实现(arch35)
    └── sdot_tiling_data.h          // Sdot Tiling 数据结构(arch35)

test/dot/sdot/
├── CMakeLists.txt                  // 测试构建文件
├── sdot_param.h                    // CSV 参数解析结构体
├── sdot_golden.h                   // CPU golden(cblas_sdot)
└── arch35/
    ├── sdot_test.cpp               // 测试代码(arch35,GTest 参数化)
    ├── sdot_test.csv               // CSV 测试用例
    └── sdot_npu_wrapper.h          // NPU wrapper

算子描述

Sdot(实数点积)

  • 算子功能:

sdot算子实现了两个实数向量的点积运算。对应的数学表达式为:

result = x · y = Σ(x[i] * y[i])  for i = 0 to n-1

其中x和y是实数向量。

  • 对应的接口为:
aclblasStatus_t aclblasSdot(aclblasHandle_t handle, const int64_t n, const float *x, const int64_t incx,
                              const float *y, const int64_t incy, float *result);
参数 sdot 参数说明
参数列表 Param. Memory in/out 含义
handle in ACL BLAS句柄,通过handle管理stream和workspace。
n in 实数向量的元素个数。
x device in 实数向量 float 指针(device侧),包含 n 个float元素。
incx in 向量x的步长,不可为0。
y device in 实数向量 float 指针(device侧),包含 n 个float元素。
incy in 向量y的步长,不可为0。
result device out 实数结果 float 指针(device侧),包含 1 个float元素。
  • 算子规格:

    算子类型(OpType)Sdot
    算子输入nameshapedata typeformat
    xNfloatND
    yNfloatND
    算子输出result1floatND
    核函数名sdot_kernel
  • 算子实现:

    1. 数据搬运:将输入数据从x和y的GM地址分块搬运到UB
    2. 乘法运算:使用mul_v指令计算x[i] * y[i]
    3. 累加归约:使用cadd_v指令对所有乘法结果进行累加
    4. 多核归约:所有核心的结果汇总到core 0,得到最终结果

    关键优化

    • 使用mul_vcadd_v向量化指令进行乘法和累加,提升性能
    • 采用ping-pong流水线,实现数据搬运和计算的重叠
    • 支持多核并行计算,提升大规模数据处理能力

    arch35 实现说明:Host 侧通过 GetAivCoreCount() 获取 AIV 核数,workspace 从 handle 获取(aclblasGetEffectiveWorkspace),异步 launch kernel 后直接返回。Tiling 数据通过值传递给 kernel(结构体仅含 4 个字段,适合传值)。

Cdot(复数点积)

  • 算子功能:

aclblasCdotu(无共轭点积):

result = Σ(x[i] * y[i])
其中:(a + bi) * (c + di) = (ac - bd) + (ad + bc)i

aclblasCdotc(共轭点积):

result = Σ(conj(x[i]) * y[i])
其中:conj(x) = x_real - x_imag*i
      (a - bi) * (c + di) = (ac + bd) + (ad - bc)i
  • 对应的接口为:

aclblasCdotu接口:

int aclblasCdotu(const float *x, const float *y, float *result, const int64_t n, void *stream);

aclblasCdotc接口:

int aclblasCdotc(const float *x, const float *y, float *result, const int64_t n, void *stream);

参数说明:

参数 内存位置 输入/输出 含义
x device in 复数向量,包含 2*n 个float元素(实部和虚部交替存储)
y device in 复数向量,包含 2*n 个float元素(实部和虚部交替存储)
result device out 复数结果,包含 2 个float元素(实部和虚部)
n - in 复数向量的元素个数
stream - in ACL stream
  • 算子规格:

    算子类型(OpType)Cdot
    算子输入nameshapedata typeformat
    x2 * NfloatND
    y2 * NfloatND
    算子输出result2floatND
    核函数名cdot_kernel
  • 算子实现:

    1. 数据搬运:将输入数据从x和y的GM地址分块搬运到UB
    2. 复数分离:使用vreducev2指令将复数的实部和虚部分离
    3. 共轭处理:cdotu (isConj=0) 不进行共轭处理;cdotc (isConj=1) 对x的虚部取反
    4. 复数乘法:计算(x_real + x_imagi) * (y_real + y_imagi)
    5. 累加归约:使用cadd_v指令对所有结果进行累加
    6. 多核归约:所有核心的结果汇总到core 0,得到最终结果

    关键优化

    • 使用vreducev2向量化指令进行复数分离,避免标量循环
    • 使用cadd_v向量化指令进行累加归约,提升性能
    • 采用ping-pong流水线,实现数据搬运和计算的重叠
    • 支持多核并行计算,提升大规模数据处理能力
  • 调用实现 使用内核调用符<<<>>>调用核函数。

编译运行

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

  • 配置环境变量

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

    bash build.sh --ops=sdot --run
    bash build.sh --ops=cdot --run
    

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

    [  PASSED  ] N tests.
    

算子特性

性能特性

  • 向量化计算:使用底层向量化指令(mul_v、cadd_v、vreducev2)实现高性能计算
  • 流水线并行:采用ping-pong双缓冲技术,实现数据搬运和计算的重叠
  • 多核并行:支持多核并行计算,自动分配计算任务

精度要求

  • 相对误差 < 1e-5