新闻详情

新闻详情

首页 / 资讯中心 / 详情

CANN pyasc 算子开发:asc.language.basic.set_atomic_type 原子操作数据类型设置接口详解

发布时间:2026/9/19 4:07:45来源:尧图网络
CANN pyasc 算子开发:asc.language.basic.set_atomic_type 原子操作数据类型设置接口详解
CANN pyasc 算子开发asc.language.basic.set_atomic_type 原子操作数据类型设置接口详解【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc在 CANN pyasc 项目中asc.language.basic.set_atomic_type是基础basic指令集中用于设定原子操作数据类型的接口它与set_atomic_add、set_atomic_max、set_atomic_min配合控制 VECOUT/L0C/L1 到 Global MemoryGM数据传输时的原子累加、原子比较行为。阅读本文后你将掌握该接口的签名语义、支持的数据类型范围、与原子操作指令族的配合方式以及从 Python 前端到 Ascend C 代码生成的完整底层实现链路并能在自己的算子 kernel 中正确使用和及时复位原子状态。接口定位原子操作在 pyasc 中的角色昇腾 AI 处理器上矢量计算单元Vector Core的结果通常先写入本地存储VECOUT、L0C、L1再通过数据搬运指令写回 GM。当多个核block或多次搬运写向同一片 GM 地址时会产生读改写竞争后写的核可能覆盖先写核的结果。原子操作Atomic Operation正是解决这类问题的硬件机制——它在搬运的同时对 GM 上的目标数据执行读-改-写保证累加、求最大值、求最小值等操作的多核并发正确性。pyasc 将 Ascend C 的原子操作指令族映射为 Python 原生语法接口全部位于python/asc/language/basic/模块并在 basic/init.py 中统一导出set_atomic_add(dtype)开启后续搬运的原子累加set_atomic_max(dtype)开启原子最大值比较set_atomic_min(dtype)开启原子最小值比较set_atomic_type(dtype)设定原子操作的数据类型set_atomic_none()清空原子操作状态关闭所有原子操作。set_atomic_type在该指令族中承担类型配置的职责——它本身不决定具体执行加法还是比较而是为后续的原子操作统一指定参与运算的数据类型。函数签名与语义原文档给出的接口定义为asc.language.basic.set_atomic_type() → None对应的 Ascend C 函数原型为template typename T __aicore__ inline void SetAtomicType();其语义为通过设置模板参数来设定原子操作使用的数据类型。该接口无返回值所有行为由模板类型参数Python 侧传入的dtype决定。从源码结构看Python 侧的实现位于 set_atomic.pyoverload def set_atomic_type() - None: ... require_jit set_common_docstring(api_nameset_atomic_type) def set_atomic_type(dtype: DataType) - None: builder global_builder.get_ir_builder() builder.create_asc_SetAtomicTypeOp(dtype.to_ir())可以看到该接口不是普通的运行时函数而是被require_jit修饰的kernel 侧编译期指令调用时必须处于asc.jit编译的 kernel 上下文中通过全局 IR builder 创建asc_SetAtomicTypeOp指令节点dtype会被转换为 IR 中的类型属性TypeAttr最终作为模板参数下发到生成的 Ascend C 代码中。参数说明dtype 支持的数据类型dtype为原子操作使用的数据类型由 Python 前端指定支持的取值如下取值说明对应模板类型asc.float1616 位半精度浮点halfasc.float3232 位单精度浮点floatasc.int3232 位有符号整型int32_tasc.half16 位半精度浮点与asc.float16等价half其中asc.float16与asc.half指向同一 16 位浮点类型两种写法均可使用。这一点在单元测试中也有体现test_set_atomic.py 的test_set_atomic_type_kernel即使用asc.half作为参数asc.jit(always_compileTrue) def set_atomic_type_kernel() - None: asc.set_atomic_type(asc.half) set_atomic_type_kernel[1]()实际使用时应保证dtype与参与原子操作的张量数据类型一致否则原子读写按错误位宽解析 GM 数据可能产生错误结果。指令族配合关系必须先有原子行为再设定类型set_atomic_type单独调用不会产生任何原子效果它必须与具体原子行为指令配合使用。文档约束明确指出需要和set_atomic_add、set_atomic_max、set_atomic_min配合使用。各指令的语义对比依据对应生成的 API 文档指令行为对应 Ascend C 原型set_atomic_add(dtype)对后续 VECOUT/L0C/L1 到 GM 的数据传输开启原子累加将搬运数据与 GM 原值相加后写回template typename T void SetAtomicAdd();set_atomic_max(dtype)将搬运内容与 GM 已有内容比较把最大值写入 GMtemplate typename T void SetAtomicMax();set_atomic_min(dtype)将搬运内容与 GM 已有内容比较把最小值写入 GMtemplate typename T void SetAtomicMin();set_atomic_none()清空原子操作状态关闭后续搬运的原子功能void SetAtomicNone();三种原子行为指令与set_atomic_type支持完全一致的数据类型asc.float16、asc.float32、asc.int32、asc.half。典型使用顺序为dtype asc.float32 asc.set_atomic_type(dtype) # 1. 设定原子操作的数据类型 asc.set_atomic_add(dtype) # 2. 开启原子累加行为 # ... 执行需要原子累加的搬运/计算 ... asc.set_atomic_none() # 3. 使用完毕后清空原子状态底层实现从 Python 到 Ascend C 的生成链路ASC-IR 指令定义原子操作指令族在 ASC-IRMLIR 中间表示层面的定义位于 include/ascir/Dialect/Asc/IR/Basic/OpSetAtomic.tddef AscendC_SetAtomicTypeOp : APIOpset_atomic_type, SetAtomicType, [AscFunc] { let summary Set atomic operation data type by template type parameter; let arguments (ins TypeAttr:$dtype); let paramTypeLists [5]; }关键点在于[AscFunc]traits 标记该 Op 支持 Ascend C 代码自动生成let arguments (ins TypeAttr:$dtype)表明dtype以类型属性TypeAttr形式存在于指令中let paramTypeLists [5]中的5表示类型模板参数正是它驱动代码生成器将dtype输出为 C 模板实参详见下文。同文件中还定义了AscendC_SetAtomicAddOp、AscendC_SetAtomicMaxOp、AscendC_SetAtomicMinOp均携带TypeAttr:$dtype与无参数的AscendC_SetAtomicNoneOp构成完整的指令族。Ascend C 代码自动生成配置developer_guide.md 以SetAtomicAdd为例说明了该指令族的自动生成机制对set_atomic_type同样适用通过标记AscFunctraits并配置paramTypeLists [5]5 表示类型模板参数即可完成 Ascend C 代码自动生成配置无需在 Target 翻译模块中手写代码生成逻辑。也就是说从 Python 前端asc.set_atomic_type(asc.half)到最终输出的AscendC::SetAtomicTypehalf()整条链路为Python API (set_atomic.py) → global_builder.create_asc_SetAtomicTypeOp(dtype.to_ir()) # 生成 ASC-IR 指令 → ascendc.set_atomic_type {dtype f16} # MLIR 文本形式 → AscendC::SetAtomicTypehalf() # 生成的 Ascend C 代码端到端代码生成验证仓库中的 MLIR 测试文件 test/Target/AscendC/basic/set_atomic.mlir 精确验证了这一转换结果// CHECK-LABEL:void emit_set_atomic_type() { // CHECK-NEXT: AscendC::SetAtomicTypehalf(); // CHECK-NEXT: return; // CHECK-NEXT: } func.func emit_set_atomic_type() { ascendc.set_atomic_type {dtype f16} : () - () return }该测试通过ascir-translate -mlir-to-ascendc将ascendc.set_atomic_type {dtype f16}翻译为AscendC::SetAtomicTypehalf()证实了dtype f16与模板参数half的映射关系。同一文件中还覆盖了set_atomic_add、set_atomic_max、set_atomic_min、set_atomic_none的代码生成可作为理解整个原子指令族输出形态的参考。约束与最佳实践依据原文档的约束说明并结合相关指令族的文档信息使用set_atomic_type时需注意必须与原子行为指令配合set_atomic_type仅设定数据类型需与set_atomic_add、set_atomic_max、set_atomic_min之一配合使用才产生原子效果。用后务必复位使用完成后建议调用set_atomic_none清空原子操作状态否则原子模式会持续作用于后续相关指令影响后续搬运/计算的正确性。set_atomic_add等接口文档同样强调此约束。GM 数据清零由开发者负责以原子累加为例指令执行前不会自动对 GM 数据做清零操作开发者需根据算子逻辑判断是否需要先行清零详见 set_atomic_add 文档。平台相关的 inf/nan 模式限制对于 910B 平台set_atomic_max/set_atomic_min场景下目前无法对bfloat16_t类型设置 inf/nan 模式详见 set_atomic_max 文档设计算子时需规避相关数据形态。仅在 kernel 编译期可用由于接口被require_jit修饰必须在asc.jit编译的 kernel 函数内部调用无法在 Host 侧直接执行。完整调用示例结合 pyasc 的 JIT 编译框架一个典型的原子累加配置示例如下参考 test_set_atomic.py 的测试写法import asc from asc.runtime import config # 选择后端平台模型模式便于本地编译验证 config.set_platform(config.Backend.Model, checkFalse) asc.jit(always_compileTrue) def atomic_add_kernel() - None: dtype asc.float16 asc.set_atomic_type(dtype) # 设定原子操作数据类型 asc.set_atomic_add(dtype) # 开启原子累加 # ... 此处执行需要原子累加的数据搬运/计算 ... asc.set_atomic_none() # 使用完毕后清空原子状态 atomic_add_kernel[1]()若需要原子最大值比较只需将set_atomic_add替换为set_atomic_maxasc.jit(always_compileTrue) def atomic_max_kernel() - None: dtype asc.int32 asc.set_atomic_type(dtype) asc.set_atomic_max(dtype) # 将搬运数据与 GM 原值比较写入最大值 # ... 计算逻辑 ... asc.set_atomic_none()总结asc.language.basic.set_atomic_type是 pyasc 原子操作指令族中的类型配置接口它本身不触发具体原子行为而是为set_atomic_add、set_atomic_max、set_atomic_min指定参与运算的数据类型asc.float16、asc.float32、asc.int32、asc.half。其实现遵循Python 前端 API → ASC-IR 指令TypeAttr→ Ascend C 模板代码自动生成的完整链路从 OpSetAtomic.td 的指令定义到 set_atomic.mlir 的翻译测试均可验证。正确使用该接口的关键在于与原子行为指令配对调用、保证dtype与张量类型一致、以及使用完毕后调用set_atomic_none复位状态从而在多核并发写 GM 的场景下安全高效地完成原子累加与原子比较运算。【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

