【Ascend C算子开发(入门)】——Ascend C编程模式与范式

news2024/12/29 8:39:26

Ascend C编程模型与范式

1.并行计算架构抽象

Ascend C编程开发的算子是运行在AI Core上的,所以我们需要了解一下AI Core的结构。AI Core主要包括计算单元、存储单元、搬运单元。

  • 计算单元包括了三种计算资源:Scalar计算单元(执行标量计算);Cube计算单元(矩阵计算);Vector计算单元(向量运算)
  • 搬运单元主要负责在Global Memory 和Local Memory之间搬运数据
  • 包括内部存储(Local Memory)和外部存储(Global Memory)

数据在这些单元之间存储和计算,涉及到三种流:异步指令流、同步信号流、计算数据流。

  • 异步指令流:指计算单元和搬运单元之间异步执行接收到的指令序列。
  • 同步信号流:保证不同指令按照正确的逻辑关系执行
  • 计算数据流:指搬运单元把数据搬运到Local Memory,把处理好的数据搬运回Global Memory的过程。

AI Core的内部架构图如下:
image.png


2.SPMD编程模型介绍

SPMD(Single Program, Multiple Data)模型是一种并行编程模型,用于同时处理多个数据元素的相同程序。在Ascend C中,SPMD模型用于编写并行计算任务,以便充分利用Ascend AI处理器的并行计算能力。

SPMD模型的要点如下:

  • Single Program:SPMD模型意味着编写的程序是相同的,不会针对不同的数据元素而改变。这个程序会在不同的数据上执行,但代码本身是相同的。这有助于提高代码的可维护性和复用性。每个核上唯一区别是block_idx不同。

  • Multiple Data:程序会同时处理多个数据元素,这些数据元素通常存储在数组或张量中。每个数据元素都会被相同的程序逐一处理,从而实现并行性。


3.核函数编写及调用

Ascend C核函数是一种用于编写高性能并行计算任务的特定函数,是算子设备侧入口。

3.1核函数定义

8C18172DD5E2AA134AC39BB340E7592E.png

主要包括三个参数:函数类型限定符、核函数名、参数列表

1.使用__global__函数类型限定符来标识它是一个核函数,可以被<<<…>>>调用;使用__aicore__函数类型限定符来标识该核函数在设备端AI Core上执行。

2.指针入参变量需要增加变量类型限定符__gm__。表明该指针变量指向Global Memory上某处内存地址。

3.核函数使用内核调用符<<<…>>>这种语法形式,来规定核函数的执行配置:
kernel_name<<<blockDim, l2ctrl, stream>>>(argument list);
解释每个参数的意思:

  • blockDim:规定了核函数将会在几个核上执行
  • l2ctrl:暂时设置为固定值nullptr,开发者无需关注
  • stream:类型为aclrtStream

昨天做了一个关于Ascend C加法算法的算子开发实验,代码地址:Gitee代码仓库
在这个Add文件中,算子开发的核心代码在 add_custom.cpp中,其中核函数定义的代码为:
extern "C" __global__ __aicore__ void add_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z) { KernelAdd op; op.Init(x, y, z); op.Process(); }
这段代码使用__global__ __aicore__函数类型限定符表明这个核函数将在AI Core上执行
void add_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z):这是核函数的声明,接受三个GM_ADDR参数,分别命名为x、y和z。GM_ADDR是指向通用内存(GM,General Memory)的指针类型,表明这个核函数将操作通用内存中的数据。

KernelAdd op:初始化算子类,算子类提供算子初始化和核心处理等方法。
op.Init(x, y, z):初始化函数,获取该核函数需要处理的输入输出地址,同时完成必要的内存初始化工作

op.Process():核心处理函数,完成算子的数据搬运与计算等核心逻辑

定义完了核函数之后,就可以进行调用:
void add_custom_do(uint32_t blockDim, void* l2ctrl, void* stream, uint8_t* x, uint8_t* y, uint8_t* z) { add_custom<<<blockDim, l2ctrl, stream>>>(x, y, z); }

