昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

flyfish

从一段代码的解释开始

template <typename T>
class GlobalTensor {
public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑}
};

语法的说明,主要用于理解上面的代码,非内部实现
template <typename T>:
这是模板声明。它告诉编译器接下来定义的类或函数是一个模板,T 是一个类型参数。typename 是一个关键字,表示 T 是一种类型。

class GlobalTensor:
这是定义模板类 GlobalTensor,GlobalTensor 是一个通用类,其内部数据类型由模板参数 T 指定。

通过模板,GlobalTensor 类可以处理不同类型的数据,而无需为每种数据类型编写单独的类。例如,可以创建 GlobalTensor<int> 来处理整数类型的全局数据,或者创建 GlobalTensor<float> 来处理浮点数类型的全局数据。

#include <iostream>// 定义模板类 GlobalTensor
template <typename T>
class GlobalTensor {
public:// 设置全局缓冲区的方法void setGlobalBuffer(T* buffer, uint32_t buffersize) {this->buffer = buffer;this->buffersize = buffersize;}// 打印缓冲区中的内容void printBuffer() const {for (uint32_t i = 0; i < buffersize; ++i) {std::cout << buffer[i] << " ";}std::cout << std::endl;}private:T* buffer;         // 指向缓冲区的指针uint32_t buffersize; // 缓冲区的大小,元素的个数
};int main() {// 创建一个int类型的缓冲区int intBuffer[] = {1, 2, 3, 4, 5};uint32_t intBufferSize = 5;//sizeof(intBuffer) / sizeof(intBuffer[0]);std::cout << sizeof(intBuffer)<<":" <<sizeof(intBuffer[0]) <<std::endl;// 创建一个GlobalTensor<int>实例GlobalTensor<int> intTensor;intTensor.setGlobalBuffer(intBuffer, intBufferSize);std::cout << "Integer buffer: ";intTensor.printBuffer();// 创建一个float类型的缓冲区float floatBuffer[] = {1.1f, 2.2f, 3.3f, 4.4f, 5.5f};uint32_t floatBufferSize = 5;//sizeof(floatBuffer) / sizeof(floatBuffer[0]);// 创建一个GlobalTensor<float>实例GlobalTensor<float> floatTensor;floatTensor.setGlobalBuffer(floatBuffer, floatBufferSize);std::cout << "Float buffer: ";floatTensor.printBuffer();return 0;
}

输出

20:4
Integer buffer: 1 2 3 4 5
Float buffer: 1.1 2.2 3.3 4.4 5.5

语法解释
sizeof(intBuffer) / sizeof(intBuffer[0]) 和 sizeof(floatBuffer) / sizeof(floatBuffer[0]) 这两个表达式确实表示的是缓冲区(数组)中元素的个数。

sizeof(intBuffer):

计算整个 intBuffer 数组的总大小(以字节为单位)。
假设 intBuffer 是一个包含 5 个 int 元素的数组,每个 int 占用 4 个字节,那么 sizeof(intBuffer) 就是 5 * 4 = 20 字节。

sizeof(intBuffer[0]):

计算数组中第一个元素的大小,也就是 int 类型的大小(在大多数系统中是 4 字节)。

sizeof(intBuffer) / sizeof(intBuffer[0]):

用数组的总大小除以单个元素的大小,得到数组中元素的个数。
对于上述例子,计算过程为 20 / 4 = 5,所以这个表达式的结果就是 5,也就是数组中的元素个数。

昇腾 AI Core 架构

在这里插入图片描述
不同于传统的支持通用计算的CPU和GPU,也不同于专用于某种特定算法的专用芯片ASIC(Application Specific Integrated Circuit),AI Core架构本质上是为了适应某个特定领域中的常见应用和算法,通常称为“特定域架构”(Domain Specific Architecture,DSA)。因为不一样所有就起了新的名字 达芬奇。

Al Core内部并行计算架构抽象

使用Ascend C编程语言开发的算子运行在AICore上,AI Core是昇腾AI处理器中的计算核心一个AI处理器内部有多个AICore,AICore中包含计算单元、存储单元、搬运单元等核心组件
在这里插入图片描述

昇腾AI处理器的计算核心主要由AI Core构成,从控制上可以看成是一个相对简化的现代微处理器的基本架构。它包括了三种基础计算资源:。这三种计算单元各司其职,形成了三条独立的执行流水线,在系统软件的统一调度下互相配合达到优化的计算效率。此外在矩阵计算单元和向量计算单元内部还提供了不同精度、不同类型的计算模式。

AI Core内部核心组件

