Scopy算子实现
概述
BLAS Scopy算子实现,同时支持Ccopy复数向量复制。
支持的接口
- aclblasScopy: 实数向量复制,将x的数据拷贝到y
- aclblasCcopy: 复数向量复制,复用scopy kernel实现
支持的产品
- Atlas A3 训练系列产品/Atlas A3 推理系列产品
- Atlas A2 训练系列产品/Atlas A2 推理系列产品
目录结构介绍
blas/copy/
├── README.md // 说明文档
├── scopy_host.cpp // Host 侧实现
└── scopy_kernel.cpp // Kernel 侧实现
算子描述
- 算子功能:
scopy算子实现了将x上的数据拷贝到y。对应的数学表达式为:
y = x
aclblasScopy接口
实数向量复制:
int aclblasScopy(aclblasHandle handle, uint8_t *x, uint8_t *y, const int64_t n, const int64_t incx, const int64_t incy);
参数说明:
- handle: aclblas句柄,用于管理stream和workspace
- x: 输入向量x的device侧指针(uint8_t*类型)
- y: 输出向量y的device侧指针(uint8_t*类型)
- n: 向量长度
- incx: x的步长
- incy: y的步长
aclblasCcopy接口
复数向量复制(复用scopy kernel):
int aclblasCcopy(aclblasHandle handle, uint8_t *x, uint8_t *y, const int64_t n, const int64_t incx, const int64_t incy);
参数说明:
- handle: aclblas句柄,用于管理stream和workspace
- x: 输入复数向量x的device侧指针(uint8_t类型,实际存储为连续的实部、虚部交替的float数组,2n个float元素)
- y: 输出复数向量y的device侧指针(uint8_t类型,实际存储为连续的实部、虚部交替的float数组,2n个float元素)
- n: 复数向量长度
- incx: x的步长
- incy: y的步长
复数向量存储为连续的实部、虚部交替的float数组(2n个float元素),直接调用scopy kernel处理2n个float元素即可完成复数向量复制。
注意: 接口参数x和y为device侧指针,调用前需要通过aclrtMalloc分配device内存,并通过aclrtMemcpy将数据从host侧拷贝到device侧。计算完成后需要通过aclrtMemcpy将结果从device侧拷回到host侧。
-
算子规格:
算子类型(OpType) Add 算子输入 name shape data type format x 8 * 2048 float ND y 8 * 2048 float ND 算子输出 z 8 * 2048 float ND 核函数名 scopy_kernel -
算子实现:
将输入数据从输入x的GM地址搬运到UB,再搬出到输入y所在的GM地址。
-
调用实现
使用内核调用符<<<>>>调用核函数。
编译运行
在本样例根目录下执行如下步骤,编译并执行算子。
-
配置环境变量
请根据当前环境上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=scopy --run # --ops=<算子名> --run可选参数,执行测试样例执行结果如下,说明精度对比成功。
[Success] Case accuracy is verification passed.