昇腾AI原生创新算子挑战赛S1——CNASP坤坤爱曼巴队经验分享
收藏回复举报
昇腾AI原生创新算子挑战赛S1——CNASP坤坤爱曼巴队经验分享
发表于2024-06-06 21:58:30
0 查看

团队简介:

我们的团队名是CNASP-坤坤爱曼巴,我们喜欢唱、跳、rap和ascend c编程,在这次的昇腾AI创新算子挑战赛中我们非常荣幸得获得了铜奖,其中的LessEqual和GreaterEqual算子也荣幸入选收录进算子仓,在这里给大家分享一下学习方法、比赛经验和算子实现。

学习方法:

首先看一下两个教学视频:Ascend C算子开发(入门)Ascend C算子开发(进阶)

初步了解AscendC的目标任务以及算子开发流程,然后通过微认证:Ascend C算子开发能力认证(中级),这样就算是入门了

接下来是CANN官网查看文档CANN官网,在这里可以下载部署cann,也可以查看cann文档,当然如果想快速开发免部署,可以使用我的docker镜像:https://hub.docker.com/r/blankcat/ascend_cann,在这里可以直接pull最新的cann版本镜像以及每个RC的最终alpha版。

文档中首先查看API参考->算子开发接口->AscendC API中的通用概念和约束,这样可以减少你在算子开发中遇到的问题,然后详细阅读数据类型定义和内存管理同步控制模块,这样可以让你对AscendC有一个最基本的全面认知。

然后就可以去看文档中开发指南->AscendC算子开发指南,以及AscendC最佳实践,根据gitee样例库官方样例收录样例直接运行,然后自己做出修改,就可以正式入门算子开发了。

好了,接下来你就可以参加比赛了(笑

比赛经验:

比赛也是充满了未知,我们一拿到所有赛题,就分析需要先针对通用的切分进行编程,这样后续就不用关注tiling切分了

因此前面在第一个算子花了很久开发出一个通用的模板,然后就快速搞好了后面的一维算子

对于所有需要考虑axes的算子,再针对性开发

对了,提交前一定要检查一下能不能build success,我们最后改了指针名字没检查,导致两道题0分,十分可惜

算子实现:

最后简单讲一下收录的两个算子的实现:

cke_172404.png

cke_178802.png

LessEqual算子功能非常简单,在实现上只需要进行这几步:

  1. 首先比较获得两个向量的较大者,存储在y_compute中
  2. 然后用x2减去y_compute,仍然保存在y_compute中,此时y_compute中所有x1>x2的对应位置都非0
  3. 然后对y_compute取绝对值,让非0值都成为正数
  4. 因为非0值可能是0.几,也可能是几十几百,但是最后要输出1和0,因此将非0值全部缩小到FP16的最小正数
  5. 然后用FP16的最小正数的倒数相乘,就能将所有x1>x2的对应位置都置为1,此时结果只有1和0了
  6. 最后将结果加上-1,然后取绝对值,就让所有x1<=x2的对应位置都是1,其余位置都是0了

对于整数,只需要在第四步缩小到1就行了,因为整数的最小正数就是1,然后跳过第五步做第六步即可。

cke_327198.png

cke_329413.png

GreaterEqual算子功能也非常简单,在实现上只需要进行这几步:

  1. 两个输入向量直接作差,x2减去x1,存储在y_compute中,此时y_compute中所有x1<x2的对应位置都非0
  2. 因为非0值可能是0.几,也可能是几十几百,但是最后要输出1和0,因此将非0值全部缩小到FP16的最小正数
  3. 然后将负数都设为0,因为负数代表x2-x1<0,也就是x1>x2的对应位置都为0
  4. 然后用FP16的最小正数的倒数相乘,就能将所有x1<x2的对应位置都置为1,此时结果只有1和0了
  5. 最后用1减去结果,就让所有x1>=x2的对应位置都是1,其余位置都是0了

对于整数,只需要在第二步缩小到1就行了,因为整数的最小正数就是1,然后跳过第四步做第五步即可。

我要发帖子