首页 > 编程语言 >【2023 · CANN训练营第一季】TIK C++算子开发入门笔记​

【2023 · CANN训练营第一季】TIK C++算子开发入门笔记​

时间:2023-05-11 20:32:35浏览次数:49  
标签:CANN 编程 C++ Queue 任务 2023 算子 TIK

【2023 · CANN训练营第一季】TIK C++算子开发入门笔记

TIK C++介绍

TIK C++是一种使用C/C++作为前端语言的算子开发工具,通过四层接口抽象、并行编程范式、孪生调试等技术,极大提高算子开发效率,助力AI开发者低成本完成算子开发和模型调优部署

使用TIK C++开发自定义算子的优势:

•C/C++原语编程

•编程模型屏蔽硬件差异,编程范式提高开发效率

•多层级API封装,从简单到灵活,兼顾易用与高效

•孪生调试,CPU侧模拟NPU侧的行为,可先在CPU侧调试


核函数

核函数(Kernel Function)是TIK C++算子设备侧的入口。TIK C++允许用户使用核函数这种C/C++函数的语法扩展来管理设备侧的运行代码,用户在核函数中实现算子逻辑的编写,例如自定义算子类及其成员函数以实现该算子的所有功能。核函数是主机侧和设备侧连接的桥梁。

【2023 · CANN训练营第一季】TIK C++算子开发入门笔记​_数据


核函数是直接在设备侧执行的代码。在核函数中,需要为在一个核上执行的代码规定要进行的数据访问和计算操作,当核函数被调用时,多个核将并行执行同一个计算任务


算子执行的不同模式

TIK C++算子可用CPU模式或NPU模式执行

CPU模式:算子功能调试用,可以模拟在NPU上的计算行为,不需要依赖N腾设备

NPU模式:算子功能/性能调试,可以使用NPU的强大算力进行运算加速


使用内置宏__CCE_KT_TEST__标识被宏包括的代码在特定的模式下编译

#ifdef __CCE_KT_TEST__ 表示在CPU模式下会编译该段代码

#ifndef __CCE_KT_TEST__ 表示在NPU模式下会编译该段代码


编程范式

快速开发编程的固定步骤

统一代码框架的开发捷径

使用者总结出的开发经验

面向特定场景的编程思想

定制化的方法论开发体验

TIK C++编程范式把算子内部的处理程序,分成多个流水任务(Stage),以张量(Tensor)为数据载体,以队列(Queue)进行任务之间的通信与同步,以内存管理模块(Pipe)管理任务间的通信内存。


流水任务

流水任务(Stage)指的是单核处理程序中主程序调度的并行任务。在核函数内部,可以通过流水任务实现数据的并行处理来提升性能。

举例来说,单核处理程序的功能可以被拆分成3个流水任务:Stage1、Stage2、Stage3,每个任务专注于完成单一功能;需要处理的数据被切分成n片,使用Progress1~n表示,每个任务需要依次完成n个数据切片的处理。Stage间的箭头表达数据间的依赖关系,比如Stage1处理完Progress1之后,Stage2才能对Progress1进行处理。

【2023 · CANN训练营第一季】TIK C++算子开发入门笔记​_核函数_02



流水任务设计——矢量编程

矢量算子编程范式把算子的实现流程分为3个基本任务:CopyIn,Compute,CopyOutCopyIn负责数据搬入操作,Compute负责矢量计算操作,CopyOut负责数据搬出操作


任务间通信和同步

数据通信与同步的管理者

不同的流水任务之间存在数据依赖,需要进行数据传递

TIK C++中使用Queue队列完成任务之间的数据通信和同步,Queue提供了EnQue、DeQue等基础APIQueue队列管理NPU上不同层级的物理内存时,用一种抽象的逻辑位置(QuePosition)来表达各个级别的存储(Storage Scope),代替了片上物理存储的概念,开发者无需感知硬件架构矢量编程中Queue类型(逻辑位置)包括:VECIN、VECOUT


任务间通信和同步——矢量编程

矢量编程中的逻辑位置(QuePosition):搬入数据的存放位置:VECIN、搬出数据的存放位置:VECOUT

矢量编程主要分为CopyIn、Compute、CopyOut三个任务:•CopyIn任务中将输入数据从GlobalTensor搬运至LocalTensor后,需要使用EnQue将LocalTensor放入VECIN的Queue中