<<<blockDim, l2ctrl, stream>>>:这是CUDA执行配置,它指定了核函数 add_custom 的执行方式。blockDim 表示使用多少个CUDA线程块,l2ctrl 和 stream 表示与线程块配置和流相关的信息。这些参数通常用于控制CUDA核函数的执行方式和资源配置。

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

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

相关文章

登上抖音同城热搜榜:如何让你的短视频成为焦点?

登上抖音同城热搜榜的首要前提是紧跟潮流&#xff0c;捕捉热点。热点通常具有时效性、话题性和关注度&#xff0c;能够迅速吸引人们的注意力。要想捕捉热点&#xff0c;你需要关注新闻、社交媒体和抖音热门话题&#xff0c;时刻关注大众关心的问题。例如&#xff0c;近期热门的…

rabbitMQ(3)

RabbitMq 交换机 文章目录 1. 交换机的介绍2. 交换机的类型3. 临时队列4. 绑定 (bindings)5. 扇形交换机&#xff08;Fanout &#xff09; 演示6. 直接交换机 Direct exchange6.1 多重绑定6.2 direct 代码案例 7. 主题交换机7.1 Topic 匹配案例7.2 Topic 代码案例 8. headers 头…

【力扣每日一题】2023.10.22 做菜顺序

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个数组表示每个菜的满意度&#xff0c;我们可以指定做哪些菜以及做的顺序&#xff0c;需要我们凑到一个系数的最大值&#xff0c…

第三章 内存管理 十五、内存映射文件

目录 一、传统的文件访问方式 二、内存映射文件 1、方便文件的访问 2、实现文件数据的共享 三、总结 一、传统的文件访问方式 二、内存映射文件 1、方便文件的访问 2、实现文件数据的共享 三、总结

教你注册chrome开发者账号,并发布chrome浏览器插件。

本篇文章主要讲解&#xff0c;注册chrome开发者账号&#xff0c;及发布chrome浏览器插件的流程。包含插件的打包和上传。 日期&#xff1a;2023年10月22日 作者&#xff1a;任聪聪 一、前提准备&#xff1a;注册chrome开发者账号 说明&#xff1a;注册需要5美元&#xff0c;一…

Qt界面容器:Widget、 Frame、分组框、滚动区、工具箱、选项卡小部件、堆叠小部件控件精讲

​Qt 界面设计容器简介 Qt中常用的容器控件, 包括: Widget, Frame, Group Box, Scroll Area, Tool Box, Tab Widget, Stacked Widget。 QWidget 这个类是所有窗口类的父类, 可以作为独立窗口使用, 也可以内嵌到其它窗口中使用。 头文件: #include <QWidget> qmake: QT…

按键控制LED灯亮灭

按键原理图&#xff1a;按键选用PE4 创建两个文件一个.c文件一个.h文件来写按键的代码 .c文件 #include "Key.h"void Key_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode GPIO_M…

python astra相机驱动问题

报错问题&#xff1a; openni.utils.OpenNIError: (OniStatus.ONI_STATUS_ERROR, bDeviceOpen using default: no devices found, None) 解决办法&#xff1a; 1、从sdk中拷贝文件 2、修改openni源码 3、执行测试程序 from openni import openni2 import numpy as np impor…

基于驾驶训练优化的BP神经网络(分类应用) - 附代码

基于驾驶训练优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于驾驶训练优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.驾驶训练优化BP神经网络3.1 BP神经网络参数设置3.2 驾驶训练算法应用 4.测试结果…

【C/C++笔试练习】初始化列表、构造函数、析构函数、两种排序方法、求最小公倍数

文章目录 C/C笔试练习1. 初始化列表&#xff08;1&#xff09;只能在列表初始化的变量 2.构造函数&#xff08;2&#xff09;函数体赋值&#xff08;3&#xff09;构造函数的概念&#xff08;4&#xff09;构造函数调用次数&#xff08;5&#xff09;构造函数调用次数&#xff…

