Ascend C TQue队列简介

📅 发布时间:2026/7/17 16:12:50
Ascend C TQue队列简介 TQue简介【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit流水任务之间通过队列Queue完成任务间通信和同步。TQue是用来执行队列相关操作、管理相关资源的数据结构。TQue继承自TQueBind父类继承关系如下模板参数template TPosition pos, int32_t depth, auto mask 0 class TQue{...};表1TQue模板参数介绍参数名称含义pos队列逻辑位置可以为VECIN、VECOUT、A1、A2、B1、B2、CO1、CO2。关于TPosition的具体介绍请参考TPosition。depth队列的深度表示该队列可以连续进行入队/出队的次数在代码运行时对同一个队列有n次连续的EnQue中间没有DeQue那么该队列的深度就需要设置为n。注意这里的队列深度和double buffer无关队列机制用于实现流水线并行double buffer在此基础上进一步提高流水线的利用率。即使队列的深度为1仍可以开启double buffer。非Tensor原地操作的场景下队列的深度设置为1时编译器对这种场景做了特殊优化性能通常更好推荐设置为1。Tensor原地操作的场景下需要设置为0。如下样例中队列没有连续入队队列的深度设置为1。a1 que.AllocTensor(); que.EnQue(a1); a1 que.DeQue(); que.FreeTensor(a1);如下样例中队列连续2次入队队列的深度应设置为2仅在极少数preload场景比如连续搬入两份数据计算处理一份完成后再搬入一份然后计算处理提前搬入的一份...可能会使用。其他情况下均不推荐depth 2 。a1 que.AllocTensor(); a2 que.AllocTensor(); que.EnQue(a1); que.EnQue(a2); a1 que.DeQue(); a2 que.DeQue(); que.FreeTensor(a1); que.FreeTensor(a2);maskmask是int类型时采用比特位表达信息bit 0位为1表示数据格式从ND转换为NZTPosition仅支持A1或B1bit 1位为1表示数据格式从NZ转换为NDTPosition仅支持CO2。支持的型号如下Atlas 推理系列产品 AI Coremask是const TQueConfig*类型时TQueConfig结构定义和参数说明如下调用示例见调用示例:struct TQueConfig { bool nd2nz false; // true代表数据格式从ND转换为NZ仅支持TPosition为A1或B1默认为false bool nz2nd false; // true代表数据格式从NZ转换为ND仅支持TPosition为CO2默认为false bool scmBlockGroup false; // TSCM相关参数预留参数默认为false uint32_t bufferLen 0; // 与InitBuffer时输入的len参数保持一致可以在编译期做性能优化传0表示在InitBuffer时做资源分配。 uint32_t bufferNumber 0; // 与InitBuffer时输入的num参数保持一致可以在编译期做性能优化传0表示在InitBuffer时做资源分配。 uint32_t consumerSize 0; // 预留参数 TPosition consumer[8] {}; // 预留参数 bool enableStaticEvtId false; // 预留参数 bool enableLoopQueue false; // 预留参数 };上述ND、NZ格式转换相关参数支持的型号如下Atlas 推理系列产品 AI CoreTQue Buffer限制由于TQue分配的Buffer存储着同步事件eventID故同一个TPosition上TQue Buffer的数量与硬件的同步事件eventID有关。针对Atlas 训练系列产品eventID的数量为4Atlas 推理系列产品AI CoreeventID的数量为8Atlas 推理系列产品Vector CoreeventID的数量为8Atlas A2 训练系列产品/Atlas A2 推理系列产品eventID的数量为8Atlas A3 训练系列产品/Atlas A3 推理系列产品eventID的数量为8Atlas 200I/500 A2 推理产品eventID的数量为8QUE的Buffer数量最大也分别为8个或4个即能插入的同步事件的个数为8个或4个。当用TPipe的InitBuffer申请TQue时会受到Buffer数量的限制TQue能申请到的最大个数分别为8个或4个。如果同时使用的QUE Buffer超出限制则无法再申请TQue。如果想要继续申请可以调用FreeAllEvent接口来释放一些暂时不用的TQue。在使用完对应TQue后用该接口释放对应队列中的所有事件之后便可再次申请TQue。样例如下不开启double buffer// 能申请的VECIN position上的buffer数量最大为8。如果超出该限制在后续使用AllocTensor/FreeTensor可能会出现分配资源失败。故当不开启double buffer时此时最多能申请8个TQue。 AscendC::TPipe pipe; int len 1024; AscendC::TQueAscendC::TPosition::VECIN, 1 que0; AscendC::TQueAscendC::TPosition::VECIN, 1 que1; AscendC::TQueAscendC::TPosition::VECIN, 1 que2; AscendC::TQueAscendC::TPosition::VECIN, 1 que3; AscendC::TQueAscendC::TPosition::VECIN, 1 que4; AscendC::TQueAscendC::TPosition::VECIN, 1 que5; AscendC::TQueAscendC::TPosition::VECIN, 1 que6; AscendC::TQueAscendC::TPosition::VECIN, 1 que7; pipe.InitBuffer(que0, 1, len); pipe.InitBuffer(que1, 1, len); pipe.InitBuffer(que2, 1, len); pipe.InitBuffer(que3, 1, len); pipe.InitBuffer(que4, 1, len); pipe.InitBuffer(que5, 1, len); pipe.InitBuffer(que6, 1, len); pipe.InitBuffer(que7, 1, len);开启double buffer// 如果开启double buffer此时每一个TQue分配的内存块个数为2故最多只能申请4个TQue。 AscendC::TPipe pipe; int len 1024; AscendC::TQueAscendC::TPosition::VECIN, 1 que0; AscendC::TQueAscendC::TPosition::VECIN, 1 que1; AscendC::TQueAscendC::TPosition::VECIN, 1 que2; AscendC::TQueAscendC::TPosition::VECIN, 1 que3; pipe.InitBuffer(que0, 2, len); pipe.InitBuffer(que1, 2, len); pipe.InitBuffer(que2, 2, len); pipe.InitBuffer(que3, 2, len);多次申请TQue// 如果TQue个数已达最大值可以调用FreeAllEvent接口来继续申请TQue。 AscendC::TPipe pipe; int len 1024; AscendC::TQueAscendC::TPosition::VECIN, 1 que0; pipe.InitBuffer(que0, 1, len); AscendC::LocalTensorhalf tensor1 que0.AllocTensorhalf(); que0.EnQue(tensor1); tensor1 que0.DeQuehalf(); // 将tensor从VECOUT的Queue中搬出 que0.FreeTensorhalf(tensor1); que0.FreeAllEvent(); // 释放que0的所有同步事件之后可继续申请TQue AscendC::TQueAscendC::TPosition::VECIN, 1 que1; pipe.InitBuffer(que1, 1, len);调用示例以下用例通过传入TQueConfig开启bufferNumber的编译期计算。vector算子不涉及数据格式的转换所以nd2nz和nz2nd是false。// 用户自定义的构造TQueConfig的元函数 __aicore__ constexpr AscendC::TQueConfig GetMyTQueConfig(bool nd2nzIn, bool nz2ndIn, bool scmBlockGroupIn, uint32_t bufferLenIn, uint32_t bufferNumberIn, uint32_t consumerSizeIn, const AscendC::TPosition consumerIn[]) { return { .nd2nz nd2nzIn, .nz2nd nz2ndIn, .scmBlockGroup scmBlockGroupIn, .bufferLen bufferLenIn, .bufferNumber bufferNumberIn, .consumerSize consumerSizeIn, .consumer {consumerIn[0], consumerIn[1], consumerIn[2], consumerIn[3], consumerIn[4], consumerIn[5], consumerIn[6], consumerIn[7]} }; } static constexpr AscendC::TPosition tp[8] {AscendC::TPosition::MAX, AscendC::TPosition::MAX, AscendC::TPosition::MAX, AscendC::TPosition::MAX, AscendC::TPosition::MAX, AscendC::TPosition::MAX, AscendC::TPosition::MAX, AscendC::TPosition::MAX}; static constexpr AscendC::TQueConfig conf GetMyTQueConfig(false, false, false, 0, 1, 0, tp); ... AscendC::TPipe pipe; AscendC::TQueAscendC::TPosition::VECIN, 1, conf inQueueX; AscendC::TQueAscendC::TPosition::VECOUT, 1, conf outQueue; pipe.InitBuffer(inQueueX, 1, dataSize * sizeof(srcType)); pipe.InitBuffer(outQueue, 1, dataSize * sizeof(int8_t));【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考