Ascend C的编程模型

简介: Ascend C采用SPMD编程模型,实现多核并行计算。通过将数据切分为多个分片,分配给不同的计算核心(或称为block)并行处理,每个核心根据自身的block_idx执行相同代码但处理不同的数据分片,从而提高计算效率。此模型支持高效的数据并行处理,适用于大规模数据计算任务。

1 并发执行

Ascend C和cudnn相似,都是一种多核心编程的范式。想要了解Ascend C,必须得先掌握这种“多核”是怎么实现得。

多核执行,说白了就是使用CPU/GPU/Ascend的物理多核并发去执行一段流程,一般情况下,可以通过以下几种方式实现:

  1. 多线程并行处理:使用多线程可以将循环中的任务分配给多个线程同时执行,提高代码的执行效率。可以使用线程池来管理线程的创建和销毁,避免频繁创建和销毁线程的开销。
  2. 多进程并行处理:使用多进程可以将循环中的任务分配给多个进程同时执行,充分利用多核处理器的优势。可以使用multiprocessing模块来创建和管理多个进程,并通过进程间通信来实现数据的共享和同步。
  3. 向量化操作:对于一些数值计算密集型的任务,可以使用向量化操作来提高代码的执行效率。向量化操作利用了现代处理器的SIMD(Single Instruction, Multiple Data)指令集,可以同时对多个数据进行相同的操作,减少了循环的开销。在Python中,可以使用NumPy库来进行向量化操作。
  4. 并行计算框架:使用并行计算框架可以将循环中的任务分布到多个计算节点上并行执行,提高代码的执行速度。常见的并行计算框架包括Apache Hadoop、Apache Spark等。这些框架提供了分布式计算的能力,可以将任务分布到多台计算机上进行并行计算。
  5. 编译器指令OpenMP:是一种支持多平台共享内存并行编程的API,它提供了一组编译器指令和库函数,使得开发人员能够方便地将现有代码并行化,以利用多个核心或处理器进行并行执行。OpenMP支持多种编程语言和操作系统,具有易用性、可移植性和灵活性等特点。通过使用OpenMP的并行化指令,如#pragma omp parallel和#pragma omp for,可以轻松地将代码块或循环并行化,并可以通过设置线程数量来控制并行执行的程度。OpenMP还提供了特定的编译器指令来处理并发任务和循环并行化。例如,#pragma omp parallel用于创建一组线程来并行执行指定的代码块,而#pragma omp for用于并行化循环。这些指令允许开发人员精细控制并行化的程度,包括设置线程数量和使用特定的子句来指定条件并行、数据处理等。

2 Ascend C编程模型

Ascend C算子编程是SPMD(Single-Program Multiple-Data)编程。假设,从输入数据到输出数据需要经过3个阶段任务的处理(T1、T2、T3)。如下图所示,SPMD会启动一组进程,并行处理待处理的数据。对待处理数据切分,把切分后数据分片分发给不同进程处理,每个进程对自己的数据分片进行3个任务的处理。
image.png

具体到Ascend C编程模型中的应用,是将需要处理的数据被拆分并同时在多个计算核心(类比于上文介绍中的多个进程)上运行,从而获取更高的性能。多个AI Core共享相同的指令代码,每个核上的运行实例唯一的区别是block_idx不同,每个核通过不同的block_idx来识别自己的身份。block的概念类似于上文中进程的概念,block_idx就是标识进程唯一性的进程ID。并行计算过程的示意图如下图所示。
image.png

下面的代码片段取自于Ascend CAdd算子的实现代码,算子被调用时,所有的计算核心都执行相同的实现代码,入口函数的入参也是相同的。每个核上处理的数据地址需要在起始地址上增加GetBlockIdx()*BLOCK_LENGTH(每个block处理的数据长度)的偏移来获取。这样也就实现了多核并行计算的数据切分。