在这里插入图片描述

  1. 计算单元
    AI Core包括了三种基础计算资源:Cube计算单元、Vector计算单元和Scalar计算单元(矩阵计算单元(Cube Unit)、向量计算单元(Vector Unit)和标量计算单元(Scalar Unit))

  2. 存储单元
    存储单元包括内部存储和外部存储:
    AI Core中存在内部存储,AI Core需要把外部存储(通常包括L2、HBM、DDR等)中的数据加载到内部存储中,才能完成相应的计算。AI Core的主要内部存储包括:L1 Buffer(L1缓冲区),L0 Buffer(L0缓冲区),Unified Buffer(统一缓冲区)和Scalar Buffer(标量缓冲区)。

  3. 搬运单元
    DMA(Direct Memory Access)搬运单元:负责在Global Memory和Local Memory之间搬运数据。
    为了配合AI Core中的数据传输和搬运,AI Core中还包含BIU(Bus Interface Unit,总线接口单元),MTE1(Memory Transfer Engine,存储转换引擎),MTE2,MTE3。其中BIU为AI Core与总线交互的接口;MTE为数据搬运单元,完成不同Buffer之间的数据搬运。
    不同类型的昇腾AI处理器,存储单元大小不同,用户可通过get_soc_spec接口获取。

Global Memory

AI Core能够访问的外部存储称之为Global Memory,对应的数据类型为GlobalTensor。

在这里插入图片描述

Local Memory

AI Core的内部存储,统称为Local Memory,对应的数据类型为LocalTensor。由于不同芯片间硬件资源不固定,可以为UB、L1、L0A、L0B等。
在这里插入图片描述

SIMD与SPMD

在这里插入图片描述
Ascend C算子编程是SPMD(Single-Program Multiple-Data)编程
SPMD并行计算示意图在这里插入图片描述

核内(Intra-Core):指的是单个处理核心内部的执行。例如,SIMD 是在一个处理核心内执行的,即核内的并行操作。多个数据元素通过一个核心的 SIMD 单元同时处理。

核间(Inter-Core):指的是多个处理核心之间的协作。SPMD 通常涉及核间的并行处理,即多个核心同时运行相同的程序代码,但处理不同的数据集。

具体关系
SIMD 核内操作:SIMD 是一个核内的并行机制。它利用处理器内的硬件资源来执行单条指令在多个数据上的操作,通常在一个核心内部通过向量处理单元来实现。SIMD 不涉及多个核心之间的协作,而是关注如何在单个核心内高效利用并行性。

SPMD 核间协作:SPMD 则更多涉及核间的协作。多个核心(或多个线程)同时运行相同的程序,但各自操作不同的数据。每个核心运行的程序可以是独立的,程序中的不同实例可能根据处理的数据不同而采取不同的执行路径。这意味着多个核心之间协作来完成更大规模的并行计算任务。

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

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

相关文章

fl studio 21/24破解版(水果音乐制作软件24) v24.1.1.4285附安装教程

fl studio 21/24破解版&#xff0c;又被国内网友称之为水果音乐制作软件24&#xff0c;是Image-Line公司成立26周年而发布的一个版本&#xff0c;是目前互联网上最优秀的完整的软件音乐制作环境或数字音频工作站&#xff0c;包含了编排&#xff0c;录制&#xff0c;编辑&#x…

在Ubuntu 20.04上安装MySQL的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 MySQL 是一个开源的数据库管理系统&#xff0c;通常作为流行的 LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xf…

