spmv算子实现
概述
BLAS spmv算子实现。
Spmv(Symmetric Packed Matrix-Vector Multiplication)算子实现了对称压缩矩阵与向量的乘法运算,是BLAS基础线性代数库中的核心算子之一。
该算子针对对称矩阵的存储特性进行了优化,采用压缩存储格式以节省内存空间,并高效完成矩阵与向量的乘加运算。
产品支持情况
| 产品 | 是否支持 | 架构 |
|---|---|---|
| Ascend 950PR / Ascend 950DT | ✓ | arch35 |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | ✓ | arch22 |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | ✓ | arch22 |
目录结构介绍
blas/spmv/
├── README.md // 说明文档
├── arch22/
│ ├── sspmv_host.cpp // Host 侧实现(arch22)
│ └── sspmv_kernel.cpp // Kernel 侧实现(arch22)
└── arch35/
├── sspmv_host.cpp // Host 侧实现(arch35)
├── sspmv_kernel.cpp // Kernel 侧实现(arch35)
└── sspmv_tiling_data.h // Tiling 数据结构(arch35)
算子描述
arch22 接口
- 算子功能:
spmv算子实现了将对称压缩矩阵乘以向量。对应的数学表达式为:
z = alpha * A * x + beta * y
A为对称压缩矩阵,x和y是向量,alpha和beta是标量
对称矩阵A的下三角部分元素按行连续打包储存,元素A(i,j)储存在位置AP[j + i * (i + 1) / 2]中,且i >= j,对应的对称部分通过已有元素推断得出。压缩对称矩阵格式仅需要n * (n + 1) / 2个元素储存。
对应的接口为:
int aclblasSpmv(const float *aPacked, const float *x, const float *y, float *z,
const float alpha, const float beta,
const int64_t n, const int64_t incx, const int64_t incy, void *stream);
| 参数 | spmv 参数说明(arch22) | |||
| 参数列表 | Param. | Memory | in/out | 含义 |
| n | in | 对称压缩矩阵 A 的行数和列数。 | ||
| alpha | host/device | in | 标量乘数。 | |
| aPacked | device | in | 对称压缩矩阵,n*(n+1)/2 个元素。 | |
| x | device | in | 输入向量,包含 n 个元素。 | |
| incx | in | x 中连续元素之间的步长。 | ||
| beta | host/device | in | 标量乘数。如果 beta == 0,则 y 不必是有效输入。 | |
| y | device | in | 输入向量,包含 n 个元素。 | |
| incy | in | y 中连续元素之间的步长。 | ||
| z | device | out | 输出向量,包含 n 个元素。 | |
-
算子规格:
算子类型(OpType) Spmv 算子输入 name shape data type format A (packed) n*(n+1)/2 float ND x N float ND y N float ND 算子输出 z N float ND 核函数名 spmv_kernel -
算子实现:
将输入数据从A,x,y的GM地址分块搬运到UB,进行计算后再搬出到z所在的GM地址。
arch35 接口
- 算子功能:
sspmv 实现了对称压缩矩阵与向量的乘法运算:
y = alpha * A * x + beta * y
其中 A 为 n×n 对称矩阵,以 packed format 压缩存储,仅存上三角或下三角部分(共 n(n+1)/2 个元素),对称部分通过已有元素推断。
对应的接口为:
aclblasStatus_t aclblasSspmv(aclblasHandle handle,
aclblasFillMode uplo, int n, const float *alpha,
const float *AP, const float *x, int incx, const float *beta,
float *y, int incy);
| 参数 | in/out | 设备 | 含义 |
|---|---|---|---|
| handle | in | host | aclblas 库句柄,携带 stream |
| uplo | in | host | ACLBLAS_UPPER(121) 或 ACLBLAS_LOWER(122) |
| n | in | host | 方阵阶数,n >= 0 |
| alpha | in | host | 标量 alpha 的指针 |
| AP | in | device | 对称压缩矩阵,共 n(n+1)/2 个元素 |
| x | in | device | 输入向量,n 个元素 |
| incx | in | host | x 的步长,incx != 0(可正可负) |
| beta | in | host | 标量 beta 的指针 |
| y | in/out | device | 输入/输出向量,n 个元素 |
| incy | in | host | y 的步长,incy != 0(可正可负) |
注意:AP、x、y 必须为 device 侧指针。alpha、beta 为 host 侧指针。stream 通过 aclblasSetStream(handle, stream) 绑定到 handle。
-
算子规格:
算子类型(OpType) Sspmv 算子输入 name shape data type format AP n*(n+1)/2 float ND x N float ND 算子输出 y N float ND 核函数名 sspmv_kernel -
调用实现 使用内核调用符<<<>>>调用核函数。
编译运行
在仓库根目录下执行如下步骤,编译并运行算子测试。
-
配置环境变量
source /usr/local/Ascend/cann/set_env.sh -
编译并执行测试
bash build.sh --ops=spmv --run bash build.sh --ops=spmv --soc=ascend950 --run执行结果如下,说明精度对比成功。
[Success] Case accuracy is verification passed.