Ascend C UnitFlag特性说明 📅 2026/7/16 22:41:06 # UnitFlag【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit特性说明unitFlag的核心功能体现为Mmad和FixPipe接口引入了单元标志unit-flag机制通过以内存块为粒度实现精细化的数据同步从而有效降低同步延迟提升系统整体性能。当UnitFlag开关打开后对于L0C Buffer中的每个内存块512B提供一个单元标志位用于指示该块是否可读或可写。Mmad和Fixpipe接口设置unitFlag值为2/3后系统会启动单元标志位。当mmadParams.unitFlag 20b10开启unitFlag功能在硬件执行完指令后不改变单元标志位对于写操作Mmad接口如果单元标志位0则硬件直接写入L0C Buffer否则如果单元标志位为1则写操作会等待直到单元标志变为0执行完成后将单元标志位保持为0对于读操作Fixpipe接口如果单元标志位1则硬件直接读取L0C Buffer否则如果单元标志位为0则读操作为等待直到单元标志变为1执行完成后将单元标志位保持为1当mmadParams.unitFlag 30b11开启unitFlag功能在硬件执行完指令后改变单元标志位对于写操作Mmad接口如果单元标志位0则硬件直接写入L0C Buffer否则如果单元标志位为1则写操作会等待直到单元标志变为0执行完成后将单元标志位设置成1对于读操作Fixpipe接口如果单元标志位1则硬件直接读取L0C Buffer否则如果单元标志位为0则读操作为等待直到单元标志变为1执行完成后将单元标志位设置成0根据上述特性如果用户在进行A矩阵[128, 1024]、B矩阵为[1024, 128]的矩阵乘计算时需要沿着K轴进行迭代循环假设每次迭代K长度为128则需要迭代8次此时8次Mmad对应1次Fixpipe操作前7次Mmad的unitFlag都设置成2写入后将单元标记位始终为0保证后续Mmad可以写入L0C Buffer最后1次Mmad设置成3写入后将单元标志位设置成1保证Fixpipe可以读取L0C BufferFixpipe的unitFlag设置为3读取后将单元标记位设置为0保证后续Mmad接口可以顺利写入L0C Buffer数据如果用户需要单次Mmad的结果分多次搬出时譬如Mmad计算结果的L0C Buffer为M(128) x N(256)沿N轴分两次搬出这样一次Mmad会对应两次FixpipeMmad的时候需要设置unitFlag 3保证Fixpipe可以读取L0C Buffer数据每一次Fixpipe的unitFlag都设置为3读取后将单元标记位设置为0保证后续其他Mmad接口在复用这块L0C Buffer地址时可以顺利写入数据当开启unitFlag后Mmad和Fixpipe会对同一块分形的L0C Buffer进行读写操作因此Mmad计算和Fixpipe保持一致的读写顺序有助于获得更优的性能表现。在调用Mmad接口时需要通过**SetMMColumnMajor/SetMMRowMajor**接口设置Mmad的计算方向。当Fixpipe开启了NZ2ND或ChannelMerge等layout变换时需将Mmad的计算方向设置为N方向优先即调用SetMMRowMajor()反之若未使用这些特性则应将计算方向设置为M方向优先即调用SetMMColumnMajor()。图1Mmad和Fixpipe同时沿M方向写/读特性约束Mmad和Fixpipe接口均提供了unitFlag参数来控制该功能的启用需确保两者同步开启才能正常生效。当希望控制同一块L0C Buffer内存空间能持续只被多条Mmad或多条Fixpipe指令操作时需将对应的前n-1条指令的unitFlag值设置为2维持被操作内存空间的持续占用状态最后一条指令设置为3解除被占用状态。当启用unitFlag功能后建议Mmad的计算数据量与Fixpipe搬出的数据量保持一致。若Mmad计算了大块数据M × N 128 × 128但Fixpipe只搬出了其中一部分数据M × N 64 × 64则可能会导致执行异常可以通过SetFixPipeConfig()接口重置L0C Buffer的状态详细操作方式见下方示例。沿K轴迭代循环使用示例片段// 调用kRound次Mmad for (auto kIndex 0; kIndex kRound; kIndex) { if (kIndex ! kRound - 1) { // 前kRound-1次迭代设置为2保证Mmad在K迭代循环中可以一直写入L0C Buffer mmadParams.unitFlag 2; } else { // 最后一次迭代设置为3将单元标志位设成1,保证Fixpipe可以读L0C Buffer mmadParams.unitFlag 3; } AscendC::Mmad(c, a, b, mmadParams); if ((m / ALIGN_NUM) * (n / ALIGN_NUM) LIMIT_MNSIZE) { AscendC::PipeBarrierPIPE_M(); } } // Fixpipe一次搬出 // Fixpipe的unitFlag设置为3读取后将单元标记位设置为0保证后续Mmad接口可以顺利写入L0C Buffer数据 fixpipeParams.unitFlag 3; AscendC::Fixpipe(cGM, c, fixpipeParams);开启与不开启unitFlag功能的完整示例UnitFlag示例表1性能示例说明以输入数据类型half为例无业务实测表示忽略指令的前后序操作只考虑单指令性能包含带宽延迟等开销MNKUnitFlagLOOP_COUNTMmad理论值cycleMmad无业务实测值cycle128256512Enable841564209128256512Disable841564225128128512Enable821082172128128512Disable821082172【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考