尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
CANN/asc-devkit TSCM简介
TSCM简介Vector和Cube之间通过队列Queue完成任务间通信和同步。TSCM是数据通路的目的地在TSCM Position时用来管理执行队列相关操作、相关资源的数据结构。TSCM与TQueBindTQue属于相同类型结构。TSCM定义如下template TPosition pos, int32_t depth, auto mask 0 using TSCM TQueBindpos, TPosition::TSCM, depth, mask;表 1模板参数介绍参数名称含义pos队列逻辑位置可以为VECIN、GM。关于TPosition的具体介绍请参考TPosition。depth队列的深度表示该队列可以连续进行入队/出队的次数在代码运行时对同一个队列有n次连续的EnQue中间没有DeQue那么该队列的深度就需要设置为n。注意这里的队列深度和double buffer无关队列机制用于实现流水线并行double buffer在此基础上进一步提高流水线的利用率。即使队列的深度为1仍可以开启double buffer。队列的深度设置为1时编译器对这种场景做了特殊优化性能通常更好推荐设置为1。如下样例中队列没有连续入队队列的深度设置为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位为预留参数。bit 1位为预留参数。bit 2位为0时VECTOR0与VECTOR1映射到CUBE上的内存位置错开为1时VECTOR0与VECTOR1映射到CUBE上的内存位置相同。mask是const TQueConfig*类型时TQueConfig结构定义和参数说明如下。struct TQueConfig { bool nd2nz false; // 不支持默认为false bool nz2nd false; // 不支持默认为false bool scmBlockGroup false; // tscm相关参数为falseVECTOR0与VECTOR1映射到CUBE上的内存位置错开为true时VECTOR0与VECTOR1映射到CUBE上的内存位置相同。 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; // 预留参数 };[!NOTE]说明TSCM通过using定义TSCM为TQueBind目的地址为TSCM Position时的别名。支持AllocTensor/EnQue/DeQue/FreeTensor接口。必须严格按照AllocTensor-EnQue-DeQue-FreeTensor的操作执行完整的生命周期且配对使用。但TSCM并不需要支持TQueBind的所有接口。不支持VacantInQue/HasTensorInQue/GetTensorCountInQue/HasIdleBuffer。由于TSCM分配的Buffer中存储着同步事件eventID且该结构伴随着与Cube类高阶API如Matmul高阶API宏函数调用方式)共同使用故同一个TPosition上TSCM Buffer的数量与硬件的同步事件eventID以及Matmul对象数量有关。TSCM从VECIN发起的Buffer块数量与Matmul对象数量之和最大为10个。不允许申请的TSCM Buffer超出规格限制超出规格可能会引起未定义行为。如下是一个简单的使用示例TSCMTPosition::VECIN, 1 tscm; for () { auto scmTensor tscm.AllocTensorfloat(); // 在搬运数据从UB-TSCM前分配Buffer DataCopy(scmTensor, ubLocal, 1024); // 将UB数据搬运至TSCM准备用于Matmul计算 tscm.EnQue(scmTensor); //搬运完成在Matmul计算前EnQue/DeQue LocalTensorfloat scmLocal tscm.DeQuefloat(); mm.SetTensorA(scmLocal); mm.SetTensorB(gm_b); mm.IterateAll(gm_c); tscm.FreeTensor(scmLocal); // Matmul计算完成后释放tensor }与高阶API Matmul配合使用调用示例如下{ typedef matmul::MatmulTypeAscendC::TPosition::TSCM, CubeFormat::NZ, half, true, LayoutMode::NONE, false, AscendC::TPosition::VECIN A_TYPE; typedef matmul::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, half B_TYPE; typedef matmul::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, float C_TYPE; typedef matmul::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, float BIAS_TYPE; matmul::MatmulA_TYPE, B_TYPE, C_TYPE, BIAS_TYPE mm1; constexpr uint32_t M 32; constexpr uint32_t N 32; constexpr uint32_t K 32; AscendC::GlobalTensorhalf aGlobal; AscendC::GlobalTensorhalf bGlobal; AscendC::GlobalTensorfloat cGlobal; AscendC::GlobalTensorfloat biasGlobal; aGlobal.SetGlobalBuffer(reinterpret_cast__gm__ half *(aGM), M * K); bGlobal.SetGlobalBuffer(reinterpret_cast__gm__ half *(bGM), K * N); cGlobal.SetGlobalBuffer(reinterpret_cast__gm__ float *(cGM), M * N); TCubeTiling tiling; AscendC::TPipe pipe; AscendC::TSCMAscendC::TPosition::VECIN, 1 scm; AscendC::TQueAscendC::TPosition::VECIN, 1 qIn; pipe.InitBuffer(scm, 1, M * K * sizeof(half)); pipe.InitBuffer(qIn, 1, M * K * sizeof(half)); REGIST_MATMUL_OBJ(pipe, workspaceGM, mm1, tiling); auto scmTensor scm.AllocTensorhalf(); auto ubTensor qIn.AllocTensorhalf(); AscendC::Nd2NzParams intriParams; DataCopy(ubTensor, aGlobal, M * K); qIn.EnQue(ubTensor); AscendC::LocalTensorhalf ubLocal qIn.DeQuehalf(); AscendC::DataCopy(scmTensor, ubLocal, intriParams); scm.EnQue(scmTensor); AscendC::LocalTensorhalf scmLocal scm.DeQuehalf(); mm1.SetTensorA(scmLocal); mm1.SetTensorB(bGlobal); mm1.IterateAll(cGlobal); scm.FreeTensor(scmLocal); qIn.FreeTensor(ubLocal); }创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

企业微信第三方应用开发:SuiteTicket高可用接收与防脑裂架构

企业微信第三方应用开发:SuiteTicket高可用接收与防脑裂架构

在企业微信第三方服务商(ISV)应用的开发中,suite_ticket 是整个系统的“命门”。官方服务器会每隔 10 分钟,定时向服务商配置的指令回调 URL 推送最新的 suite_ticket。由于获取核心的 suite_access_token 强依赖于这个票据&#…

📅 2026/11/8 1:41:07
OpenCode+Copilot:国产化AI编程工作流实战指南

OpenCode+Copilot:国产化AI编程工作流实战指南

1. 这不是“平替”,是重新定义开发工作流的生产力组合你有没有过这种体验:深夜改一个棘手的遗留系统 Bug,翻了三遍文档、查了五次 Stack Overflow,最后卡在某个边界条件上动弹不得;或者接到一个需求,要从零…

📅 2026/10/19 5:43:36
还在靠群里“接龙“管巡检?我用飞算 JavaAI 帮我串起了整改全闭环

还在靠群里“接龙“管巡检?我用飞算 JavaAI 帮我串起了整改全闭环

一、群消息式的巡检,查一次就得翻半天聊天记录 朋友在一家连锁餐饮品牌做区域运营。每周巡店,巡检员发现问题后拍张照发群里 店长,店长回复"收到",改完之后再回一句"已处理"。 问题出在复查时——翻群聊历史找…

📅 2026/10/6 0:55:00
MORE NEWS

更多资讯

📰

高压电工证是ade么含金量高吗?跨省转证怎么操作

高压电工证是ade么含金量高吗?跨省转证怎么操作 之前考的证在外省能不能转过来?这个问题困扰了很多人,尤其是像你这样已经拿到高压电工证,但想换个城市发展的人。高压电工证是ade么?是不是只能在本地用?这其实关系到证书的 含金量…

📰

低压电工证复审实超题行业前景与薪资待遇

低压电工证复审实操题千万别踩坑,实操考试心里没底怕挂科 你是不是正愁低压电工证复审实操题怎么过?明明平时工作都干得顺手,一到考试现场就手忙脚乱?这正是很多电工在复审时遇到的真实写照。别急,今天我以安阳一位在职建筑工人的视角,带你深入拆解低压…

📰

双鸭山市考电工证通过率揭秘:别让培训费打水漂

双鸭山市考电工证通过率揭秘:别让培训费打水漂 怕考不过白交培训费?双鸭山市考电工证的通过率你真的了解吗?很多准备报名的人,最担心的就是花了钱,最后却因为没通过考试,白白浪费时间和金钱。今天就来给大家扒一扒,双鸭山市电工证考试的通过率、报名注…

📰

周口电工证报名时间怎么考 郑州报考避坑指南帮你少走弯路

周口电工证报名时间怎么考 郑州报考避坑指南帮你少走弯路 你是不是也遇到过这种情况:想报电工证,但不知道去哪报名,怕被中介骗钱?这事儿我太懂了,前年我一个老同学就因为报了假机构的电工证,结果花了两三千块,最后连报名都没上。今天就用我的亲身经历…

📰

电工证证件照照片千万别踩坑 3个细节决定你能不能顺利考证

电工证证件照照片千万别踩坑 3个细节决定你能不能顺利考证 怕考不过白交培训费?现在报名电工证考试,很多人第一反应就是怕交了钱考不过,白忙一场。其实,只要选对培训机构、准备充分、证件照照片合格,就完全不用担心。尤其是【电工证证件照照片】这一步…

📰

领导让我考电工证怎么考 电子证书怎么查 工地太忙怎么办

领导让我考电工证怎么考 电子证书怎么查 工地太忙怎么办 工地太忙根本没时间复习考试,领导突然安排你考电工证,你心里一紧,怕耽误工期,又怕考不过,还怕证书不靠谱。现在市面上的电工证五花八门,到底该考哪个?电子证书又怎么查?别急,这篇文章帮你理…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