•Compute任务等待VECIN的Queue中LocalTensor出队之后才可以进行矢量计算,计算完成后使用EnQue将计算结果LocalTensor放入到VECOUT的Queue中•CopyOut任务等待VECOUT的Queue中LocalTensor出队,再将其拷贝到GlobalTensor

标签:CANN,编程,C++,Queue,任务,2023,算子,TIK
From: https://blog.51cto.com/u_5463324/6267659

相关文章

  • 2023.5.11编程一小时打卡
    一、问题描述:完成“学生cpp成绩计算”之后,修改Person和Student类,各自增加两个无参构造函数。仍以Person类为基础,建立一个派生类Teacher,增加以下成员数据:intID;//教师工号Studentstu[100];//学生数组intcount;//学生数目,最多不超过100floatcpp_average;//班......
  • 【2023.05.07 模拟赛】T3 树数树
    Description牛牛有一棵\(n\)个点的有根树,根为1。我们称一个长度为\(m\)的序列\(a\)是好的,当且仅当:\(\foralli\in(1,m],\mathrm{a}_{\mathrm{i}}\)为\(\mathrm{a}_{\mathrm{i}-1}\)的祖先或\(\mathrm{a}_{\mathrm{i}-1}\)是\(\mathrm{a}_{\mathrm{i}}\)的......
  • 2023年5月11日19:31:14
    如果不写可能自己都忘了吧。今天我终于把三更那个个人博客做完了,前面跟着他做,后面他让我们自己做,挺好的,毕竟都是一些重复的东西,自己真 正的学到了很多很多。挺开心的。下一步就是把这个项目上线,如果能够再美化一下前端就好了,所以我还要去学一点前端,但是这个计划不知道什么时候......
  • 2023.5.8
    在常见深度学习任务中,数据样本可能是图片(image)、文本(text)、语音(audio)等多种类型,在送入神经网络训练或推理前,这些数据和对应的标签均需要创建为Tensor。以下是图像场景和NLP场景中手动转换Tensor方法的介绍。对于图像场景,可使用paddle.vision.transforms.ToTensor直接将P......
  • C++
    复数加减(运算符重载)声明一个复数类CComplex(类私有数据成员为double型的real和image)定义构造函数,用于指定复数的实部与虚部。重载<<运算符,以格式real+imagei的格式输出当前对象(当虚部为非负数时,实部虚部中间用+号连接,当虚部为负数时,实部虚部用-号连接:如3+4i,3-4i,3+0i)。重载+运......
  • 2023年高考倒计时还有几天?支持计算倒计时天数的备忘录
    进入2023年的公历5月,对于很多家里有高三学生的网友来说,未来的一个月时间要多多关注孩子的健康、学习状况了,因为一个非常重要的考试将要来临,这就是高考。今年的高考时间依旧是公历的6月7日、8日两天时间,那么今天距离高考倒计时还有几天呢?有不少学生家长想要在手机上设置每天距离高......
  • 2023年母亲节文案怎么写?用便签提前记录
    每年公历5月的第二个星期日是母亲节,而2023年的母亲节也将在5与14日如约而至。为了表达对母亲无私付出的感恩之情,有不少网友会在这一天送给自己母亲一束鲜花、一份礼物。此外还有的人会在微信朋友圈等社交平台发表母亲节文案,来表达对母亲的感恩、祝福。不过还有一些小伙伴不知道......
  • 2023年5月11日记录
     思路:  代码实现:    ......
  • 【2023-05-08】保持淳朴
    20:00读书做人,不是两件事。将所读之书,句句体贴到自己身上来,便是做人之法,如此方叫得能读书;人若不将来身上理会,则读书自读书,做人自做人,只算做“不曾读书的人”。                                    ......
  • C/C++模拟银行排队叫号系统[2023-05-11]
    C/C++模拟银行排队叫号系统[2023-05-11]2、模拟银行排队叫号系统(难度等级A)[问题描述]模拟实现银行的排队叫号系统。[基本要求](1)假定银行上午9点开门,下午5点关门,期间每个小时的客流量不超过35人;(2)每个客户的基本信息包括:到达银行时间、业务需要办理的时长。这两项数据均......