您好,该资料对 SPMD、SIMD、SIMT 的说明本身并无问题。您之前提到的“SIMT 全写错了”,应理解为不同资料在表述上可能不够清晰。
SPMD 是程序级并行模型:多个计算单元执行同一份代码,各自处理不同数据分片。
SIMD/SIMT 属指令驱动并行范式:SIMD 单指令驱动多运算单元,效率高但分支受限;SIMT 单指令驱动多线程,线程可独立分支,灵活性更强。
Ascend C 中三种组合:SPMD+SIMD(以 Block 为视角,内部调 SIMD 指令)、SPMD+SIMT(以 Thread 为视角)、SPMD+SIMD/SIMT 混合(核函数遵循 SPMD+SIMD,内部以 VF 为粒度切换 SIMD/SIMT)。
为简化表述,以 SIMD 和 SIMT 分别指代对应的编程模型。
相关 issue 已在 #1573 中跟踪,正在讨论资料优化。


SPMD(Single Program, Multiple Data,单程序多数据)是一种程序级并行模型:多个独立计算单元同时执行同一份程序代码,但各自处理不同的数据分片。
SIMD(Single Instruction, Multiple Data,单指令多数据)与SIMT(Single Instruction, Multiple Threads,单指令多线程)同属指令驱动的并行执行范式:SIMD由单条指令同时驱动多个运算单元处理不同数据,硬件效率高但分支能力受限;SIMT以单条指令驱动多个线程并行执行,线程可独立分支,灵活性更强。
在Ascend C编程中,SPMD与SIMD/SIMT形成三种典型组合:
SPMD+SIMD:将AI Core抽象为逻辑核(Block),所有Block运行相同代码,以Block为视角编程,Block内部调用SIMD指令;
SPMD+SIMT:将硬件抽象为Grid→Thread Block→Thread架构,以Thread为视角编程,关注每个Thread需处理的数据;
SPMD+SIMD/SIMT混合:核函数本质遵循SPMD+SIMD,内部以向量函数(Vector Function, VF)为粒度进行SIMD与SIMT切换——SIMT VF抽象为一个SIMT Thread Block,内部基于Thread编程;SIMD VF内部直接调用SIMD指令。
为简化表述,以 SIMD 和 SIMT 分别指代对应的编程模型。


SIMT核函数(Kernel)编程基本步骤(遵循SPMD模型)
SIMT的SPMD模型(Single Program, Multiple Data):每个线程运行同一份程序,但每个线程处理不同的数据元素。
Tiling(分块):建立线程索引与数据索引的一一对应关系。
数据搬入:通过指针直接访问Device Memory,硬件自动加载到寄存器,无需显式调用数据搬运API。
数据计算:编写标量代码(支持分支、循环);多线程协作时需插入同步指令。
数据搬出:可通过指针将结果直接写回Device Memory,无需显式调用数据搬运API。