已通过!
一、考试介绍
1 考试类型:编程题
2 考试时长:不限(下方考试时间仅2小时,请做好题目合成文件包后,再进考试上传!)
3 考试环境搭建要求:环境上要有昇腾NPU,且CANN版本为8.0.RC2.alpha003。请开发者自行准备。
典型场景举例:
4 考试题目:
实现Ascend C算子Sinh,算子命名为SinhCustom,编写其kernel侧代码、host侧代码,并完成aclnn算子调用测试。
相关算法:sinh(x) = (exp(x) - exp(-x)) / 2.0
要求:
4.1 完成Sinh算子kernel侧核函数相关代码补齐。
4.2 完成Sinh算子host侧Tiling结构体成员变量创建,以及Tiling实现函数的补齐。
4.3 要支持Float16类型输入输出。
4.4 不要使用Sinh高阶API,使用高阶API不得分
6 考试说明:
6.1 提供的考题代码工程中,SinhCustom目录为算子工程目录,依次打开下图红框所示的三个源码文件,并根据注释提示补全相关代码,可参考示例。
二、 考题分析
2.1 op_host侧
2.1.1 sinh_custom.cpp
#include "kernel_operator.h"
using namespace AscendC;
constexpr int32_t BUFFER_NUM = 2; // 定义缓冲区的数量为2
// 定义自定义的 KernelSinh 类,用于实现 sinh 运算的自定义内核
class KernelSinh {
public:
// 内核类的构造函数,使用 `__aicore__` 关键词表示这是在 AI Core 上执行的代码
__aicore__ inline KernelSinh() {}
/**
* @brief Init 函数负责初始化全局内存、局部缓存以及块和Tile的长度。
*
* @param x 输入数据的全局内存地址
* @param y 输出数据的全局内存地址
* @param totalLength 输入数据的总长度
* @param tileNum 每个块内的数据将被进一步划分为多少个Tile
*/
__aicore__ inline void Init(GM_ADDR x, GM_ADDR y, uint32_t totalLength, uint32_t tileNum)
{
// 确保块的数量不为0,否则输出错误信息
ASSERT(GetBlockNum() != 0 && "block dim can not be zero!");
// 计算每个块需要处理的数据长度
this->blockLength = totalLength / GetBlockNum();
this->tileNum = tileNum;
// 确保tile的数量不为0,否则输出错误信息
ASSERT(