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

news2024/9/19 10:35:15

昇腾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.coloradmin.cn/o/2095797.html

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

相关文章

封装_私有类字段和方法

前言 在 JavaScript 中&#xff0c;封装、私有类字段和方法是面向对象编程的一种重要特性。它们允许你将数据&#xff08;属性&#xff09;和对数据的操作&#xff08;方法&#xff09;组合在一起&#xff0c;并控制访问权限&#xff0c;从而提高代码的安全性和可维护性。私有…

异步编程详解

1.什么是async std::async:是一个函数模板,用于启动一个异步任务。它接受一个可调用的对象(如函数、Lambda表达式、函数对象)作为参数,并在一个单独的线程上异步执行对象。std::async自动管理异步任务的生命周期,并返回一个std::future对象,该对象用于获取异步操作的结果。 2.什…

【Java】—— Java面向对象进阶:继承小练习-Java中实现圆柱体类及其体积计算

目录 1. 定义圆类&#xff08;Circle&#xff09; 2. 定义圆柱体类&#xff08;Cylinder&#xff09; 3. 测试圆柱体类 4. 总结 在Java中&#xff0c;我们可以通过面向对象的方式来模拟现实世界中的物体&#xff0c;比如圆柱体。本篇文章将通过一个简单的示例来展示如何定义…

全国大学生数学建模竞赛系统使用手册

注意&#xff01;国赛是学校统一报名&#xff0c;所以如果在操作上有任何不清楚的地方&#xff0c;一定要在赛前即使询问自己学校组织数模的老师&#xff01;并详细阅读本文和官网通知&#xff0c;以及&#xff1a;数模国赛提交MD5码和论文的坑&#xff01; 数模比赛的建模手、…

【Python报错已解决】“ModuleNotFoundError: No module named ‘timm‘”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述1.1 报错示例&#xff1a;当我们尝试导入timm库时&#xff0c;可能会看到以下错误信息。…

颠覆传统:基于全文索引驱动下的高效一对多表结构设计!

首发公众号&#xff1a;赵侠客 引言 在数据库表结构设计中&#xff0c;一对多&#xff08;1:N&#xff09;关系的处理是非常常见需求&#xff0c;如一个用户有多个分类或角色。传统关系型数据库表设计方式通常要包括三张表&#xff1a;用户表、分类表、以及用户与分类之间的关…

LC开源电路的学习(一)

TI的升压芯片&#xff0c;电压虽然能升高&#xff0c;但是带来的问题就是最大电流大幅降低&#xff1a; CC1和CC2芯片接快充芯片之后&#xff0c;直接接到单片机的下载口&#xff1a; 这个有点意思&#xff0c;用导线换电阻&#xff1a; 、 PD快充芯片CH224K需要连接typeC的D…

华为云征文|基于Flexus云服务器X实例的应用场景-部署脚手架开源项目若依

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面**Flexus X实例**的云服务器简介环境准备若依项目拉取导入数据库启动本地项目&#xff08;后端&#xff09;启动本地项目&#xff08;前端&#xff09;打包后…

图片转为PDF怎么弄?看这里,三款软件助你一键转换!

嘿&#xff0c;朋友们&#xff01;现在信息这么多&#xff0c;图片在我们学习、工作、生活中帮了大忙。但有时候&#xff0c;我们想把图片整理好、分享给别人或者打印出来&#xff0c;PDF格式就特别合适。PDF文件不管在哪儿打开&#xff0c;内容都不会变样&#xff0c;还能加密…

Pandas 9-绘制柱状图

1. 准备数据 首先&#xff0c;需要准备一个DataFrame。 import pandas as pd # 创建一个DataFrame data { Name: [Alice, Bob, Charlie, David], Age: [24, 27, 22, 32], City: [New York, Los Angeles, Chicago, Houston], Score: [85, 92, 78, 88]} df pd.…

【生成模型系列(初级)】自编码器——深度学习的数据压缩与重构

【通俗理解】自编码器——深度学习的数据压缩与重构 第一节&#xff1a;自编码器的类比与核心概念 1.1 自编码器的类比 你可以把自编码器想象成一个“智能压缩机”&#xff0c;它能够把输入的数据&#xff08;比如图片&#xff09;压缩成一个更小的表示&#xff08;编码&#…

超声波模块

HCSR04超声波模块是一种常用的测距模块&#xff0c;它通过检测超声波发射后遇到障碍物所反射的回波&#xff0c;从而测量出与障碍物之间的距离。以下是对HCSR04超声波模块的详细讲解&#xff1a; 一、模块组成与工作原理 组成&#xff1a;HCSR04超声波模块主要由两个压电陶瓷超…

【我的Android进阶之旅】快来给你的Kotlin代码添加Markdown格式的注释吧!

文章目录 一、 传统 HTML 格式注释二、 Markdown 格式注释三.、Markdown格式注释详解3.1. 基础语法3.1.1 单行注释3.1.1 多行注释3.2 标题3.3 列表3.4 加粗和斜体3.5 代码块3.6 链接3.7 引用3.8 表格3.9. 图片3.10. 示例代码3.11. 注释模板的使用场景3.12 实例示例四、总结在 A…

2024年9月深圳200万~300万的三房笔记

​整理了2024年9月深圳200万~300万的三房笔记&#xff0c;数据可能有​出入。有些商品房数据是我看到工抵房的数据&#xff0c;群里说工抵房的房价数据需要乘以1.2就比较接近当前现场的价格​。对于我个人来说关注地铁&#xff0c;即是否方便打工还有价格​。看着一些商品房的工…

【华三】不懂链路聚合?看这篇就够了!华三配置详解

【华三】不懂链路聚合&#xff1f;看这篇就够了&#xff01;华三配置详解 背景链路聚合基本概念聚合组和聚合接口的类型二层聚合组/二层聚合接口三层聚合组/三层聚合接口聚合接口特性 聚合接口参考端口成员端口 操作Key成员端口的配置分类协议类配置-第一类配置属性配置-第二类…

Day 1 : 数据结构

引入 以张三为例&#xff1a;CEF不能同时举办。 数据的逻辑结构 数据结构是什么 研究计算机数据之间的关系 逻辑结构和存储结构及其操作 基本概念 数据 数据元素 逻辑结构 按前趋和后继数将逻辑结构分为&#xff1a;线性结构和非线性结构。 即&#xff1a;找前…

云首席产品规划专家的必修课

大家好&#xff0c;我是卢旗。 今天和大家探讨一下云计算规划专家的必备研究内容。 一、市场与客户需求分析&#xff1a; 1&#xff0c;市场调研&#xff1a;深入了解当前及未来云计算市场的趋势、竞争格局、客户需求变化等&#xff0c;识别出潜在的市场机会和威胁。 结合20…

C++ string类—容量、元素获取

一、Capacity size&#xff1a;string类对象中字符的个数为size&#xff1b;length&#xff1a;size作用一样&#xff0c;返回string对象中有效数据个数&#xff1b;capacity:一个string对象的容量capacity决定了这个对象能存储多少字符&#xff08;不包括\0&#xff09;&…

活动系统开发之采用设计模式与非设计模式的区别-需求整理

用户需求(活动系统)&#xff1a; 1、活动类型&#xff1a;答题、图片展示、签到、抽奖、组团等活动 2、活动介绍&#xff1a; a、答题活动&#xff1a; 第一种是签到后&#xff0c;随机抽取10道题&#xff0c;答对8到就可以抽奖&#xff1b; 第二种是随机抽取一道题&#xff0…

Python优化算法24——基于觅食生境选择的粒子群算法(FHSPSO)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…