3 天上手 Ascend C 编程丨带你认识 Ascend C 基本概念及常用接口
本文分享自《 【2023 · CANN训练营第一季】——Ascend C算子开发入门——第一次课(核函数的定义及实现)》,作者:dayao。
Ascend C 是 CANN 针对算子开发场景推出的编程语言,原生支持 C 和 C++标准规范,最大化匹配用户开发习惯;通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力 AI 开发者低成本完成算子开发和模型调优部署。
时间充足的小伙伴推荐去看官方教程:Ascend C官方教程
想省时省力快速入门可以看这篇文章,为你系统化梳理 AscendC 编程最重要的知识点,3 天快速上手不迷路!
第 1 天学习要点:
一、使用 Ascend C 有哪些优势
C/C++原语编程
编程模型屏蔽硬件差异,编程范式提高开发效率
多层级 API 封装,从简单到灵活,兼顾易用与高效
孪生调试,CPU 侧模拟 NPU 侧的行为,可先在 CPU 侧调试
二、核函数
核函数(Kernel Function)是 Ascend C 算子 kernel 侧实现的入口。Ascend C 允许用户使用核函数这种 C/C++函数的语法扩展来管理设备端的运行代码,用户在核函数中进行算子类对象的创建和其成员函数的调用,由此实现该算子的所有功能。核函数是主机端和设备端连接的桥梁。
1、核函数定义
核函数是直接在设备端执行的代码。在核函数中,需要为在一个核上执行的代码规定要进行的数据访问和计算操作,当核函数被调用时,多个核将并行执行同一个计算任务。核函数需要按照如下规则进行编写。
1、函数类型限定符
2、必须具有 void 返回类型
3、变量类型限定符
为了方便:指针入参变量统一的类型定义为__gm__ uint8_t*。用户统一使用 uint8_t 类型的指针,并在使用时转换为实际的指针类型;亦可直接传入实际的指针类型。
2、核函数调用
核函数的调用语句是 C/C++函数调用语句的一种扩展。不同于常见的 function_name(argument list)函数调用方式,核函数使用内核调用符<<<...>>>这种语法形式,来规定核函数的执行配置:
1、内核调用符这种调用方式,仅可在 NPU 侧编译时调用,CPU 侧编译无法识别该符号。
2、核函数的调用是异步的,核函数的调用结束后,控制权立刻返回给主机端,可以调用 aclrtSynchronizeStream 函数来强制主机端程序等待所有核函数执行完毕。
3、算子运行验证
Ascend C 算子可用 CPU 模式或 NPU 模式执行
CPU 模式:算子功能调试用,可以模拟在 NPU 上的计算行为,不需要依赖昇腾设备
NPU 模式:算子功能/性能调试,可以使用 NPU 的强大算力进行运算加速
4、代码里使用内置宏 __CCE_KT_TEST__标识被宏包括的代码在 CPU 或 NPU 模式下编译。
三、helloworld 样例演示
1、代码
2、编译与运行
四、常用数据定义
1、GlobalTensor
GlobalTensor 用来存放 Global Memory(外部存储)的全局数据。
buffer:主机侧传入的全局数据指针
bufferSize:所包含的类型为 T 的数据个数,单位为 element,需自行保证不会超出实际数据的长度
类型 T 支持所有数据类型,但需要遵循使用此 GlobalTensor 的指令的数据类型支持情况。
SetGlobalBuffer 用于设置 GlobalTensor 的存储位置:buffer 指向外部存储的起始地址,bufferSize 为 Tensor 所占外部存储的大小,如指向的外部存储有连续 256 个 int32_t,则其 dataSize 为 256。代码示例:
2、LocalTensor
用于存放 AI Core 中 Local Memory(内部存储)的数据,支持 QuePosition 为 VECIN、VECOUT、A1、A2、B1、B2、CO1、CO2。
函数说明:类型 T 支持所有数据类型,但需要遵循使用此 LocalTensor 的指令的数据类型支持情况。
代码示例:
五、多层级 API 接口
Ascend C 提供了多层级的 0-3 级 API,随着级别增高,API 使用的自由度降低,易用性增强。开发者可以根据需要选择合适的 API,使用最通俗易懂的高级接口快速搭建算子逻辑,使用自由灵活的低级接口进行复杂的逻辑实现和性能调优。这样做的主要作用是:
降低复杂指令的使用难度
跨代兼容性保障
保留最大灵活度的可能
1、3 级接口
运算符重载,支持+, -, *, /, |, &, <, >, <=, >=, ==, !=,实现 1 级指令的简化表达。允许用户使用形如:dst = src0 * src1,针对整个 Tensor 进行计算,以下指令 API 拥有 3 级接口:
2、2 级接口
针对源操作数 srcLocal 的连续 COUNT 个数据进行计算,并连续写入目的操作数 dstLocal,解决一维 tensor 的连续计算问题。
3、0 级接口
0 级功能灵活计算接口,是最底层的开发接口,可以完整发回硬件优势的计算 API,可以进行非连续计算,该功能可以充分发回 CANN 系列芯片的强大功能指令,支持对每个操作数的 Block stride,Repeat stride,MASK 的操作,允许用户使用诸多的通用参数来定制化所需要的操作:
1、重复迭代次数-Repeat times
矢量计算单元,每次读取连续的 8 个 block(每个 block32 Bytes,共 256 Bytes)数据进行计算,为完成对输入数据的处理,必须通过多次迭代(repeat)才能完成所有数据的读取与计算。Repeat times 表示迭代的次数。
如下图所示,待处理数据大小为 16 个 block(512Bytes),每次迭代处理 8 个 block(256Bytes),需要两次迭代完成计算,Repeat times 应设置为 2。
2、相邻迭代间相同 block 的地址步长
当 Repeat times 大于 1,需要多次迭代完成矢量计算时,您可以根据不同的使用场景合理设置相邻迭代间相同 block 的地址步长 Repeat stride 的值。
连续计算场景:假设定义一个 Tensor 供目的操作数和源操作数同时使用(即地址重叠),Repeat stride 取值为 8。此时,矢量计算单元第一次迭代读取连续 8 个 block,第二轮迭代读取下一个连续的 8 个 block,通过多次迭代即可完成所有输入数据的计算。
非连续计算场景:Repeat stride 取值大于 8(如取 10)时,则相邻迭代间矢量计算单元读取的数据在地址上不连续,出现 2 个 block 的间隔。
反复计算场景:Repeat stride 取值为 0 时,矢量计算单元会对首个连续的 8 个 block 进行反复读取和计算。
部分重复计算:Repeat stride 取值大于 0 且小于 8 时,相邻迭代间部分数据会被矢量计算单元重复读取和计算,此种情形一般场景不涉及。
3、同一迭代内不同 block 的地址步长
如果需要控制单次迭代内,数据处理的步长,可以通过设置同一迭代内不同 block 的地址步长 Block stride 来实现。
连续计算,Block stride 设置为 1,对同一迭代内的 8 个 block 数据连续进行处理。
非连续计算,Block stride 值大于 1(如取 2),同一迭代内不同 block 之间在读取数据时出现一个 block 的间隔,如下图所示。
4、Mask 参数
mask 用于控制每次迭代内参与计算的元素。可通过连续模式和逐比特模式两种方式进行设置。
连续模式:表示前面连续的多少个元素参与计算。数据类型为 uint64_t。取值范围和操作数的数据类型有关,数据类型不同,每次迭代内能够处理的元素个数最大值不同(当前数据类型单次迭代时能处理的元素个数最大值为:256 / sizeof(数据类型))。当操作数的数据类型占比特位 16 位时(如 half,uint16_t),mask∈[1, 128];当操作数为 32 位时(如 float, int32_t),mask∈[1, 64]。
逐 bit 模式:可以按位控制哪些元素参与计算,bit 位的值为 1 表示参与计算,0 表示不参与。参数类型为长度为 2 的 uint64_t 类型数组。参数取值范围和操作数的数据类型有关,数据类型不同,每次迭代内能够处理的元素个数最大值不同。当操作数为 16 位时,mask[0]、mask[1]∈[0, 264-1];当 dst/src 为 32 位时,mask[1]为 0,mask[0]∈[0, 264-1]。
512 个 int16 相加分别用 0,2,3 级接口实现对比,大家可以根据自己的实际需要选择对应的接口。
六、更多学习资源
好啦,本次分享结束啦,Ascend C 的学习资源还有很多,想深入学习的可以参考官网教程:Ascend C官方教程。
号外!
华为将于 2023 年 9 月 20-22 日,在上海世博展览馆和上海世博中心举办第八届华为全联接大会(HUAWEICONNECT 2023)。本次大会以“加速行业智能化”为主题,邀请思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁,从商业、产业、生态等方面探讨如何加速行业智能化。
我们诚邀您莅临现场,分享智能化的机遇和挑战,共商智能化的关键举措,体验智能化技术的创新和应用。您可以:
在 100+场主题演讲、峰会、论坛中,碰撞加速行业智能化的观点
参观 17000 平米展区,近距离感受智能化技术在行业中的创新和应用
与技术专家面对面交流,了解最新的解决方案、开发工具并动手实践
与客户和伙伴共寻商机
感谢您一如既往的支持和信赖,我们热忱期待与您在上海见面。
大会官网:https://www.huawei.com/cn/events/huaweiconnect
欢迎关注“华为云开发者联盟”公众号,获取大会议程、精彩活动和前沿干货。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/814eac5ff6fc7d6ec4547867f】。文章转载请联系作者。
评论