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

news2024/11/26 16:25:51

1.TIK C++介绍

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

使用TIK C++开发自定义算子的优势:
(1)C/C++原语编程
(2)编程模型屏蔽硬件差异,编程范式提高开发效率
(3)多层级API封装,从简单到灵活,兼顾易用与高效
(4)孪生调试,CPU侧模拟NPU侧的行为,可先在CPU侧调试

2.核函数

核函数(Kernel Function)是TIK C++算子设备侧的入口。TIK C++允许用户使用核函数这种C/C++函数的语法扩展来管理设备侧的运行代码,用户在核函数中实现算子逻辑的编写,例如自定义算子类及其成员函数以实现该算子的所有功能。核函数是主机侧和设备侧连接的桥梁
image.png
核函数是直接在设备侧执行的代码。在核函数中,需要为在一个核上执行的代码规定要进行的数据访问和计算操作,当核函数被调用时,多个核将并行执行同一个计算任务

2.1编写核函数

(1)使用函数类型限定符
除了需要按照C/C++函数声明的方式定义核函数之外,还要为核函数加上额外的函数类型限定符,包含__global__和__aicore__
使用__global__函数类型限定符来标识它是一个核函数,可以被<<<…>>>调用;使用__aicore__函数类型限定符来标识该核函数在设备侧AI Core上执行:
__global__ __aicore__ void kernel_name(argument list);
(2)使用变量类型限定符
为了方便:指针入参变量统一的类型定义为__gm__ uint8_t*
用户可统一使用uint8_t类型的指针,并在使用时转化为实际的指针类型;亦可直接传入实际的指针类型

其他规则
必须具有void返回类型
使用extern “C”
仅支持入参为指针类型或C/C++内置数据类型(Primitive Data Types),如:half* s0、float* s1、int32_t c

核函数的调用语句是C/C++函数调用语句的一种扩展
常见的C/C++函数调用方式是如下的形式:
function_name(argument list);
核函数使用内核调用符<<<…>>>这种语法形式,来规定核函数的执行配置:
kernel_name<<<blockDim, l2ctrl, stream>>>(argument list);
blockDim,规定了核函数将会在几个核上执行,每个执行该核函数的核会被分配一个逻辑ID,表现为内置变量block_idx,编号从0开始,可为不同的逻辑核定义不同的行为,可以在算子实现中使用
l2ctrl,保留参数,暂时设置为固定值nullptr
stream,类型为aclrtStream,stream是一个任务队列,应用程序通过stream来管理任务的并行

3.接口介绍