A*算法在全覆盖路径规划中的Matlab实现与优化 2026/9/19 4:55:52

A*算法在全覆盖路径规划中的Matlab实现与优化

1. 项目背景与核心价值在自动化仓储物流、清洁机器人、农业植保无人机等实际场景中,全覆盖路径规划(CCPP)一直是个经典难题。简单来说,就是让移动设备在给定区域内无遗漏地走过每一个可通行点,同时要兼顾效率最优。传统…

阅读更多 →
Windows、iPhone、Linux三平台抓包实战:HTTPS解密与证书信任全流程 2026/9/19 4:55:52

Windows、iPhone、Linux三平台抓包实战:HTTPS解密与证书信任全流程

1. 为什么我要在三个平台上折腾同一套抓包流程做移动端和桌面端联调的朋友大概率都遇到过这种场景:后端同学说接口返回没问题,前端同学说数据没收到,iOS 端说 Android 端能跑,Android 端说 iOS 端能跑,最后发现是某个平…

阅读更多 →
DataHub Console Sink 使用指南:将元数据事件打印到 stdout 的调试利器 2026/9/19 4:55:52

DataHub Console Sink 使用指南:将元数据事件打印到 stdout 的调试利器

DataHub Console Sink 使用指南:将元数据事件打印到 stdout 的调试利器 【免费下载链接】datahub The Context Platform for your Data and AI Stack 项目地址: https://gitcode.com/GitHub_Trending/da/datahub 导读 Console Sink 是 DataHub 元数据摄取&a…

阅读更多 →
YOLOv8边缘部署实战:从轻量化到TensorRT加速完整指南 2026/9/19 4:55:52

YOLOv8边缘部署实战:从轻量化到TensorRT加速完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
《龙珠超》104集深度解析:身胜手极意觉醒与战斗作画巅峰 2026/9/19 4:55:52

《龙珠超》104集深度解析:身胜手极意觉醒与战斗作画巅峰

第一次看到“dragonballsuper_104-2”这个编号时,我以为是某个字幕组修复后发的第二版资源。后来我自己做拉片复盘,也习惯用这种带“-2”的命名方式——代表同一集内容在第二次观看时拆出来的新东西。《龙珠超》第104集恰好是我愿意再看第二遍的一集&…

阅读更多 →
OneUptime 自托管架构全解:从 NGINX 入口、探针监控到三大数据存储的完整数据流 2026/9/19 4:52:52

OneUptime 自托管架构全解:从 NGINX 入口、探针监控到三大数据存储的完整数据流

OneUptime 自托管架构全解:从 NGINX 入口、探针监控到三大数据存储的完整数据流 【免费下载链接】oneuptime Complete open-source monitoring and observability platform. 项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime 导读 本文基于 One…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