class KernelAdd {
   
public:
    __aicore__ inline KernelAdd() {
   }
    __aicore__ inline void Init(GM_ADDR x, GM_ADDR y, GM_ADDR z)
    {
   
        // get start index for current core, core parallel
        xGm.SetGlobalBuffer((__gm__ half*)x + BLOCK_LENGTH * GetBlockIdx(), BLOCK_LENGTH);
        yGm.SetGlobalBuffer((__gm__ half*)y + BLOCK_LENGTH * GetBlockIdx(), BLOCK_LENGTH);
        zGm.SetGlobalBuffer((__gm__ half*)z + BLOCK_LENGTH * GetBlockIdx(), BLOCK_LENGTH);
        // pipe alloc memory to queue, the unit is Bytes
        pipe.InitBuffer(inQueueX, BUFFER_NUM, TILE_LENGTH * sizeof(half));
        pipe.InitBuffer(inQueueY, BUFFER_NUM, TILE_LENGTH * sizeof(half));
        pipe.InitBuffer(outQueueZ, BUFFER_NUM, TILE_LENGTH * sizeof(half));
    }
    ...
}

// 实现核函数
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();
}

其实,也就是说,SPMD的的数据是通过偏移进行操作的。这里也产生一个疑问,如果数据的地址不是连续的,那该如何操作?是在运行之前进行地址转连续吗?

该文部分内容来自Ascend官网:
SPMD模型-编程模型-Ascend C算子开发-算子开发-CANN商用版8.0.RC2.2开发文档-昇腾社区

相关文章
|
1月前
|
存储 人工智能 并行计算
【AI系统】Ascend C 编程范式
本文详细探讨了Ascend C编程范式下的向量计算编程,重点介绍了自定义向量算子的开发流程,包括算子分析、核函数定义与封装、算子数据通路及算子类实现等内容。文章通过具体的`add_custom`算子开发实例,解析了向量算子的初始化、数据搬入、计算与数据搬出等核心步骤,以及数据切分策略,旨在帮助读者理解Ascend C的设计理念及其向量算子的编写思路。
36 4
|
1月前
|
缓存 自然语言处理 API
Ascend推理组件MindIE LLM
MindIE LLM是基于昇腾硬件的大语言模型推理组件,提供高性能的多并发请求调度与优化技术,如Continuous Batching、PageAttention等,支持Python和C++ API,适用于高效能推理需求。其架构包括深度定制优化的模型模块、文本生成器和任务调度管理器,支持多种模型框架和量化方式,旨在提升大规模语言模型的推理效率和性能。
|
1月前
|
存储 人工智能 并行计算
【AI系统】算子开发编程语言 Ascend C
本文详细介绍了昇腾算子开发编程语言 Ascend C,旨在帮助开发者高效完成算子开发与模型调优。Ascend C 原生支持 C/C++标准,通过多层接口抽象、自动并行计算等技术,简化开发流程,提高开发效率。文章还探讨了并行计算的基本原理及大模型并行加速策略,结合 Ascend C 的 SPMD 编程模型和流水线编程范式,为读者提供了深入理解并行计算和 AI 开发的重要工具和方法。
42 2
|
8月前
|
人工智能
极智AI | 讲解TensorRT Constant算子
大家好,我是极智视界,本文讲解一下 TensorRT Constant 算子。
94 0
|
8月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
【深度学习】Tensorflow、MindSpore框架介绍及张量算子操作实战(超详细 附源码)
【深度学习】Tensorflow、MindSpore框架介绍及张量算子操作实战(超详细 附源码)
238 0
|
8月前
|
机器学习/深度学习 人工智能 算法
极智AI | 教你简化onnx upsample算子
本文介绍了简化 onnx upsample 算子的方法。
295 0
|
8月前
|
人工智能 PyTorch 算法框架/工具
极智AI | 讲解TensorRT怎么实现torch.select层
大家好,我是极智视界,本文讲解一下 TensorRT 实现 torch.select 层。
117 0
|
机器学习/深度学习 JSON 并行计算
【TVM 学习资料】快速入门:编译深度学习模型
【TVM 学习资料】快速入门:编译深度学习模型
254 0
|
机器学习/深度学习 缓存 并行计算
TensorRT实战-基本框架
上篇博文4_TensorRT概况主要讲了Nvida TensorRT的编程API,本篇主要通过一个简单、完整的例子来讲解如何将一个Caffe模型(GoogleNet模型)通过TensorRT进行推理加速。
511 1
|
机器学习/深度学习 人工智能 算法
深度学习框架大PK:TNN决战MNN,ncnn依旧经典
6月10日,腾讯优图实验室开源了一款深度学习推理框架TNN,高效解锁计算机视觉算法。开发者社区内,许多用户将其与ncnn,MNN等开源框架作比较。
4469 0
深度学习框架大PK:TNN决战MNN,ncnn依旧经典