当前位置: 首页 > news >正文

CANN/asc-devkit SIMD基础算术示例

更多样例

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

  • 通过tensor高维切分计算接口中的mask连续模式,实现数据非连续计算。

    uint64_t mask = 64; // 每个迭代内只计算前64个数 AscendC::Add(dstLocal, src0Local, src1Local, mask, 4, { 1, 1, 1, 8, 8, 8 });

    结果示例如下:

    输入数据src0Local:[1 2 3 ... 512] 输入数据src1Local:[513 514 515 ... 1024] 输出数据dstLocal: [514 516 518 ... 640 undefined ... undefined 770 772 774 ... 896 undefined ... undefined 1026 1028 1030 ... 1152 undefined ... undefined 1282 1284 1286 ... 1408 undefined ... undefined]
  • 通过tensor高维切分计算接口中的mask逐比特模式,实现数据非连续计算。

    uint64_t mask[2] = { UINT64_MAX, 0 }; // mask[0]满,mask[1]空,每次只计算前64个数 AscendC::Add(dstLocal, src0Local, src1Local, mask, 4, { 1, 1, 1, 8, 8, 8 });

    结果示例如下:

    输入数据src0Local:[1 2 3 ... 512] 输入数据src1Local:[513 514 515 ... 1024] 输出数据dstLocal: [514 516 518 ... 640 undefined ... undefined 770 772 774 ... 896 undefined ... undefined 1026 1028 1030 ... 1152 undefined ... undefined 1282 1284 1286 ... 1408 undefined ... undefined]
  • 通过控制tensor高维切分计算接口的Repeat Stride参数,实现数据非连续计算。

    uint64_t mask = 128; // repeatTime设置为2,表示一共需要进行2次迭代 // src0BlkStride, src1BlkStride设置为1,表示每个迭代内src0参与计算的数据地址间隔为1个DataBlock // src0RepStride设置为16, 表示相邻迭代之间src0起始地址间隔为16个datablock AscendC::Add(dstLocal, src0Local, src1Local, mask, 2, { 1, 1, 1, 8, 16, 8 });

    结果示例如下:

    输入数据src0Local:[1 2 3 ... 512] 输入数据src1Local:[513 514 515 ... 1024] 输出数据dstLocal: [514 516 518 ...768 898 900 902 ... 1150 1152 undefined ... undefined]
  • 通过控制tensor高维切分计算接口的DataBlock Stride和Repeat Stride参数,实现数据非连续计算。

    uint64_t mask = 128; // repeatTime设置为2,表示一共需要进行2次迭代 // src0BlkStride设置为2,表示每个迭代内src0参与计算的数据地址间隔为2个datablock // src0RepStride设置为16, 表示相邻迭代之间src0起始地址间隔为16个datablock AscendC::Add(dstLocal, src0Local, src1Local, mask, 2, { 1, 2, 1, 8, 16, 8 });

    结果示例如下:

    输入数据src0Local:[1 2 3 ... 512] 输入数据src1Local:[513 514 515 ... 1024] 输出数据dstLocal: [514 516 518 ... 544 562 564 566 ... 592 610 612 614 ... 640 658 660 662 ... 688 706 708 710 ... 736 754 756 758 ... 784 802 804 806 ... 832 850 852 854 ... 880 898 900 902 ... 928 946 948 950 ... 976 994 996 998 ... 1024 1042 1044 1046 ... 1072 1090 1092 1094 ... 1120 1138 1140 1142 ... 1168 1186 1188 1190 ... 1216 1234 1236 1238 … 1264 undefined ... undefined]
  • 需要传入标量参数的API使用样例。

    #include "kernel_operator.h" constexpr int32_t BUFFER_NUM = 2; class KernelBinaryScalar { public: __aicore__ inline KernelBinaryScalar() {} __aicore__ inline void Init(GM_ADDR x, GM_ADDR z, float scalar, uint32_t totalLength, uint32_t tileNum) { this->blockLength = totalLength / AscendC::GetBlockNum(); this->scalar = scalar; this->tileNum = tileNum; ASSERT(tileNum != 0 && "tile num can not be zero!"); this->tileLength = this->blockLength / tileNum / BUFFER_NUM; xGm.SetGlobalBuffer((__gm__ DTYPE_X*)x + this->blockLength * AscendC::GetBlockIdx(), this->blockLength); zGm.SetGlobalBuffer((__gm__ DTYPE_Z*)z + this->blockLength * AscendC::GetBlockIdx(), this->blockLength); pipe.InitBuffer(inQueueX, BUFFER_NUM, this->tileLength * sizeof(DTYPE_X)); pipe.InitBuffer(outQueueZ, BUFFER_NUM, this->tileLength * sizeof(DTYPE_Z)); } __aicore__ inline void Process() { int32_t loopCount = this->tileNum * BUFFER_NUM; for (int32_t i = 0; i < loopCount; i++) { CopyIn(i); Compute(i); CopyOut(i); } } private: __aicore__ inline void CopyIn(int32_t progress) { AscendC::LocalTensor<DTYPE_X> xLocal = inQueueX.AllocTensor<DTYPE_X>(); AscendC::DataCopy(xLocal, xGm[progress * this->tileLength], this->tileLength); inQueueX.EnQue(xLocal); } __aicore__ inline void Compute(int32_t progress) { AscendC::LocalTensor<DTYPE_X> xLocal = inQueueX.DeQue<DTYPE_X>(); AscendC::LocalTensor<DTYPE_Z> zLocal = outQueueZ.AllocTensor<DTYPE_Z>(); AscendC::Adds(zLocal, xLocal, (DTYPE_X)scalar, this->tileLength); outQueueZ.EnQue<DTYPE_Z>(zLocal); inQueueX.FreeTensor(xLocal); } __aicore__ inline void CopyOut(int32_t progress) { AscendC::LocalTensor<DTYPE_Z> zLocal = outQueueZ.DeQue<DTYPE_Z>(); AscendC::DataCopy(zGm[progress * this->tileLength], zLocal, this->tileLength); outQueueZ.FreeTensor(zLocal); } private: AscendC::TPipe pipe; AscendC::TQue<AscendC::TPosition::VECIN, BUFFER_NUM> inQueueX; AscendC::TQue<AscendC::TPosition::VECOUT, BUFFER_NUM> outQueueZ; AscendC::GlobalTensor<DTYPE_X> xGm; AscendC::GlobalTensor<DTYPE_Z> zGm; float scalar; uint32_t blockLength; uint32_t tileNum; uint32_t tileLength; }; extern "C" __global__ __aicore__ void binary_scalar_simple_kernel(GM_ADDR x, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling) { GET_TILING_DATA(tilingData, tiling); KernelBinaryScalar op; op.Init(x, z, tilingData.scalar, tilingData.totalLength, tilingData.tileNum); if (TILING_KEY_IS(1)) { op.Process(); } }

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

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