常用数据定义:GlobalTensor
GlobalTensor用来存放Global Memory(外部存储)的全局数据
定义原型
template <typename T> class GlobalTensor { // 传入全局数据的指针,并手动设置一个buffer size,初始化GlobalTensor void SetGlobalBuffer(__gm__ T* buffer, uint32_t bufferSize);

LocalTensor
LocalTensor用于存放核上Local Memory(内部存储)的数据
定义原型
template <typename T> class LocalTensor { T GetValue(const uint32_t offset) const; // 获取 LocalTensor 中的某个值,返回 T 类型的立即数。 template <typename T1> void SetValue(const uint32_t offset, const T1 value) const; // 设置 LocalTensor 中的某个值。offset单位为element // 获取距原LocalTensor起始地址偏移量为offset的新LocalTensor,注意offset不能超过原有LocalTensor的size大小。offset单位为element LocalTensor operator[](const uint32_t offset) const; uint32_t GetSize() const; // 获取当前LocalTensor size大小

矢量计算指令接口
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何编写代码审查文档

一、前言 代码审查(Code Review)是开发流程中非常重要的一个环节&#xff0c;可以帮助发现并改正代码中的错误&#xff0c;提高代码质量&#xff0c;也是共享知识、熟悉代码的好机会。 最近功能开发完毕需要做代码审查&#xff0c;发现国内很多公司不强制要求编写代码审查文档…

【Linux内网穿透】】Linux本地搭建GitLab服务器 - 内网穿透远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自cpolar极点云文章&#xff1a;Linux搭建GitLab私有仓库&#xff0c;并内网穿透实…

chatgpt赋能python:Python的就业前景——解析云计算与Python的结合

Python的就业前景——解析云计算与Python的结合 Python是一种高级编程语言&#xff0c;具有高度的可读性和简洁性&#xff0c;并已成为Web和大数据的主流语言之一。Python广泛应用于数据科学&#xff0c;机器学习&#xff0c;Web开发&#xff0c;游戏开发和金融等领域&#xf…

Linux_epoll

Linux_epoll 思考:高效的餐厅服务如何实现?Epoll - Reactor 设计模式Epoll 与 Reactor 设计模式的关系Reactor优点Epoll - IO多路复用的用法web_server示例代码水平触发和边缘触发思考:高效的餐厅服务如何实现? 一个顾客来就餐,一个服务员在顾客点菜期间全程陪同服务! 一个…

并发编程总结

synchronized synchronized有如下3种使用方式 普通同步方法&#xff0c;锁是当前实例对象 静态同步方法&#xff0c;锁是当前类的class对象 同步方法块&#xff0c;锁是括号里面的对象 当一个线程访问同步代码块时&#xff0c;需要获得锁才能执行&#xff0c;当退出或者抛…

chatgpt赋能python:Python修改BIOS:一篇专业的SEO文章

Python修改BIOS&#xff1a;一篇专业的SEO文章 介绍 BIOS&#xff08;Basic Input/Output System&#xff09;是计算机中的核心程序&#xff0c;它负责启动电脑并管理硬件。一旦发现硬件问题&#xff0c;BIOS会通知用户或操作系统。它还可以设置系统的参数&#xff0c;例如时…

Node.js安装教程(npm搭建) - Window

择心】向大家介绍安装Node.js ( npm搭建 ) 一、安装流程 进入Node.js 去下载一个安装包。 双击下载好的应用程序,弹出安装界面并点击Next&#xff0c; 接受协议&#xff0c;点击Next&#xff0c; 更改默认安装路径&#xff0c;点击Next&#xff0c; 会默认添加到Path环境…

【每周一书】--(认知觉醒)思考:如何用清爽的情绪面对内卷的当下?

【每周一书】--&#xff08;认知觉醒&#xff09;思考&#xff1a;如何用清爽的情绪面对内卷的当下&#xff1f; 认知觉醒&#xff1a;开启自我改变的原动力焦虑&#xff1a;焦虑的根源完成焦虑定位焦虑选择焦虑环境焦虑难度焦虑 如何拥有清爽的情绪&#xff0c;释放焦虑情绪 认…

记录使用Pytorch分布式训练(torch.distributed)踩过的坑

引言 最近由于想加速神经网络模型训练&#xff0c;便开始着手学习pytorch的分布式训练&#xff08;DDP&#xff09;&#xff0c;结果踩了很多坑&#xff0c;在这里记录一下&#xff0c;便于以后查看&#xff0c;也同时分享给大家。 教程 我是通过下面几篇博客学习pytorch分布…

JVM类加载器及其详解

1.JVM加载过程分析 1.1加载流程图 1.2双亲委派机制 引导类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的核心类库&#xff0c;比如rt.jar、charsets.jar等扩展类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包应用程序…

chatgpt赋能python:Python倒序的实现方法介绍

Python倒序的实现方法介绍 Python是一种高级编程语言&#xff0c;被广泛用于数据处理、人工智能、Web开发等领域。其中&#xff0c;倒序是常见的一种操作需求。Python提供了多种实现倒序的方法&#xff0c;下面进行详细介绍。 1. 切片 切片是Python中常用的语法&#xff0c;…

chatgpt赋能python:Python倒序循环–优化你的编程效率

Python倒序循环 – 优化你的编程效率 在Python编程中&#xff0c;倒序循环是一种非常强大的操作。它可以用于遍历一个序列并对其中的元素进行逆序处理&#xff0c;从而提高编程效率。本文将介绍Python倒序循环的优势及如何在编程中使用。 什么是Python倒序循环 在传统循环中…

Web应用技术(第十五周/END)

本次练习基于how2j和课本&#xff0c;进行SSM的初步整合&#xff0c;理解SSM整合的原理、好处。 SSM整合应用 1.简单的实例项目&#xff1a;2.原理分析&#xff1a;3.浅谈使用SSM框架化&#xff1a; 1.简单的实例项目&#xff1a; how2j 2.原理分析&#xff1a; 具体见流程图…

MySQL-1-基础

MySQL 简介 mysql-server #提供服务 mysql-client #提供SQL命令 官网地址&#xff1a;https://dev.mysql.com/downloads/ https://downloads.mysql.com/archives/community/查看帮助文档 mysql> ? contents一、安装MySQL 1.1、二进制安装mysql5.7-linux 安装前准备 sh…

SpringBoot 的创建和使用

Spring Boot 的优点 Spring的出现是为了简化 Java 程序开发,而 SpringBoot 的出现是为了简化 Spring 程序开发. SpringBoot 就是 Spring脚手架 快速集成框架&#xff0c;Spring Boot提供了启动添加依赖的功能&#xff0c;用于秒级集成各种框架。内置运行容器&#xff0c;无需配…

python+vue大学新生入学报道交流平台pycharm

本系统的用户可分学生、教师、管理员三类。 管理员模块 1)登录&#xff1a;管理员输入用户名、密码&#xff1b;选择“管理员”角色&#xff1b;点击登录按钮。 2)管理员主界面&#xff1a;以管理员身份登录成功后&#xff0c;选择进入网站系统管理模块&#xff1b;选择进入首页…

Python字符串类型的使用

文章目录 Python中的字符串类型一、字符串的常用操作二、字符串的常用函数 Python中的字符串类型 注意&#xff1a;字符串为不可修改类型 python中没有单独的字符类型&#xff0c;字符就是长度为1的字符串。 通常创建字符串的方式&#xff1a;一般用单引号&#xff08;’ &am…

从数据库到固态硬盘的读取过程

应用程序到数据库到操作系统到固态硬盘 在我研究了从应用程序发送的简单 SQL 查询是如何最终存储到磁盘的过程中&#xff0c;我发现术语 “页&#xff08;page&#xff09;” 和 “块&#xff08;block&#xff09;” 可能是软件工程中最多用的概念之一。有数据库页&#xff08…

Python新技术和趋势:如何应对Python生态的变化和发展趋势

第一章&#xff1a;引言 Python作为一门简洁、优雅且易于学习的编程语言&#xff0c;一直以来都备受开发者的喜爱。它拥有强大的生态系统和活跃的社区&#xff0c;使得Python在各个领域都有广泛的应用。然而&#xff0c;随着时间的推移&#xff0c;Python生态系统也在不断演变…

STM32H743烧录后无法识别Jlink的问题

利用Cubemx生成H743的代码&#xff0c;点击烧录后&#xff0c;无法再识别到Jlink了&#xff0c;只能烧录时按着复位再松开&#xff08;类似51单片机&#xff09;。 烧录后不运行&#xff0c;用keil进行debug&#xff0c;调试发下芯片进去内存管理错误中断。 经过不断调试发现&…