CANN启航营FastGelu算子实现 FastGelu Ascend C 算子提交说明【免费下载链接】cann-launch-camp用户可借助此项目规范管理 CANN 开源社区启航营高校活动的课程作业、课设、毕设等实践作品其核心功能是统一标准化目录层级与提交规范保障作品提交规整、可追溯、可评审。项目地址: https://gitcode.com/cann/cann-launch-camp提交人yanghaitianGitCode 账号2301_80739235任务fast_gelu1. 实现内容本目录提交的是 FastGelu Ascend C 自定义算子工程源码基于题目要求实现逐元素计算y x * exp(0.851 * (x - abs(x))) / (1 exp(-1.702 * abs(x)))支持能力输入/输出 dtypefloat16、float32输入/输出 formatND输出 shape 与输入 shape 一致兼容非 32 字节对齐尾部数据支持多核切分与双缓冲队列2. 目录结构yanghaitian_2301_80739235_fast_gelu/ |-- README.md |-- build.sh -- code/ |-- CMakeLists.txt |-- op_host/ | |-- CMakeLists.txt | -- fast_gelu.cpp -- op_kernel/ |-- CMakeLists.txt |-- fast_gelu.cpp |-- fast_gelu_tiling.h -- tiling_key_fast_gelu.h3. 实现要点Host 侧根据输入总元素数、AI Vector Core 数量和 UB 大小计算blockDim与tileSize。Kernel 侧使用TQueVECIN, 2和TQueVECOUT, 2通过pipe.InitBuffer(..., 2, ...)开启 double buffer。float32路径使用 CANN AscendCFasterGelufloat, false, false避免highPerformancetrue带来的精度风险。float16路径使用 float 中间计算Cast half-float、Muls、Exp、Adds、Div、Cast float-half在保证精度的同时减少不必要的指数计算。使用DataCopyPad处理非 32 字节对齐尾部直接DataCopy处理 32 字节对齐分块。4. 编译方式在具备 CANN/AscendC 环境的机器上执行cd yanghaitian_2301_80739235_fast_gelu bash build.sh或手动执行cd code mkdir -p build cd build cmake .. make -j5. 本地验证本地使用 CANN 9.0.0 做过以下验证opbuild/打包流程通过生成 Ascend910B 的float16和float32kernel。CPU 仿真覆盖float16/float32。CPU 仿真覆盖长度0, 1, 4, 17, 31, 32, 33, 63, 64, 65, 255, 256, 257, 1000。覆盖非 32 对齐长度和多核尾块切分场景。最终性能与正确性以 CANNJudge / 真实 Ascend 910B NPU 评测结果为准。【免费下载链接】cann-launch-camp用户可借助此项目规范管理 CANN 开源社区启航营高校活动的课程作业、课设、毕设等实践作品其核心功能是统一标准化目录层级与提交规范保障作品提交规整、可追溯、可评审。项目地址: https://gitcode.com/cann/cann-launch-camp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考