Cmake之1.0版本重要特性及用法实例(八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

GoodSync Business - 企业级服务器同步与备份工具

现在越来越多公司会搭建服务器&#xff0c;或自建文件共享中心。那么如何才能实现对这些终端的高效管理、安全备份&#xff0c;以保障企业数据的安全呢&#xff1f; GoodSync Business 就是一款企业服务器同步与备份工具&#xff0c;适用于 Win / Mac 工作站&#xff0c;以及 …

Kafka【二】关于消费者组(Consumer Group)、分区(partition)和副本(replica)的理解

【1】概述 Apache Kafka 是一个分布式流处理平台&#xff0c;它允许你发布和订阅记录流&#xff0c;存储记录流&#xff0c;并且可以对这些记录流进行处理。在 Kafka 中&#xff0c;消息被发布到特定的主题&#xff08;topic&#xff09;&#xff0c;然后由消费者&#xff08;…

57-java csrf防御方案

CSRF&#xff08;跨站请求伪造&#xff09;是一种攻击手段&#xff0c;它迫使已登录用户的web应用在没有用户知情的情况下&#xff0c;发送未经授权的请求。在Java中&#xff0c;有多种方法可以用来防御CSRF攻击。 使用同步令牌&#xff08;Token&#xff09;&#xff1a; 同…

Datawhale X 李宏毅苹果书 AI夏令营 Task2打卡

线性模型&#xff08;Linear model&#xff09; 通常模型的修改来自于对问题的理解&#xff0c;即领域知识 基本定义&#xff1a;把输入特征x乘上一个权重&#xff0c;再加上一个偏置就可以得到预测的结果。 优点&#xff1a;简单易理解&#xff0c;可理解性好&#xff08;权重…

C++可调用对象

C11中有一个重要的概念&#xff0c;叫可调用对象&#xff0c; 可调用对象用途广泛&#xff0c;比如作为线程的执行对象&#xff0c;或者在使用一些基于范围的模版函数时&#xff08; sort()、all_of()、find_if()&#xff09;&#xff0c;常常需要我们传入一个可调用对象&…

算法基础-位运算

>> &#xff08;右移运算&#xff09; x >> y&#xff1a;表示将x的二进制值右移y位。 正数是直接右移y位&#xff0c;则高位&#xff08;最左边&#xff09;补y个0。 负数是求补码&#xff0c;然后右移y位&#xff0c;最高位补y个1&#xff0c;再求反码&#xff…

Gamma基线估算

在使用Gamma软件处理DInSAR数据时&#xff0c;基线估算是一个非常关键的步骤。Gamma软件提供了一系列工具来计算和处理基线信息&#xff0c;以确保干涉图像的准确性和后续形变分析的精度。以下是Gamma软件中基线估算的详细步骤&#xff1a; 1. 初始化基线计算 (base_init) 首…

更适合编写股票盯盘软件或者量化交易平台的语言是Python还是C

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…

集成电路学习:什么是DAC数模转换器

DAC&#xff1a;数模转换器 DAC&#xff0c;全称Digital-to-Analog Converter&#xff0c;即数模转换器&#xff0c;是一种电子设备或电路&#xff0c;用于将数字信号转换为相应的模拟信号。在现代电子系统中&#xff0c;DAC扮演着至关重要的角色&#xff0c;它实现了数字电路与…

如何在UE5.4中重新定位动画?

动画在游戏和电影制作中扮演着至关重要的角色&#xff0c;而在虚幻引擎5.4&#xff08;UE5.4&#xff09;这一强大的实时3D创作平台中&#xff0c;重新定位动画的能力更是将创意表达推向了新的高度。本文将引导您探索UE5.4中重新定位动画的技巧&#xff0c;确保您的动画作品不仅…

Unity | 基础知识

装箱和拆箱&#xff1a; 获取对方的类型&#xff1a; GetType通过打点调用 as进行类型转换 运用Convert进行类型转换&#xff1a; 二维数组的定义 结构体类型 不同名称空间来调用&#xff1a;

Auto-Unit-Test-Case-Generator -- java项目自动测试生成

0.Pre-预备知识&#xff1a; 0.1.Maven是什么&#xff1f; [by Maven是什么&#xff1f;有什么作用&#xff1f;Maven的核心内容简述_maven是干什么用-CSDN博客 ] 是Java 领域中最流行的自动化构建工具之一&#xff0c;Maven 作为 Java 项目管理工具&#xff0c;具有: 包管…

互联网全景消息(1)之RabbitMq基础入门

一、消息中间件 1.1消息队列回顾 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实 现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ &a…

数据库mysql8.x中修改密码的方法

mysql数据库最新版本9.x都出来了&#xff0c;再不学就要被淘汰了&#xff01;&#xff01;这次使用的是8.0.39版本&#xff0c;大家可以去官网下载使用。 官网地址:https://dev.mysql.com/downloads/mysql/ 安装好后&#xff0c;默认密码是一串很难记忆的字符&#xff0c;记录…

day-46 旋转图像

思路 不能使用辅助数组&#xff0c;所以关键在于弄清楚旋转后坐标的变化规律。当矩阵的大小n为偶数时&#xff0c;以n/2行和n/2列的元素为起点&#xff0c;当矩阵的大小n为奇数时&#xff0c;以n/2行和&#xff08;n1&#xff09;/2列的元素为起点 解题过程 关键&#xff1a;旋…

【JavaWeb】Cookie、Session

文章目录 Cookie、Session一、Cookie&#xff08;客户端&#xff09;1、Cookie 的 特点2、Cookie 的 工作原理3、Cookie 的 基本操作5、Cookie 的 域名与路径6、Cookie 的 存活时间7、Cookie 的 删除 二、Session&#xff08;服务端&#xff09;1、Session 的 特点2、Session 的…

Python进阶————面向对象高级

面向对象高级 前言一、继承1.1. 单继承1.2. 多继承1.3. 方法重写1.4. 子类调用父类方法1.4.1 父类名.父类方法名()1.4.2 super().父类方法名() 1.5. 多层继承 二、封装2.1. 私有属性2.2. 私有方法 三、多态3.1. 多态的条件3.2. 多态的定义 四、面向对象的其他特性4.1. 对象属性…