Snrm2算子实现
【免费下载链接】ops-blas本项目是CANN提供的高性能线性代数计算以及轻量化GEMM调用算子库。项目地址: https://gitcode.com/cann/ops-blas
概述
BLAS Snrm2算子实现,同时支持Scnrm2复数向量欧几里得范数计算。
Snrm2(欧几里得范数)算子实现了计算向量的欧几里得范数(2-范数),是BLAS基础线性代数库中的核心算子之一。
该算子计算L2范数,常用于向量长度计算、归一化和误差估计。
支持的接口
- aclblasSnrm2: 实数向量欧几里得范数
- aclblasScnrm2: 复数向量欧几里得范数(复用snrm2 kernel)
支持的产品
- Atlas A3 训练系列产品/Atlas A3 推理系列产品
- Atlas A2 训练系列产品/Atlas A2 推理系列产品
目录结构介绍
├── snrm2 │ ├── CMakeLists.txt // 编译工程文件 │ ├── README.md // 说明文档 │ └── snrm2_test.cpp // 算子调用样例算子描述
- 算子功能:
Snrm2算子实现了计算向量的欧几里得范数。对应的数学表达式为:
result = sqrt(sum(|x[i]|^2)) for i = 0 to n-1对应的接口为:
int aclblasSnrm2(float *x, float *result, const int64_t n, const int64_t incx, void *stream);aclblasScnrm2接口
复数向量欧几里得范数(复用snrm2 kernel):
int aclblasScnrm2(std::complex<float> *x, float *result, const int64_t n, const int64_t incx, void *stream);数学表达式:
result = sqrt(sum(|z[i]|^2)) = sqrt(sum(real[i]^2 + imag[i]^2))复数向量存储为连续的实部、虚部交替的float数组(2n个float元素),直接调用snrm2 kernel处理2n个float元素即可完成复数向量范数计算。
| 参数 | snrm2 参数说明 | |||
| 参数列表 | Param. | Memory | in/out | 含义 |
| n | in | 向量元素个数。 | ||
| x | device | in | 向量,包含 n 个元素。 | |
| incx | in | x 中连续元素之间的步长。 | ||
| result | device | out | 向量的欧几里得范数。 | |
算子规格:
算子类型(OpType) Snrm2 算子输入 name shape data type format x n float ND 算子输出 result 1 float ND 核函数名 snrm2_kernel 算子实现:
将输入数据从x的GM地址分块搬运到UB,并行计算各核的局部平方和,最后归约并计算平方根得到最终结果。
调用实现
使用内核调用符<<<>>>调用核函数。
编译运行
在本样例根目录下执行如下步骤,编译并执行算子。
配置环境变量
请根据当前环境上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=snrm2 --run # --ops=<算子名> --run可选参数,执行测试样例执行结果如下,说明精度对比成功。
[Success] Case accuracy is verification passed.
【免费下载链接】ops-blas本项目是CANN提供的高性能线性代数计算以及轻量化GEMM调用算子库。项目地址: https://gitcode.com/cann/ops-blas
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考