---
title: 编程模型设计原理
description: "Ascend C编程模型中，并行编程范式核心要素是：一组并行计算任务、通过队列实现任务之间的同步、开发者自主表达对并行计算任务和资源的调度。本节介绍编程模型的设计原理，作为扩展阅读，便于开发者更好的理解编程模型的设计思路和优势，对于后续的深度开发也会有所帮助。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/programug/Ascendcopdevg/atlas_ascendc_10_00015.html
sourcePath: /source/zh/canncommercial/900/programug/Ascendcopdevg/atlas_ascendc_10_00015.html
indexId: aa2abc2db7dc4248ce70ef02e075e6551d8c1b1281f2876a432b8ae5271d1d8081
---
# 编程模型设计原理

Ascend C编程模型中，并行编程范式核心要素是：一组并行计算任务、通过队列实现任务之间的同步、开发者自主表达对并行计算任务和资源的调度。本节介绍编程模型的设计原理，作为扩展阅读，便于开发者更好的理解编程模型的设计思路和优势，对于后续的深度开发也会有所帮助。

每个并行任务Stage的编程范式如下：

1. 获取Local Memory的内存：调用AllocTensor申请内存，或者从上游队列DeQue一块内存数据。
2. 完成计算或者数据搬运。
3. 把上一步处理好的数据调用EnQue入队。
4. 调用FreeTensor释放不再需要的内存。

以最简单的矢量编程范式为例，在调用上述接口时，实际上会给各执行单元下发一些指令，如下图所示：

图1 Vector编程范式指令队列示例


- EnQue/DeQue的具体处理流程：

  1. 标量执行单元读取算子指令序列
  2. 把这些指令发射到对应的执行单元的指令队列
  3. 各个执行单元并行执行这些指令序列
  4. EnQue/DeQue解决对内存的写后读问题

    - EnQue调用会发射同步指令set，发送信号激活wait
    - DeQue调用会发射同步指令wait，等待数据写入完成
    - wait需要等到set指令执行完成后才能执行否则阻塞
由此可以看出，EnQue/DeQue主要解决了存在数据依赖时，并行执行单元的写后读同步控制问题。

- AllocTensor/FreeTensor的具体处理流程

  1. 标量执行单元读取算子指令序列
  2. 把这些指令发射到对应的执行单元的指令队列
  3. 各个执行单元并行执行这些指令序列
  4. AllocTensor/FreeTensor，解决对内存的读后写问题

    - AllocTensor调用会发射同步指令wait等待内存被读完成
    - FreeTensor调用会发射同步指令set，通知内存释放，可以重复写
    - wait需要等到set指令执行完成后才能执行否则阻塞
由此可以看出，AllocTensor/FreeTensor主要解决了存在数据依赖时，并行执行单元的读后写同步控制问题。

通过上文的详细说明，可以看出异步并行程序需要考虑复杂的同步控制，而Ascend C编程模型将这些流程进行了封装，通过EnQue/DeQue/AllocTensor/FreeTensor这种开发者熟悉的资源控制方式来体现，达到简化编程和易于理解的目的。
