3510新特性使用说明
本文介绍NPU架构版本3510新增特性,为开发者将算子程序从其他架构迁移至3510架构提供参考。有关3510架构的整体变更,请参见2201到3510架构变更。
特性总览
表 1 3510新特性总览
除上表中所列特性以外,3510架构还新增SIMT编程模型和SIMD与SIMT混合编程,具体说明请参见:
- SIMT编程:AI Core SIMT编程、SIMT API。
- SIMD与SIMT混编:SIMD与SIMT混合编程。
特性说明
新增UB到L1 Buffer搬运数据通路
特性应用场景说明
CV融合算子中,UB向L1 Buffer搬运数据不再需要通过GM中转。
功能说明
- 对于C API,使用asc_copy_ub2l1接口实现UB到L1 Buffer数据搬运,无需配置编译选项。
- 对于基础API,使用DataCopy(UB到L1 Buffer)、DataCopyPad(UB到L1 Buffer)进行搬运,开启该特性需要配置编译选项
ENABLE_CV_COMM_VIA_SSBUF:- 开启该编译选项后,数据通过UB到L1 Buffer之间的硬件通道直接搬运。该方式无需经过GM中转,性能较高。
- 未开启该编译选项时,数据需经由GM搬运至L1 Buffer。在此场景下,UB到L1 Buffer搬运接口采用软件仿真实现。
典型样例说明
- data_copy_ub2l1样例:在Mmad矩阵乘场景下,基于DataCopy实现UB到L1 Buffer数据搬运,通过编译选项
SCENARIO_NUM切换连续搬运和随路ND2NZ搬运两种场景,取值1表示连续搬运,取值2表示随路ND2NZ搬运。样例完整数据流为GM到UB到L1 Buffer到L0A Buffer、L0B Buffer到Mmad到L0C Buffer到GM。样例编译工程已通过ascendc_compile_definitions配置-DENABLE_CV_COMM_VIA_SSBUF=true。
新增L1 Buffer到UB搬运数据通路
特性应用场景说明
CV融合算子场景,L1 Buffer向UB搬运数据。3510架构新增L1 Buffer到UB搬运数据通路。
功能说明
可参考以下资料:
- 基础API:DataCopyL1ToUB。
- C API:asc_copy_l12ub。
新增L0C Buffer到UB搬运数据通路
特性应用场景说明
CV融合算子场景,矩阵计算后的结果若需要在Vector核侧进行归一化、激活等向量计算,需要先将L0C Buffer中的数据搬运到UB。3510架构新增L0C Buffer到UB单向数据通路。
功能说明
可参考以下资料:
- 基础API:Fixpipe(L0C Buffer到UB数据搬运)。使用带有
FixpipeParamsArch3510参数的Fixpipe接口实现L0C Buffer到UB搬出。 - C API:asc_copy_l0c2ub。
典型样例说明
fixpipe_l0c2ub样例:基于Fixpipe实现L0C Buffer到UB数据搬运,完整数据流为GM到L1 Buffer到L0A Buffer、L0B Buffer到Mmad到L0C Buffer到UB。
新增ND-DMA多维数据搬运
特性应用场景说明
Vector算子场景,从GM搬运至UB时,若涉及多维矩阵、不规则Stride,以及Padding、Transpose、Broadcast或Slice等复杂数据变换时,需要多次调用基础搬运接口。3510架构新增ND-DMA硬件指令。与基础数据搬运接口相比,该指令支持灵活配置搬入数据的维度信息和Stride,可通过一条指令完成上述复杂场景的数据搬运。
功能说明
可参考以下资料:
- 基础API:DataCopy(GMToUB多维数据搬运NDDMA)、NdDmaDci。
- C API:asc_ndim_copy_gm2ub。
典型样例说明
data_copy_gm2ub_nddma样例:基于ND-DMA指令实现GM到UB多维数据搬运,模拟多维Shape下移动窗口的数据搬运,包含Slice、输入Stride和不连续源数据搬运的配置方式。
对齐/非对齐数据搬运新增loop模式
特性应用场景说明
Vector算子场景,当需要将GM中的多段数据交替搬运至UB的不同地址,或沿相反方向搬运时,通常需要循环执行多条DataCopy指令,导致指令数量和流水开销增加。3510架构新增loop模式数据搬运能力,调用一次接口即可完成搬运,从而减少指令下发开销并提升搬运效率。
功能说明
可参考以下资料:
新增MX矩阵搬运与计算
特性应用场景说明
MicroScaling(MX)是一种低比特量化数据格式,例如fp4x2_e2m1_t、fp4x2_e1m2_t、fp8_e5m2_t和fp8_e4m3fn_t。矩阵数据与各数据块对应的量化系数矩阵共同存储,因此矩阵计算时需同步搬运矩阵数据和量化系数矩阵。3510架构新增适用于MicroScaling场景的数据搬运能力,可同步搬运矩阵数据与量化系数矩阵,为MX低比特格式的矩阵计算提供支持。
功能说明
可参考以下资料:
典型样例说明
- load_data_2dmx_l12l0样例:演示MX矩阵数据及其量化系数矩阵的同步搬运。
- mmad_mx样例:演示MmadMx矩阵乘加计算。
2D矩阵搬运(随路转置)能力增强
特性应用场景说明
在矩阵乘计算中,L1 Buffer中的右矩阵B需要以转置后的分形排布搬入L0B Buffer。对于源矩阵中分形非连续排布的场景,2201架构的搬运参数以拼接后的方块矩阵为配置单位,难以直接描述分形级间隔。3510架构增强随路转置搬运能力,可按512字节分形配置搬运起始位置、相邻迭代源Stride及迭代内源分形间隔,适用于分形拼接、非连续搬入等场景。
功能说明
可参考以下资料:
- 基础API:LoadDataWithTranspose。3510架构使用
LoadData2dTransposeParamsV2作为参数类型,支持以512字节分形为单位配置源Stride,并可通过srcFracGap配置每个迭代内的源分形间隔。 - C API:asc_copy_l12l0b_trans(arch3510)。
Fixpipe新增NZ2DN随路转换
特性应用场景说明
L0C Buffer中Mmad计算结果为NZ分形格式,部分算子输出需要列主序的DN格式。3510架构的Fixpipe接口新增NZ2DN随路转换能力,可在L0C Buffer到GM、L1 Buffer、UB搬出过程中完成格式转换。
功能说明
可参考以下资料:
2D矩阵搬运能力增强
特性应用场景说明
3510架构2D矩阵搬运能力增强,搬运方式更加灵活,并且支持全量数据类型的搬运。
功能说明
可参考以下资料:
- 基础API:LoadData(2D矩阵搬运V2)、LoadData(GM到L1 Buffer的2D矩阵搬运V2)。
- C API:asc_copy_l12l0a(2D矩阵搬运,arch3510)、asc_copy_l12l0b(2D矩阵搬运,arch3510)、asc_copy_gm2l1(arch3510)。
典型样例说明
load_data_2dv2_l12l0样例:演示使用2D V2指令将矩阵数据从L1 Buffer搬运至L0A Buffer。
新增Stride卷积矩阵搬运
特性应用场景说明
3510架构新增Stride卷积矩阵搬运能力,用于需要配置输出矩阵K轴方向偏移量的卷积数据搬运场景。
功能说明
可参考以下资料:
- 基础API:LoadDataWithStride。
- C API:asc_copy_l12l0a(3D矩阵搬运,arch3510)、asc_copy_l12l0b(3D矩阵搬运,arch3510)、asc_set_l13d_rpt和asc_set_l3d_rpt_b。其中,
asc_set_l13d_rpt和asc_set_l3d_rpt_b分别用于配置左寄存器组和右寄存器组的输出矩阵步长。
典型样例说明
load_data_with_stride样例:演示Stride卷积矩阵搬运。
矩阵计算支持更多数据类型
特性应用场景说明
3510架构扩展矩阵计算支持的低比特浮点输入类型,可用于更多矩阵计算场景。
功能说明
相比2201架构,3510架构新增支持以下矩阵输入类型:
- 矩阵计算新增支持hifloat8_t、fp8_e5m2_t和fp8_e4m3fn_t。
- MX矩阵计算支持fp4x2_e2m1_t、fp4x2_e1m2_t、fp8_e5m2_t和fp8_e4m3fn_t。MX计算使用fp8_e8m0_t类型的Scale矩阵。
可参考以下资料:
- 基础API:Mmad、MmadMx。
- C API:asc_mmad、asc_mmad_mx。
L0A Buffer分形排布变为NZ
特性应用场景说明
3510架构的L0A Buffer采用NZ排布,不再采用2201架构上的ZZ排布。
功能说明
由于分形排布变化,3510架构下,在A矩阵转置且非对齐的场景下,L0A Buffer的K方向按8对齐,无K方向对齐约束。
矢量计算基础API扩展
特性应用场景说明
3510架构矢量计算基础API新增多项接口和参数变体。
功能说明
表 3 矢量计算基础API扩展说明
| API | 功能说明 |
|---|---|
| Adds | 矢量内每个元素与标量做加法,标量输入支持配置LocalTensor单点元素,支持标量在前、标量在后两种场景。 |
| Muls | 矢量内每个元素与标量做乘法,标量输入支持配置LocalTensor单点元素。 |
| Subs | 矢量内每个元素与标量做减法,标量输入支持配置LocalTensor单点元素。 |
| Divs | 矢量内每个元素与标量做除法,标量输入支持配置LocalTensor单点元素。 |
| Maxs | 矢量内每个元素与标量取最大值,标量输入支持配置LocalTensor单点元素。 |
| Mins | 矢量内每个元素与标量取最小值,标量输入支持配置LocalTensor单点元素。 |
| Compares | 矢量内每个元素与标量比较,标量输入支持配置LocalTensor单点元素,支持标量在前、标量在后两种场景。 |
| Select | 根据selMask的比特位从两个源操作数中选取元素写入目的操作数。 |
| Neg | 对源操作数取相反数。 |
| Prelu | 带参数的ReLU计算。 |
| Mull | 32位元素相乘得到64位乘积,拆分为低32位与高32位分别写入两个目的操作数。 |
| AbsSub | 计算两个源操作数差的绝对值。 |
| ExpSub | 计算exp(src0)-exp(src1)。 |
| MulsCast | 矢量与标量相乘后再进行数据类型转换。 |
| Truncate | 对源操作数执行向下取整操作。 |
| Interleave | 将两个源操作数中的元素交织存入结果操作数。 |
| DeInterleave | 将源操作数中的元素按交织方式拆分到两个结果操作数。 |
| ShiftLeft | 对源操作数中的每个元素按移位量左移,移位量由张量输入指定。 |
| ShiftRight | 对源操作数中的每个元素按移位量右移,移位量由张量输入指定。 |
| Ands | 矢量内每个元素和标量做按位与操作,标量输入支持配置LocalTensor单点元素。 |
| Ors | 矢量内每个元素和标量做按位或操作,标量输入支持配置LocalTensor单点元素。 |
新增Regbase矢量计算方式
特性应用场景说明
3510架构的AIV核采用Regbase架构,中间结果可暂存于寄存器中,从而减少UB读写并提高执行效率。Regbase架构的编程模型请参见Reg矢量计算编程。
功能说明
Reg矢量计算相关接口的完整接口清单请参考Reg矢量计算文档。
对应的C API请参见Reg矢量计算C API。
典型样例说明
- 数据搬运:reg_load_store_align样例、reg_load_store_mask样例、reg_load_store_unalign样例、reg_load_gather样例、reg_store_scatter样例、reg_move样例、reg_auxscalar样例。
- Reg计算:mul样例、reduce样例、reduce_pair样例等。
- 高性能算子:gelu_high_performance样例、gelu_eltwise_high_performance样例、softmax_high_performance样例。
原子操作接口扩展
特性应用场景说明
在多线程或多核并发访问GM中同一数据的场景下,需要对GM地址中的数据执行原子读改写操作,以避免并发写入引发数据竞争。3510架构对原子操作基础接口做了扩充。
功能说明
表 5 新增原子操作接口说明
| 功能说明 | 相关基础API | 相关C API |
|---|---|---|
| 将GM地址上的旧值与输入标量求和并写回,返回修改前的值。 | AtomicAdd | asc_atomic_add |
| 将GM地址上的旧值与输入标量取最大值并写回,返回修改前的值。 | AtomicMax | asc_atomic_max |
| 将GM地址上的旧值与输入标量取最小值并写回,返回修改前的值。 | AtomicMin | asc_atomic_min |
| 将GM地址上的旧值与输入标量交换,返回修改前的值。 | AtomicExch | asc_atomic_exch |
| 将GM地址上的旧值与期望值比较,相等则写入新值,返回修改前的值。 | AtomicCas | asc_atomic_cas |
典型样例说明
scalar_atomic_operations样例:基于AtomicAdd和AtomicCas接口,演示在GM地址上进行标量原子加和原子比较交换的实现流程,支持多核并行更新单个内存地址。
新增DCI(数据缓存失效)能力
特性应用场景说明
算子执行结束时,需将DCache置为失效,防止后续算子读取其中的无效数据。默认情况下,编译框架会在算子尾部插入DCCI(DataCacheCleanAndInvalid)指令,在使DCache失效的同时将脏数据写回GM,因此会产生额外的Clean开销。3510架构新增DCI(DataCacheInvalid)数据缓存失效能力,DCI指令可直接使整个数据缓存失效,而不回写脏缓存行。在算子尾部使用DCI指令替代DCCI指令,可跳过将DCache脏数据同步至GM的Clean过程,从而降低算子尾部开销。
功能说明
可通过以下两种方式插入DCI指令:
- 编译选项方式:编译时配置
--cce-no-dcache-flush,编译框架将在算子尾部插入DCI指令,替代默认的DCCI指令。推荐使用该方式开启DCI能力。详细说明请参考设置DCI编译选项来减少算子尾开销。 - 接口方式:使用asc_dci接口执行数据缓存失效,调用前需先通过asc_sync_data_barrier插入DSB_ALL指令,等待所有内存访问指令执行结束。
新增SSBuffer核内存储单元
特性应用场景说明
在Mix算子中,AIC核与AIV核之间需要传递控制信息和标量数据。在NPU架构版本2201上,AIC与AIV通过GM通信,通信延迟较高且占用GM带宽。3510架构新增SSBuffer核内存储单元,支持AI Core内的AIC核与AIV核通过Scalar直接访问SSBuffer进行核间通信,该方式无需访问GM,可降低通信延迟并减少GM带宽占用。SSBuffer适用于同一任务内AIC核与AIV核之间的小数据量通信,例如传递控制信息、地址或少量标量数据。大块数据应通过相应的数据通路搬运,不应将SSBuffer用作通用数据缓存。
功能说明
存储规格:SSBuffer是3510架构AI Core内新增的核间通信存储单元,容量为3KB。SSBuffer使用独立于L1 Buffer和UB的地址空间,对应的地址空间限定符为
__ssbuf__。详情请参见SIMD BuiltIn关键字。使用范围:
- SSBuffer在分离模式的AIC核数与AIV核数之比为1:2的混合算子中,AIC核与对应AIV核可通过SSBuffer交换数据,核函数类型和AIC核数与AIV核数之比必须满足核间同步接口的约束。
访问方式:
- Mix算子是同时包含矩阵计算和矢量计算的算子类型,MIX模式是AIC核与AIV核混合运行的内核模式。
- 非MIX模式下,AIC、AIV0、AIV1各自独立占用1KB空间;MIX模式下AIC核与各AIV核共享整个3KB空间。
- 通过GetSsbufBaseAddr接口获取SSBuffer基地址。该接口返回
__ssbuf__指针,可基于基地址偏移进行读写访问。 - SSBuffer仅支持通过32字节对齐的读写指令访问,通信数据块的起始地址和访问粒度均须满足32字节对齐要求。不得对SSBuffer执行小于32字节的成员读写;访问地址超出SSBuffer范围时会触发异常。
使用约束:
- SSBuffer的初始内容不确定,读取结果不保证全为0。每次通信均应由生产者完整写入数据,消费者不得依赖SSBuffer中的历史内容。
- 数据布局必须在通信双方(AIC与AIV)保持一致,且数据不得越过SSBuffer末端地址。
- AIC和AIV启动不同任务时不能访问SSBuffer;当前任务未开启SSBuffer能力时不能访问。
典型样例说明
以下代码示例演示SSBuffer核间通信的完整用法,其中AIC核数与AIV核数之比为1:2,AIV0向AIC单向传递32字节消息。使用SSBuffer前需开启ENABLE_CV_COMM_VIA_SSBUF编译选项。
获取基地址并定义消息:
C++// 获取SSBuffer基地址,返回__ssbuf__指针;NPU域中该特殊基址可能显示为0或nil,不应作为普通空指针解引用。 __ssbuf__ void* ssbuf = AscendC::GetSsbufBaseAddr(); // 定义32字节对齐的通信消息。 struct alignas(32) SsbufferMessage { uint64_t value[4]; }; // 基于基地址偏移定位消息区域,起始偏移须32字节对齐且不越过SSBuffer末端。 __ssbuf__ uint8_t* ssbuffer = reinterpret_cast<__ssbuf__ uint8_t*>(ssbuf); __ssbuf__ SsbufferMessage* message = reinterpret_cast<__ssbuf__ SsbufferMessage*>(ssbuffer + 256);AIV核(生产者)写入消息并发布就绪标记:
C++if ASCEND_IS_AIV { // 1:2场景中仅AIV0生产本示例的消息,AIV1仍须参与模式2同步。 if (AscendC::GetSubBlockIdx() == 0) { // 生产者将完整32字节消息写入SSBuffer。 message->value[0] = 0x1122334455667788ULL; message->value[1] = 0x8877665544332211ULL; message->value[2] = 0x0123456789abcdefULL; message->value[3] = 0xfedcba9876543210ULL; } // SSBuffer访问位于Scalar流水,先建立Scalar到Vector的核内顺序,再以模式2发布AIV到AIC的就绪标记。 AscendC::SetFlag<AscendC::HardEvent::S_V>(0); AscendC::WaitFlag<AscendC::HardEvent::S_V>(0); AscendC::CrossCoreSetFlag<2, PIPE_V>(AIV_TO_AIC_FLAG); }AIC核(消费者)等待标记完成后读取消息:
C++if ASCEND_IS_AIC { // 模式2等待同一逻辑AI Core上的两个AIV均发布完成。 AscendC::CrossCoreWaitFlag<2, PIPE_M>(AIV_TO_AIC_FLAG); // 先建立Cube流水到Scalar读取的顺序,再读取SSBuffer中的消息。 AscendC::SetFlag<AscendC::HardEvent::M_S>(0); AscendC::WaitFlag<AscendC::HardEvent::M_S>(0); // 消费者按通信双方约定的布局使用message中的消息数据。 output[0] = message->value[0]; output[1] = message->value[1]; output[2] = message->value[2]; output[3] = message->value[3]; }
新增Mutex核内同步能力
特性应用场景说明
在Vector算子中,异步流水指令之间通常通过SetFlag和WaitFlag事件进行同步,例如GM到UB搬运(PIPE_MTE2)、向量计算(PIPE_V)和UB到GM搬运(PIPE_MTE3)。该方式需要显式配对事件,编码较为复杂,且受事件资源数量限制。3510架构新增Mutex能力,通过锁定和释放指定流水建立流水间的同步依赖。与SetFlag和WaitFlag相比,Mutex与其他流水解耦,可简化反向同步,并提供更多可用的同步信号量。
功能说明
可参考以下资料:
- 基础API:Mutex::Lock、Mutex::Unlock、AllocMutexID。
- C API:asc_lock、asc_unlock。
典型样例说明
mutex样例:使用Mutex实现MTE2、V流水与MTE3流水之间的同步,在未使用SetFlag、WaitFlag的情况下正确完成数据搬运与计算。
新增核间同步控制模式4
特性应用场景说明
在Mix算子中,AIV核(Vector)与AIC核(Cube)之间存在数据依赖,需要通过核间同步接口保证数据就绪后再发起后续计算。在NPU架构版本2201上,当AIC核等待同步时,AIV0与AIV1必须同时上报,即采用模式2实现AIC与所有AIV同步,因此同步粒度较粗。3510架构新增核间同步控制模式4,用于AIC与单个AIV同步,AIV0与AIV1可分别触发AIC等待,从而细化同步粒度、减少冗余等待并提高执行效率。
功能说明
可参考以下资料:
典型样例说明
cross_core_set_wait_flag样例:在Mix算子场景下,使用模式4核间同步,AIV0与AIV1分别单独触发AIC核等待,完成UB到L1 Buffer搬运与Mmad计算的流水协作。
其他增强说明
除上述特性外,3510架构还提供以下增强能力。
架构规格
- AI Core核数增加:3510架构的AI Core核数较2201架构有所增加,可支持更大的片上并行规模。
- UB容量提升:3510架构的UB总容量提升至256KB,由16个bank组成8个bank group,每个bank group包含2个bank,每个bank大小为16KB。若发生UB冲突,可参考避免UB的bank冲突解决;bank_conflict_3510样例提供了3510架构下UB Bank冲突场景的验证与分析方法。
数据类型
- 数据类型扩展:3510架构扩展了支持的数据类型,例如fp4x2_e2m1_t、fp4x2_e1m2_t、hifloat8_t、fp8_e8m0_t、fp8_e5m2_t和fp8_e4m3fn_t。具体请参见数据类型介绍。在Host端,fp4x2_e2m1_t、fp4x2_e1m2_t、hifloat8_t、fp8_e8m0_t、fp8_e5m2_t、fp8_e4m3fn_t、int4x2_t和bfloat16_t仅支持以C++模板形式定义与声明。具体请参见约束说明。
缓存管理
- 新增Cache类型:2201架构仅支持L2 Cache、DCache和ICache,3510架构新增支持NDDMA Cache。ND-DMA为多维数据搬运能力的名称,NDDMA Cache为该能力对应的缓存类型名称。多核间数据一致性说明请参见Cache一致性,完整Cache类型与功能说明请参见系统缓存概述。
- Cache控制接口增强:3510架构下的DataCacheCleanAndInvalid接口新增支持
CACHELINE_ATOMIC参数,用于在原子操作过程中保证DCache与GM的一致性。
编译选项与空间优化
- UB空间使用与编译选项:UB总容量为256KB,其中部分空间可能用于系统预留或划分为Data Cache。3510架构下Ascend C接口内部使用2KB预留UB空间,用于指令兼容或存储中间数据;2201架构下的预留UB空间为8KB。以下编译选项生效,可调整可用的UB空间大小:
--cce-disable-asc-reserved-ubuf:禁用Ascend C接口使用预留UB空间,开启后依赖预留UB空间的接口不可用,3510架构下使用预留UB空间的API范围请参考使用预留UB空间的API列表。--cce-disable-vf-stack-reserved-ubuf:禁用SIMD VF栈预留的UB空间。该选项仅在3510架构下生效。开启后可释放6KB预留空间作为普通UB使用,但编译器无法再使用该空间缓存寄存器溢出数据,需保证寄存器不溢出。
- 性能优化编译宏:
NO_OVERLAP_IN_MULTI_REPEAT可在没有地址重叠的情况下移除不必要的内存同步指令,提升基础API高维切分计算场景的性能,详情请参考内置编译宏开关。 - DCI编译选项:有关
--cce-no-dcache-flush编译选项的使用说明,请参见新增DCI(数据缓存失效)能力。