自然语言处理---RNN经典案例之使用seq2seq实现英译法

1 seq2seq介绍 1.1 seq2seq模型架构 seq2seq模型架构分析&#xff1a; seq2seq模型架构&#xff0c;包括两部分分别是encoder(编码器)和decoder(解码器)&#xff0c;编码器和解码器的内部实现都使用了GRU模型&#xff0c;这里它要完成的是一个中文到英文的翻译&#xff1a;欢迎…

数据库MongoDB

MongoDB记录是一个文档&#xff0c;由一个字段和值对组成的数据结构&#xff0c;文档类似于JSON对象。 一个文档认为就是一个对象&#xff0c;字段的数据类型是字符型&#xff0c;值除了使用基本类型外&#xff0c;还可以包括其他文档&#xff0c;普通数组和文档数组。 一、…

Python —— UI自动化之使用JavaScript进行元素点亮、修改、点击元素

1、JavaScript点亮元素 在控制台通过JavaScript语言中对元素点亮效果如下&#xff1a; 将这个语句和UI自动化结合&#xff0c;代码如下&#xff1a; locator (By.ID,"kw") # 是元组类型 web_element WebDriverWait(driver,5,0.5).until(EC.visibility_of_eleme…

Windows安装virtualenv虚拟环境

需要先安装好python环境 1 创建虚拟环境目录 还是在D:\Program\ 的文件夹新建 .env 目录&#xff08;你也可以不叫这个名字&#xff0c;一般命名为 .env 或者 .virtualenv &#xff0c;你也可以在其他目录中创建&#xff09; 2 配置虚拟环境目录的环境变量 3 安装虚拟环境 进…

网络原理之UDP协议

文章目录 前言应用层协议常见的几种数据格式1. xml2. JSON3. protobuffer 端口号传输层UDP 报文协议格式源端口号和目的端口号UDP 长度校验和 前言 前面我们学习了如何使用 UDP 数据报 和 TCP 流实现网络编程一个回显服务器&#xff0c;在知道了 UDP 和 TCP 协议的基本原理之后…

Arduino驱动BMA220三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 BMA220的三轴加速度计是一款具有I2C接口的超小型三轴低g加速度传感器断路器,面向低功耗消费市场应用。它可以测量3个垂直轴的加速度,从而在手机、手持设备、计算机外围设备、人机界面、虚拟现实功能和游戏控制器中感知倾斜、…

MYSQL第五章节有关约束操作详解(附代码,例题详解)这一篇就够了

c知识点合集已经完成欢迎前往主页查看&#xff0c;点点赞点点关注不迷路哦 点我进入c第一章知识点合集 MYSQL第一章节DDL数据定义语言的操作----点我进入 MYSQL第二章节DDL-数据库操作语言 DQL-数据查询语言----点我进入 MYSQL第三章节DCL-管理用户&#xff0c;控制权限----点我…

【Lua语法】字符串

Lua语言中的字符串是不可变值。不能像在C语言中那样直接改变某个字符串中的某个字符&#xff0c;但是可以通过创建一个新字符串的方式来达到修改的目的 print(add2(1 , 2 ,15,3))a "no one"b string.gsub(a , "no" , "on1111")print(a) print…

英语——名言篇——成语

爱屋及乌 Love me, love my dog.百闻不如一见 (眼见为实 ) Seeing is believing.比上不足比下有余 worse off than some, better off than many; to fall short of the best, but be better than the worst.笨鸟先飞 A slow sparrow should make an early start.不眠之夜 white…

VSCode C/C++ 分目录+多文件编译配置2

前言&#xff1a;介绍 task.json 和 launch.json 文件 task.json 和 launch.json 是用于配置 VS Code 编辑器中的任务 和 调试功能的两个重要文件。 task.json 文件用于配置任务&#xff0c;它定义了执行特定操作的任务&#xff0c;并提供了相应的命令和参数。以下是 task.js…