http://www.jsqmd.com/news/851553/

相关文章:

  • 高性价比白酒送礼推荐:毛铺紫荞领衔,适配长辈、商务全场景 - 资讯焦点
  • 天邑TY1208-Z刷机后必做的5项优化设置(去广告、开权限、提速技巧全在这)
  • 3步掌握waifu2x-caffe:从低质图像到高清艺术的AI魔法
  • 2026年深圳市白蚁防治行业专业评估前五排名 - 资讯焦点
  • 别再为论文付费发愁!手把手教你用Sci-Hub域名绕过IEEE Xplore付费墙
  • 企业级应用如何借助Taotoken实现大模型API的容灾与负载均衡
  • 使用OpenClaw连接Taotoken实现自动化工作流的配置要点
  • csgo游戏搬砖,长期靠谱
  • Axure RP中文界面配置指南:3步完成专业原型设计工具本地化
  • 自家腌料没特色?姜师傅烤鸭、铁板鸭腌料味道好轻松帮你锁客 - 品牌2025
  • 电磁阀清洁度分析设备选型指南:西恩士优质厂家揭秘 - 工业设备研究社
  • 如何在Windows电脑上直接安装安卓应用:APK-Installer完全指南
  • ​ 2026平价白酒推荐排行榜:毛铺紫荞出圈,家用宴请皆合适 - 资讯焦点
  • 告别Camera2的复杂!用CameraX 1.3.0-alpha04轻松搞定Android外接USB摄像头
  • 晚上追剧解馋外卖推荐|外卖必点榜藏着本地超好吃的解馋美食 - 资讯焦点
  • 2026年南京特种设备许可证咨询代办公司最新推荐榜:制造/安装/改造维修许可证咨询代办 - 海棠依旧大
  • Twoyi核心组件解析:从UI渲染引擎到ROM管理的技术实现
  • 从Layout到仿真:一个硬件工程师用Allegro Sigrity搞定SI/PI/EMI的真实工作流
  • 在广东做软文发布、新闻稿发稿?选对服务商少走90%的弯路! - 代码非世界
  • Base64在不同项目中运行结果不一致问题
  • 同行想做爆款烤鸭,姜师傅升级进修培训闭眼选就行 - 品牌2025
  • 数字电路中的‘裁判’:深入拆解4位数值比较器(74LS85)的工作原理与级联技巧
  • 终极SPT-AKI存档编辑器:如何5分钟成为逃离塔科夫单机版掌控者
  • 青岛口碑少儿英语机构排行 师资与课程维度实测对比 - 真知灼见33
  • 深度解析mNetAssist:高效网络调试工具的3种协议测试实战指南
  • 不踩雷的夏夜夜宵外卖怎么选?看过外卖必点榜再下单省时间不踩坑 - 资讯焦点
  • MASA模组中文汉化包:5分钟解决Minecraft英文界面困扰的终极指南
  • 2026年重庆家政服务公司最新推荐榜:月嫂/住家保姆/育儿嫂服务 - 海棠依旧大
  • 别再死记硬背F检验公式了!用Python(scipy.stats)5分钟搞定方差分析实战
  • 安卓手机内存总是不够?APK 瘦身与存储清理终极指南(2026)