已合并
更新 SPMD+SIMD/SIMT编程模型描述 #5938
ascendhjh创建于 29 天前
更新 SPMD+SIMD/SIMT编程模型描述 #5938
已合并
ascendhjh创建于 29 天前
共 1 个文件变更+37-27
@@ -1,14 +1,24 @@
1# 编程模型概述<a name="ZH-CN_TOPIC_0000002554090609"></a>1# 编程模型概述<a name="ZH-CN_TOPIC_0000002554090609"></a>
2 2 
3-如[异构系统](./heterogeneous_system.md)章节所述,基于昇腾处理器的应用程序通常分为两部分:**Host代码**与**Device代码**。其中,Host代码运行在CPU上,负责设备资源管理、Host Memory与Device Memory数据搬运及任务调度等;Device代码运行在NPU(神经网络处理器)上,专门执行实际的计算任务。本编程指南重点讲解如何基于**Ascend C编程语言**编写Device代码,以及如何通过Host代码完成Device代码的调度与执行。3+如[异构系统](./heterogeneous_system.md)章节所述,基于昇腾处理器的应用程序通常分为两部分:**Host代码**与**Device代码**。其中,Host代码运行在CPU上,负责设备资源管理、Host Memory与Device Memory间的数据搬运及任务调度等;Device代码运行在NPU(神经网络处理器)上,专门执行实际的计算任务。本编程指南重点讲解如何基于**Ascend C编程语言**编写Device代码,以及如何通过Host代码完成Device代码的调度与执行。
4 4 
5-## 并行执行模型:SIMD与SIMT5+## 并行执行模型:SPMD
6 6 
7-为编写高性能的Device端代码,首先需要理解底层的并行计算原理。在高性能并行编程领域,SIMD和SIMT是两种主流的并行执行模型,它们定义了指令驱动多计算单元协同工作的核心机制,是提升程序数据吞吐量、优化计算性能的关键技术,也是学习Ascend C编程的核心内容。7+**SPMD**(Single Program, Multiple Data,单程序多数据)是一种程序级并行模型:多个独立计算单元同时执行同一份程序代码,但各自处理不同的数据分片。
8 8 
9-### SIMD(单指令多数据流)9+**SIMD**(Single Instruction, Multiple Data,单指令多数据)与**SIMT**(Single Instruction, Multiple Threads,单指令多线程)同属指令驱动的并行执行范式:SIMD由单条指令同时驱动多个运算单元处理不同数据,硬件效率高但分支能力受限;SIMT以单条指令驱动多个线程并行执行,线程可独立分支,灵活性更强。
10 10 
11-**核心概念**:SIMD(Single Instruction Multiple Data)是一种 **数据并行** 模型,核心逻辑是:一条指令在同一个时钟周期内,对多个数据元素执行完全相同的操作,实现数据的批量并行处理。11+在Ascend C编程中,SPMD与SIMD/SIMT形成三种典型组合:
12+ 
13+- **SPMD+SIMD**:将AI Core抽象为逻辑核(Block),所有Block运行相同代码,以Block为视角编程,Block内部调用SIMD指令;
14+- **SPMD+SIMT**:将硬件抽象为Grid→Thread Block→Thread架构,以Thread为视角编程,关注每个Thread需处理的数据;
15+- **SPMD+SIMD/SIMT混合**:核函数本质遵循SPMD+SIMD,内部以向量函数(Vector Function, VF)为粒度进行SIMD与SIMT切换——SIMT VF抽象为一个SIMT Thread Block,内部基于Thread编程;SIMD VF内部直接调用SIMD指令。
16+ 
17+为简化表述,下文以SIMD和SIMT分别指代对应的编程模型。二者定义了指令驱动多计算单元协同工作的核心机制,是提升数据吞吐量、优化计算性能的关键技术,也是Ascend C编程的核心内容,下文将分别展开介绍。
18+ 
19+### SIMD(单指令多数据)
20+ 
21+**核心概念**:SIMD(Single Instruction, Multiple Data)是一种**数据并行**模型,核心逻辑是:一条指令在同一个时钟周期内,对多个数据元素执行完全相同的操作,实现数据的批量并行处理。
12 22 
13**核心特征**:23**核心特征**:
14- 单指令驱动:所有并行计算单元同步执行同一条指令,操作完全一致;24- 单指令驱动:所有并行计算单元同步执行同一条指令,操作完全一致;
@@ -21,59 +31,59 @@
21- 矩阵乘法、卷积等深度学习核心运算;31- 矩阵乘法、卷积等深度学习核心运算;
22- 逐元素数学函数(如向量加减、乘除、指数/对数运算)。32- 逐元素数学函数(如向量加减、乘除、指数/对数运算)。
23 33 
24-**SIMD[核函数(Kernel)](./ai_core_simd_programming/kernel_function.md)编程四步法**:SIMD编程遵循SPMD模型(Single Program Multiple Data,单程序多数据),即每个AI Core运行同一份核函数(Kernel),但负责处理不同的数据块,具体步骤如下:34+**SIMD[核函数(Kernel)](./ai_core_simd_programming/kernel_function.md)编程四步法**:SIMD编程模式下,每个AI Core运行同一份核函数(Kernel),分别处理不同的数据块,具体步骤如下:
25-1. **Tiling(分块)设计**:对全局超大数据进行均匀切分,为各AI Core分配大小均衡的独立数据分片,精准适配SPMD多核并行架构,规避单核算力瓶颈,实现全域负载均衡。35+1. **Tiling(分块)设计**:对全局超大数据进行均匀切分,为各AI Core分配大小均衡的独立数据分片,规避单核算力瓶颈,实现全域负载均衡。
26-2. **数据搬入**:调用SIMD专用API,将计算所需的数据从Device Memory(通常为HBM)搬运到AI Core的本地缓存,减少全局内存访问延迟。36+2. **数据搬入**:调用SIMD专用API,将计算所需数据从Device Memory(通常为HBM)搬运到AI Core的本地缓存,减少全局内存访问延迟。
27-3. **数据计算**:调用向量指令,一次处理多个同构数据;需注意,数据搬运与计算过程通常是异步执行的,需插入同步指令,确保计算时数据已就绪,保证结果准确。37+3. **数据计算**:调用向量指令,一次处理多个同构数据;需注意,数据搬运与计算过程通常异步执行,需插入同步指令,确保计算时数据已就绪,保证结果准确。
28-4. **数据搬出**:调用SIMD专用API,将本地缓存中完成计算的结果,搬运回Device Memory,供后续任务使用。38+4. **数据搬出**:调用SIMD专用API,将本地缓存中已完成计算的结果搬运回Device Memory,供后续任务使用。
29 39 
30### SIMT(单指令多线程)40### SIMT(单指令多线程)
31 41 
32-**核心概念**:SIMT(Single Instruction Multiple Threads)是一种 **线程并行** 模型,核心逻辑是:一条指令同时驱动多个独立线程,每个线程仅处理一个数据元素;指令同步下发,但线程可根据代码分支(如if-else)独立执行,灵活性更高。42+**核心概念**:SIMT是一种**线程并行**模型,核心逻辑是:一条指令同时驱动多个独立线程,每个线程仅处理一个数据元素;指令同步下发,但线程可根据代码分支(如if-else)独立执行,灵活性更高。
33 43 
34**核心特征**:44**核心特征**:
35-- 单指令控制多线程:一条指令同步调度一组线程(如32个线程组成的Warp),统一发起执行指令;45+- 单指令控制多线程:一条指令同步调度一组线程(如32个线程组成的Warp),统一发起并执行;
36- 线程独立:每个线程拥有独立的程序计数器、寄存器和执行状态,可单独处理一个数据元素,支持复杂分支逻辑;46- 线程独立:每个线程拥有独立的程序计数器、寄存器和执行状态,可单独处理一个数据元素,支持复杂分支逻辑;
37- 硬件自动调度与掩蔽:线程的调度、切换,以及不活跃线程的掩蔽(Masking)均由硬件自动完成,无需程序员手动管理,降低开发复杂度。47- 硬件自动调度与掩蔽:线程的调度、切换,以及不活跃线程的掩蔽(Masking)均由硬件自动完成,无需程序员手动管理,降低开发复杂度。
38 48 
39-**适用场景**:主要适配不规则数据访问、分支密集、稀疏计算等场景,典型场景包括:49+**适用场景**:主要适配不规则数据访问、分支密集、稀疏计算等任务,典型场景包括:
40- 深度学习中的稀疏算子(如稀疏卷积、稀疏矩阵运算);50- 深度学习中的稀疏算子(如稀疏卷积、稀疏矩阵运算);
41- 带有复杂if-else分支的逐元素运算;51- 带有复杂if-else分支的逐元素运算;
42- 具有动态数据依赖的算法(如并行前缀和、排序网络)。52- 具有动态数据依赖的算法(如并行前缀和、排序网络)。
43 53 
44-**SIMT[核函数(Kernel)](./ai_core_simt_programming/kernel_function.md)编程四步法**:SIMT编程同样遵循SPMD模型,即同一份程序运行在每个线程上,每个线程处理不同的数据元素,具体步骤如下:54+**SIMT[核函数(Kernel)](./ai_core_simt_programming/kernel_function.md)编程四步法**:SIMT编程模式下,同一份程序运行在每个线程上,各线程处理不同的数据元素,具体步骤如下:
451. **Tiling(分块)设计**:将整体任务拆分为多个独立线程,使线程索引与数据索引一一对应,确保每个线程处理唯一的数据元素,避免数据重复或遗漏。551. **Tiling(分块)设计**:将整体任务拆分为多个独立线程,使线程索引与数据索引一一对应,确保每个线程处理唯一的数据元素,避免数据重复或遗漏。
46-2. **数据搬入**:通过指针直接访问Device Memory,无需调用SIMD那样的专用API;硬件会自动将所需数据从Device Memory加载到线程的寄存器中,简化开发流程。56+2. **数据搬入**:通过指针直接访问Device Memory,无需像SIMD那样调用专用API;硬件会自动将所需数据从Device Memory加载到线程的寄存器中,简化开发流程。
473. **数据计算**:编程方式类似CPU标量代码,支持分支、循环等复杂控制逻辑;数据搬运与计算过程通常无需显式同步,若涉及多线程协作(如使用共享内存),需插入同步指令。573. **数据计算**:编程方式类似CPU标量代码,支持分支、循环等复杂控制逻辑;数据搬运与计算过程通常无需显式同步,若涉及多线程协作(如使用共享内存),需插入同步指令。
484. **数据搬出**:通过指针直接将计算结果写回Device Memory,无需调用专用API,与CPU编程逻辑更接近,降低上手难度。584. **数据搬出**:通过指针直接将计算结果写回Device Memory,无需调用专用API,与CPU编程逻辑更接近,降低上手难度。
49 59 
50-> 📌 **提示**:Host端可通过`<<<>>>`语法糖来调用并运行核函数(Kernel)。60+> 📌 **提示**:Host端可通过`<<<>>>`语法糖调用并运行核函数(Kernel)。
51 61 
52## AI Core硬件基础62## AI Core硬件基础
53 63 
54-上述两类抽象的并行执行模型,在昇腾AI处理器中都有着清晰的物理硬件对应。Device端的核心计算单元为**AI Core**,是昇腾AI处理器的核心算力载体。单枚昇腾NPU芯片通常集成多个AI Core,各核心可并行协作,大幅提升设备整体计算吞吐量。每个AI Core内部架构模块化分工明确,核心组成组件如下:64+上述SIMD与SIMT两类并行执行模型,在昇腾AI处理器中都有清晰的物理硬件对应。Device端的核心计算单元为**AI Core**,是昇腾AI处理器的主要算力载体。单枚昇腾NPU芯片通常集成多个AI Core,各核心可并行协作,大幅提升设备整体计算吞吐量。每个AI Core内部架构模块化分工明确,核心组成组件如下:
55 65 
56- **标量处理单元**:负责处理控制流(如分支、循环)和地址计算,功能类似传统CPU核心,是AI Core的“控制中枢”。66- **标量处理单元**:负责处理控制流(如分支、循环)和地址计算,功能类似传统CPU核心,是AI Core的“控制中枢”。
57 67 
58-- **向量处理单元**:承担核心向量运算任务,是SIMD、SIMT两种并行执行模型的主要硬件载体,不同昇腾硬件架构对两类并行模式的适配能力存在差异。68+- **向量处理单元**:承担向量运算任务,是SIMD、SIMT两种并行执行模型的主要硬件载体,不同昇腾硬件架构对两类并行模式的适配能力存在差异。
59 69 
60-- **矩阵运算单元**:针对矩阵乘加运算做深度硬件优化,仅支持SIMD执行模式,是深度学习卷积、全连接层等核心算子的极速加速单元。70+- **矩阵运算单元**:针对矩阵乘加运算做了深度硬件优化,仅支持SIMD执行模式,是深度学习卷积、全连接层等核心算子的高效加速单元。
61 71 
62- **本地存储**:AI Core内置的高速存储资源,用于缓存实时计算所需数据,可有效规避全局Device Memory的高延迟访问问题,显著提升整体计算效率。72- **本地存储**:AI Core内置的高速存储资源,用于缓存实时计算所需数据,可有效规避全局Device Memory的高延迟访问问题,显著提升整体计算效率。
63 73 
64<!-- npu="950" id1 -->74<!-- npu="950" id1 -->
65-需重点区分架构差异:Ascend 950PR/Ascend 950DT架构之前的AI Core,仅支持**SIMD**单一执行模型;自Ascend 950PR/Ascend 950DT架构起,AI Core向量处理单元同时兼容SIMD、SIMT两种并行模型,可根据不同计算任务灵活选择并行方案,适配更多复杂业务场景。75+需重点区分架构差异:Ascend 950PR/Ascend 950DT之前的架构中,AI Core仅支持**SIMD**单一执行模型;自Ascend 950PR/Ascend 950DT架构起,AI Core向量处理单元同时兼容SIMD、SIMT两种并行模型,可根据计算任务灵活选择并行方案,适配更多复杂业务场景。
66<!-- end id1 -->76<!-- end id1 -->
67 77 
68> 💡 **为什么要了解AI Core内部结构?** 78> 💡 **为什么要了解AI Core内部结构?**
69-> 理解AI Core硬件架构是开发高性能算子的核心前提,例如:明确数据需主动搬运至本地存储,才能充分发挥SIMD高带宽算力优势;掌握向量处理单元的硬件特性,才能主动将计算逻辑向量化,最大化发挥硬件峰值性能,避免算力浪费。79+> 理解AI Core硬件架构是开发高性能算子的前提:只有明确数据需主动搬运至本地存储,才能充分发挥SIMD的高带宽算力优势;只有掌握向量处理单元的硬件特性,才能主动将计算逻辑向量化,最大化发挥硬件峰值性能,避免算力浪费。
70 80 
71## AI Core编程模型<a name="section_ai_core_programming_model"></a>81## AI Core编程模型<a name="section_ai_core_programming_model"></a>
72 82 
73-为提升向量计算在复杂控制流、离散访存等场景下的编程灵活性,在采用SIMD与SIMT深度融合的新同构架构中:矩阵计算单元延续SIMD设计,向量计算单元则在SIMD的基础上引入SIMT能力。这一设计确立了以**SIMD为主、SIMT为辅**的新同构编程模型。在该模型下,矩阵计算和向量计算中的SIMD部分配置了超过90%的算力,为密集计算带来高性能与高算力利用率;向量计算中的SIMT则作为灵活性补充,专门应对复杂控制流、离散访存等不规则场景,提升这类场景下算法开发和优化的效率。83+为提升向量计算在复杂控制流、离散访存等场景下的编程灵活性,新同构架构对SIMD与SIMT进行了深度融合:矩阵计算单元延续SIMD设计,向量计算单元则在SIMD的基础上引入SIMT能力,由此确立了以**SIMD为主、SIMT为辅**的新同构编程模型。在该模型下,矩阵计算和向量计算中的SIMD部分配置了超过90%的算力,为密集计算带来高性能与高算力利用率;向量计算中的SIMT部分则作为灵活性补充,专门应对复杂控制流、离散访存等不规则场景,提升此类场景下算法开发与优化的效率。
74 84 
75### SIMD编程(主流范式,全系列标准支持)85### SIMD编程(主流范式,全系列标准支持)
76-- **能力范围**:支持向量计算、矩阵计算,以及向量与矩阵的融合计算,覆盖深度学习大部分核心场景;86+- **能力范围**:支持向量计算、矩阵计算,以及向量与矩阵的融合计算,覆盖深度学习的大部分核心场景;
77- **适用场景**:规整的、高密度的数据并行任务,如卷积、矩阵乘、逐元素变换等,是昇腾NPU开发的主流选择;87- **适用场景**:规整的、高密度的数据并行任务,如卷积、矩阵乘、逐元素变换等,是昇腾NPU开发的主流选择;
78- **优势**:能效比高,指令执行开销低,可充分发挥硬件性能,接近AI Core的峰值计算能力;88- **优势**:能效比高,指令执行开销低,可充分发挥硬件性能,接近AI Core的峰值计算能力;
79- **学习路径**:详见[AI Core SIMD编程](./ai_core_simd_programming/overview.md);算子开发流程参见[SIMD算子实现](../../operator_practice/simd_operator_impl/simd_operator_impl.md)。89- **学习路径**:详见[AI Core SIMD编程](./ai_core_simd_programming/overview.md);算子开发流程参见[SIMD算子实现](../../operator_practice/simd_operator_impl/simd_operator_impl.md)。
@@ -81,7 +91,7 @@
81<!-- npu="950" id2 -->91<!-- npu="950" id2 -->
82### SIMT编程(辅助补充)92### SIMT编程(辅助补充)
83- **能力范围**:仅支持向量计算,不支持矩阵运算或向量与矩阵的融合计算,功能范围相对有限;93- **能力范围**:仅支持向量计算,不支持矩阵运算或向量与矩阵的融合计算,功能范围相对有限;
84-- **适用场景**:离散数据访问、复杂分支控制的向量算子,同时适合熟悉SIMT模型的开发者快速上手Ascend C;94+- **适用场景**:离散数据访问、复杂分支控制的向量算子,也适合熟悉SIMT模型的开发者快速上手Ascend C;
85- **限制**:<!-- npu="950" id3 -->当前仅支持Ascend 950PR/Ascend 950DT。<!-- end id3 -->95- **限制**:<!-- npu="950" id3 -->当前仅支持Ascend 950PR/Ascend 950DT。<!-- end id3 -->
86 <!-- @ref: asc-devkit/res/docs/zh/guide/programming_guide/programming_model/programming_model_overview_res.md#id1 -->96 <!-- @ref: asc-devkit/res/docs/zh/guide/programming_guide/programming_model/programming_model_overview_res.md#id1 -->
87- **学习路径**:详见[AI Core SIMT编程](./ai_core_simt_programming/overview.md);算子开发参见[SIMT算子实现](../../operator_practice/simt_operator_impl/simt_operator_impl.md)。97- **学习路径**:详见[AI Core SIMT编程](./ai_core_simt_programming/overview.md);算子开发参见[SIMT算子实现](../../operator_practice/simt_operator_impl/simt_operator_impl.md)。
@@ -89,16 +99,16 @@
89 99 
90### SIMD与SIMT混合编程100### SIMD与SIMT混合编程
91 101 
92-SIMD与SIMT混合编程的核函数(Kernel),底层仍以SIMD编程模型为基础。开发者可在核函数(Kernel)内部灵活组合两类编程逻辑:通过SIMT逻辑处理稀疏索引、复杂分支等不规则计算场景,输出规整化数据块;再通过SIMD高吞吐向量/矩阵运算处理规整数据,兼顾代码灵活性与硬件高性能,适配复杂混合计算场景。详细实现方法请参考[AI Core SIMD与SIMT混合编程](../advanced_programming/advanced_ai_core_programming_model/simd_simt_hybrid_programming/overview.md)。102+SIMD与SIMT混合编程的核函数(Kernel)底层仍以SIMD编程模型为基础。开发者可在核函数(Kernel)内部灵活组合两类编程逻辑:先通过SIMT逻辑处理稀疏索引、复杂分支等不规则计算,输出规整化的数据块;再通过SIMD高吞吐的向量/矩阵运算处理规整数据,兼顾代码灵活性与硬件高性能,适配复杂混合计算场景。详细实现方法请参考[AI Core SIMD与SIMT混合编程](../advanced_programming/advanced_ai_core_programming_model/simd_simt_hybrid_programming/overview.md)。
93 103 
94<!-- @ref: asc-devkit/res/docs/zh/guide/programming_guide/programming_model/programming_model_overview_res.md#id2 -->104<!-- @ref: asc-devkit/res/docs/zh/guide/programming_guide/programming_model/programming_model_overview_res.md#id2 -->
95 105 
96## AI Core编程小结106## AI Core编程小结
97 107 
98-Ascend C采用**SIMD+SIMT双模并行**的核心设计,既保留了SIMD高能效、高吞吐量的核心优势,又通过SIMT模型补齐了离散数据、复杂分支等不规则场景的计算能力,实现全场景计算任务的高效适配。开发者在实际开发中,可根据算法的**访存模式**(连续规整/离散随机)、**分支密度**(低分支/高分支)及**并行粒度**,灵活选用单一编程模型或混合编程方案。此外,Host侧通过CANN Runtime API提供内存管理、任务调度等能力,与Device侧代码协同工作,共同实现异构计算的高效运行。108+Ascend C采用**SIMD+SIMT双模并行**的设计,既保留了SIMD高能效、高吞吐量的优势,又通过SIMT模型补齐了离散数据、复杂分支等不规则场景的计算能力,实现对全场景计算任务的高效适配。实际开发中,开发者可根据算法的**访存模式**(连续规整/离散随机)、**分支密度**(低分支/高分支)及**并行粒度**,灵活选用单一编程模型或混合编程方案。此外,Host侧通过CANN Runtime API提供内存管理、任务调度等能力,与Device侧代码协同工作,共同实现异构计算的高效运行。
99 109 
100> 📌 **下一步**:如果您主要开发规整的高性能算子,建议直接阅读[AI Core SIMD编程](ai_core_simd_programming/overview.md);如果您需要处理稀疏数据或复杂分支逻辑,可从[AI Core SIMT编程](ai_core_simt_programming/overview.md)开始学习。110> 📌 **下一步**:如果您主要开发规整的高性能算子,建议直接阅读[AI Core SIMD编程](ai_core_simd_programming/overview.md);如果您需要处理稀疏数据或复杂分支逻辑,可从[AI Core SIMT编程](ai_core_simt_programming/overview.md)开始学习。
101 111 
102## AI CPU编程模型112## AI CPU编程模型
103 113 
104-AI CPU是Device上的辅助处理器(基于ARM架构),主要用于执行一些无法由AI Core高效处理的任务,例如:控制流复杂、数据依赖强的逻辑等。其编程模型遵循通用CPU编程规范,采用标准C/C++语法即可开发。详细开发指南请阅读[AI CPU编程](./ai_cpu_programming.md)。114+AI CPU是Device上的辅助处理器(基于ARM架构),主要用于执行AI Core难以高效处理的任务,例如控制流复杂、数据依赖强的逻辑等。其编程模型遵循通用CPU编程规范,采用标准C/C++语法即可开发。详细开发指南请阅读[AI CPU编程](./ai_cpu_programming.md)。