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

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值