news 2026/7/17 9:56:51

Ascend C TSCM简介

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ascend C TSCM简介

TSCM简介

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

Vector和Cube之间通过队列(Queue)完成任务间通信和同步。TSCM是数据通路的目的地在TSCM Position时,用来管理执行队列相关操作、相关资源的数据结构。TSCM与TQueBind,TQue属于相同类型结构。TSCM定义如下:

template <TPosition pos, int32_t depth, auto mask = 0> using TSCM = TQueBind<pos, TPosition::TSCM, depth, mask>;

表1模板参数介绍

参数名称

含义

pos

队列逻辑位置,可以为VECIN、GM。关于TPosition的具体介绍请参考TPosition。

depth

队列的深度表示该队列可以连续进行入队/出队的次数,在代码运行时,对同一个队列有n次连续的EnQue(中间没有DeQue),那么该队列的深度就需要设置为n。

注意,这里的队列深度和double buffer无关,队列机制用于实现流水线并行,double buffer在此基础上进一步提高流水线的利用率。即使队列的深度为1,仍可以开启double buffer。

队列的深度设置为1时,编译器对这种场景做了特殊优化,性能通常更好,推荐设置为1

mask

[!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对象数量有关。L1 Buffer(TSCM)从UB(VECIN)发起的Buffer块数量与Matmul对象数量之和最大为10个。不允许申请的TSCM Buffer超出规格限制,超出规格可能会引起未定义行为。

如下是一个简单的使用示例:

TSCM<TPosition::VECIN, 1> tscm; for () { auto scmTensor = tscm.AllocTensor<float>(); // 在搬运数据从UB->L1 Buffer(TSCM)前分配Buffer DataCopy(scmTensor, ubLocal, 1024); // 将UB数据搬运至L1 Buffer(TSCM),准备用于Matmul计算 tscm.EnQue(scmTensor); //搬运完成在Matmul计算前,EnQue/DeQue LocalTensor<float> scmLocal = tscm.DeQue<float>(); mm.SetTensorA(scmLocal); mm.SetTensorB(gm_b); mm.IterateAll(gm_c); tscm.FreeTensor(scmLocal); // Matmul计算完成后,释放tensor }

与高阶API Matmul配合使用,调用示例如下:

{ typedef matmul::MatmulType<AscendC::TPosition::TSCM, CubeFormat::NZ, half, true, LayoutMode::NONE, false, AscendC::TPosition::VECIN> A_TYPE; typedef matmul::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, half> B_TYPE; typedef matmul::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, float> C_TYPE; typedef matmul::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, float> BIAS_TYPE; matmul::Matmul<A_TYPE, B_TYPE, C_TYPE, BIAS_TYPE> mm1; constexpr uint32_t M = 32; constexpr uint32_t N = 32; constexpr uint32_t K = 32; AscendC::GlobalTensor<half> aGlobal; AscendC::GlobalTensor<half> bGlobal; AscendC::GlobalTensor<float> cGlobal; AscendC::GlobalTensor<float> 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::TSCM<AscendC::TPosition::VECIN, 1> scm; AscendC::TQue<AscendC::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.AllocTensor<half>(); auto ubTensor = qIn.AllocTensor<half>(); AscendC::Nd2NzParams intriParams; DataCopy(ubTensor, aGlobal, M * K); qIn.EnQue(ubTensor); AscendC::LocalTensor<half> ubLocal = qIn.DeQue<half>(); AscendC::DataCopy(scmTensor, ubLocal, intriParams); scm.EnQue(scmTensor); AscendC::LocalTensor<half> scmLocal = scm.DeQue<half>(); mm1.SetTensorA(scmLocal); mm1.SetTensorB(bGlobal); mm1.IterateAll(cGlobal); scm.FreeTensor(scmLocal); qIn.FreeTensor(ubLocal); }

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 9:55:26

Sysprep工具详解:Windows系统镜像标准化部署指南

1. Sysprep工具概述与核心价值Sysprep&#xff08;System Preparation Tool&#xff09;是微软官方提供的系统准备工具&#xff0c;主要用于标准化Windows操作系统镜像的创建过程。作为IT管理员在大规模部署Windows时的瑞士军刀&#xff0c;它通过移除计算机特定信息&#xff0…

作者头像 李华
网站建设 2026/7/17 9:48:40

人形机器人产业化核心:从能动到能用的关键技术攻坚

1. 这份报告不是“预测未来”&#xff0c;而是拆解当下人形机器人产业的真实肌理“2025-2026年人形机器人产业发展研究报告”——这个标题听起来像一份标准的行业白皮书&#xff0c;但如果你真把它当成PPT里几页趋势图、几个增长率数字就翻篇&#xff0c;那等于亲手把一张通往真…

作者头像 李华
网站建设 2026/7/17 9:48:02

删死代码不是一行行找——从根节点往下砍

一句话: 项目里堆了大量没人调的函数&#xff0c;分散各处一个一个删容易漏。正确做法&#xff1a;找到"根节点"——最上层入口函数有没有人调。根没人调→整条调用链都是死的&#xff0c;从根往下砍&#xff0c;每个节点确认无依赖再删。适合谁读&#xff1a;适合嵌…

作者头像 李华
网站建设 2026/7/17 9:47:05

Python自动化脚本:解决Selenium中Chrome与Chromedriver版本匹配难题

1. 项目概述&#xff1a;告别繁琐的手动操作 每次Chrome浏览器一更新&#xff0c;Selenium脚本就罢工&#xff0c;然后就得去官网手动找对应版本的Chromedriver——这个场景对做Web自动化测试或者数据抓取的朋友来说&#xff0c;简直太熟悉了。手动操作不仅打断工作流&#xff…

作者头像 李华
网站建设 2026/7/17 9:46:28

SiCMOSFET国产化进程与关键技术突破

1. SiCMOSFET国产化的行业背景与技术价值 碳化硅金属氧化物半导体场效应晶体管&#xff08;SiCMOSFET&#xff09;作为第三代半导体材料的代表&#xff0c;正在重塑功率电子行业的格局。与传统硅基器件相比&#xff0c;SiC器件具有三大突破性优势&#xff1a;击穿电场强度提升1…

作者头像 李华
网站建设 2026/7/17 9:45:00

GitHub中文界面终极指南:5分钟让GitHub全面中文化的完整教程

GitHub中文界面终极指南&#xff1a;5分钟让GitHub全面中文化的完整教程 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 还在为GitHub…

作者头像 李华