PyPTO SIMT atomic_cas 原子比较交换 API 详解:从接口语义到 Ascend 950 端到端实现
人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载PyPTOParallel Tensor/Tile Operation 编程范式在pypto_pro.language.simt命名空间下提供了完整的 SIMT 原子操作族atomic_add、atomic_exch、atomic_cas、atomic_inc等。其中atomic_casCompare-And-Swap比较并交换是最基础也最通用的同步原语它以原子方式比较目标元素与期望值相等时写入新值并返回比较前的旧值是自旋锁、单次初始化、唯一 Winner 选举等并发算法的核心构件。本文基于 atomic_cas API 文档结合仓库内 IR 构建、CCE 后端代码生成与端到端测试源码完整讲解该接口的调用约束、数据类型规则、返回值语义并给出可直接运行的 Kernel 示例与源码级实现路径。功能语义一次不可分割的读-比较-写atomic_cas对目的操作数target执行如下不可分割原子的步骤序列读取target的旧值将旧值与compare期望值比较若二者相等将value写入target否则target保持不变返回比较发生前的target旧值。整个过程对 SIMT 线程网格中的其他线程完全不可见中间状态因此并发线程同时调用atomic_cas时只会有一个线程在某个时刻赢得写入权其余线程要么看到旧值已被改写而放弃要么在后续轮次中重新尝试。仓库中的 API 声明python/pypto_pro/language/_simt_api.py将其概括为Atomically compare and exchange one Tile or Tensor element, returning its old value.函数原型pypto_pro.language.simt.atomic_cas( target: Scalar, compare: Scalar, value: Scalar, ) - Scalar参数说明参数输入/输出说明target输入目的操作数Scalar 类型。必须直接传入 Tile 或 Tensor 的单元素下标访问表达式例如ub_tile[0, 0]或gm_tensor[0, 0]。- UB Tile必须位于 UB使用 ND 格式支持 DT_INT32、DT_UINT32、DT_FP32。- GM Tensor必须为 ND 格式支持 DT_INT32、DT_UINT32、DT_FP32、DT_INT64、DT_UINT64。compare输入源操作数Scalar 类型表示期望值。数据类型必须与 target 一致数值字面量按 target 的数据类型处理整数目的操作数不接受浮点字面量。value输入源操作数Scalar 类型表示比较相等时写入的新值。数据类型必须与 target 一致数值字面量按 target 的数据类型处理整数目的操作数不接受浮点字面量。两点关键细节需要特别强调target 必须直接写成下标访问表达式。atomic_cas的底层实现需要同时拿到容器引用Tile/Tensor和元素偏移量两个信息因此不能先取出元素再传入例如tmp tile[0, 0]; atomic_cas(tmp, ...)这类间接写法是不符合接口约定的。这一约束在 IR 层有明确体现atomic_cas构建函数接收的是container容器与offset偏移两个独立参数见下文源码分析。字面量按 target 数据类型解释。compare/value传数值字面量时不需要显式 cast框架按target的数据类型解释该字面量但对于整数类型的目标元素传入浮点字面量如0.0是不被接受的应保持类型一致。数据类型与产品支持矩阵atomic_cas对不同存储位置的数据类型支持并不完全相同使用前请对照下表存储位置格式要求支持的数据类型UB Tile必须位于 UB、ND 格式DT_INT32、DT_UINT32、DT_FP32GM Tensor必须为 ND 格式DT_INT32、DT_UINT32、DT_FP32、DT_INT64、DT_UINT64产品支持情况以当前仓库文档为准Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品不支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品不支持仓库端到端测试python/tests/st/pypto_pro/frontend/simt/atomic/test_atomic_cas.py在启动前会检查设备名是否包含Ascend950_require_a5函数不满足则跳过测试与文档声明的产品支持范围一致。调用约束SIMT 上下文atomic_cas只能在由pypto_pro.language.vector_function(modesimt)定义的SIMT 入口函数或SIMT 辅助函数中调用不能在标量/向量上下文或其他编程范式下直接使用。这是因为该操作是 SIMT 线程级并发语义的一部分只有在一个由多线程并行执行的 SIMT 函数中多个线程竞争同一元素的场景才有意义。一个典型的 SIMT Kernel 需要两层结构外层pl.jit()函数负责声明 Tensor 参数、创建 UB Tile如需、编排pl.section_vector()等流水区域并以simt_func线程数的语法启动 SIMT 函数内层pl.vector_function(modesimt, max_threads...)函数内部编写逐线程执行的代码atomic_cas就写在这里。返回值说明atomic_cas返回比较发生前的target值返回值类型与target一致。因此可以通过返回值判断本次交换是否成功返回值 compare说明比较时旧值恰好等于期望值本次写入成功该线程赢得竞争返回值! compare说明旧值已被其他线程改写本次未写入调用者应决定是重试还是放弃。这一返回值即旧值的语义与 CUDA 的atomicCAS保持一致也使得atomic_cas可以天然地用来实现只允许一个线程成功的选举逻辑。调用示例多线程竞争下的唯一 Winner以下示例来自 API 文档与仓库端到端测试中的atomic_cas_winner_gm完全一致32 个线程并发对state[0, 0]执行atomic_cas(state[0, 0], 0, 1)将old_values[0, tid]记录各自观察到的旧值。import pypto_pro.language as pl pl.vector_function(modesimt, max_threads32) def atomic_cas_winner_gm( state: pl.Tensor[[1, 1], pl.DT_INT32], old_values: pl.Tensor[[1, 32], pl.DT_INT32], ): tid pl.simt.linear_thread_idx() old_values[0, tid] pl.simt.atomic_cas(state[0, 0], 0, 1) pl.jit() def simt_atomic_cas_winner_gm( state: pl.Tensor[[1, 1], pl.DT_INT32], old_values: pl.Tensor[[1, 32], pl.DT_INT32], ): with pl.section_vector(): atomic_cas_winner_gm32运行逻辑推演初始state[0, 0] 0。32 个线程同时执行 CAS最终只有一个线程能看到旧值0等于compare它把state写为1并成功其余 31 个线程看到的旧值都是1不等于compare写入失败但state保持不变。因此最终state[0, 0] 1且old_values中恰好有一个0、其余为1——这正是唯一 Winner 选举的验证方式。示例中两个值得注意的写法pl.simt.linear_thread_idx()获取当前线程的一维线性编号用于区分每个线程写入old_values的列位置外层pl.section_vector()将 SIMT 启动放入向量流水区域atomic_cas_winner_gm32的方括号语法表示以 32 线程启动该 SIMT 函数。源码级实现路径从 Python API 到 CCE 指令atomic_cas的完整调用链在仓库中可分为三层理解这条路径有助于排查问题和二次开发1. Python DSL 层API 声明pypto_pro.language.simt.atomic_cas的声明位于 python/pypto_pro/language/_simt_api.py通过staticmethod_api_decl装饰器暴露给 DSL 前端。与atomic_add、atomic_exch、atomic_max等同族操作并列构成完整的 SIMT 原子操作集合。2. IR 构建层容器 偏移的拆分前端解析器将atomic_cas(tile[0, 0], compare, value)这种下标表达式拆解为容器 偏移 操作数三部分。IR 构建函数位于 python/pypto_pro/ir/op/simt_ops.pydef atomic_cas(container, offset, compare, value, spanNone): Build an atomic compare-and-swap on one SIMT element. return _create_atomic_call(atomic_cas, container, offset, compare, value, spanspan)_create_atomic_call最终生成 IR 调用simt.atomic_cassimt_ops.py操作数顺序为[container, offset, compare, value]。AST 解析器通过op_impl(simt.atomic_cas)注册simt_ops.py将源码中的调用语法映射到该 IR 节点——这也印证了文档必须直接传下标表达式的要求来自 IR 层的容器/偏移二元表示。3. 后端代码生成层映射到 atomicCASCCE 后端在 framework/src/interface/pypto_pro/backend/backend_cce_simt_ops.cpp 中把simt.atomic_cas映射为 CCE 内置函数if (op_name simt.atomic_cas) { return {atomicCAS, 2}; }并在同文件末尾注册该操作指定其运行在S标量流水backend_cce_simt_ops.cppREGISTER_BACKEND_OP(BackendCCE, simt.atomic_cas).set_pipe(ir::PipeType::S).f_codegen(MakeSimtAtomicCodegenCCE);即atomic_cas最终以标量原子指令的形式下发给 AICore这也是其返回单个旧值而非批量结果的直接原因。端到端测试验证语义正确性的四重保障仓库为atomic_cas提供了完整的 ST 测试python/tests/st/pypto_pro/frontend/simt/atomic/test_atomic_cas.py覆盖四个关键维度UB Tile 全 dtype 测试test_atomic_cas_ub_all_supported_dtypes对 DT_INT32、DT_UINT32、DT_FP32 三种 UB Tile 元素执行atomic_cas(..., 0, 7)断言最终值均为 7。注意 UB 用例需要先用pl.load把数据从 GM 搬入 UB Tile并配合pl.system.sync_src/sync_dst做流水同步最后pl.store写回。GM Tensor 全 dtype 测试test_atomic_cas_gm_all_supported_dtypes覆盖 GM 侧全部五种 dtypeINT32/UINT32/FP32/INT64/UINT64同样断言写 7 成功。返回值与旁路元素保持测试test_atomic_cas_returns_old_value_and_preserves_other_elements将state[0, 0]预置为 10调用atomic_cas(state[0, 0], 10, 13)断言返回旧值 10 被写入old_values[0, 0]、目标元素变为 13且同 Tensor 其他元素保持原值 123 不变——完整验证了返回比较前旧值 仅修改目标元素的语义。竞争唯一 Winner 测试test_atomic_cas_contention_has_exactly_one_winner32 线程竞争断言最终state 1、old_values中恰好一个元素为 0、其余均为 1从并发层面验证了原子性与单次成功保证。此外UT 层还有语法解析测试python/tests/ut/pypto_pro/language/parser/test_simt_atomic.py和 CCE 代码生成测试python/tests/ut/pypto_pro/codegen/test_cce_simt.py共同守护从语法解析到指令发射的全链路正确性。使用建议与注意事项用返回值判断成败不要依赖状态再检查CAS 的成功判定应使用返回值与compare的比较避免额外的读操作引入新的竞争窗口。整数目标不要传浮点字面量如atomic_cas(state[0, 0], 0.0, 1.0)对 INT32 目标不合法应写为0、1。UB 与 GM 的数据类型能力不同UB Tile 仅支持 32 位三种类型需要 64 位原子 CAS 时必须走 GM Tensor。仅在 SIMT 函数内使用atomic_cas依赖 SIMT 线程级并发脱离modesimt的上下文调用不会被接受。配合流水同步使用当atomic_cas作用于 UB Tile 时写回 GM 前需通过pl.system.sync_*确保原子操作完成后才发起pl.store参考 UB 测试用例的同步写法。从源码阅读入口接口语义见 python/pypto_pro/language/_simt_api.pyIR 构建见 python/pypto_pro/ir/op/simt_ops.pyCCE 发射见 framework/src/interface/pypto_pro/backend/backend_cce_simt_ops.cpp。综上atomic_cas为 PyPTO 的 SIMT 编程范式提供了底层、原子、可判定成败的同步原语适用于跨线程计数、状态机迁移、唯一初始化等需要比较-写回一体的并发场景结合文档、IR 源码与端到端测试开发者可以放心地将其作为自旋锁与选举算法的地基。赞分享人工智能编译器模型编译高性能计算深度学习CANN【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址https://gitcode.com/cann/pypto点击查看免费下载相关推荐PyPTO Tensor.logical_not 逻辑非运算接口详解从函数原型到 Ascend 算子实现PyPTO Tensor.logical_not 逻辑非运算接口详解从函数原型到 Ascend 算子实现 pypto.Tensor.logical_not 是人工智能编译器模型编译高性能计算深度学习CANNPyPTO Pro vf.expSIMD 寄存器级指数运算接口详解Ascend 950PyPTO Pro vf.expSIMD 寄存器级指数运算接口详解Ascend 950 vf.exp 是 PyPTO Pro pypto_pro SI人工智能编译器模型编译高性能计算深度学习CANNHeadlamp 前端时间格式化接口 TimeAgoOptions 详解从 API 定义到源码实现Headlamp 前端时间格式化接口 TimeAgoOptions 详解从 API 定义到源码实现 TimeAgoOptions 是 Headlamp 前端工云原生开发工具上一篇【亲测免费】 LibSU 开源项目教程下一篇FFUF 项目使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

如何把QQ空间历史说说备份到本地:GetQzonehistory 上手实测

如何把QQ空间历史说说备份到本地:GetQzonehistory 上手实测

如何把QQ空间历史说说备份到本地:GetQzonehistory 上手实测 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 翻到三年前那条说说时,发现它已经从空间主页上消失了…

2026/9/20 13:40:27 阅读更多 →
如何为Agent Substrate配置GPU Worker池:nvidia-ctk、CDI与runsc nvproxy实战

如何为Agent Substrate配置GPU Worker池:nvidia-ctk、CDI与runsc nvproxy实战

如何为Agent Substrate配置GPU Worker池:nvidia-ctk、CDI与runsc nvproxy实战 【免费下载链接】substrate Agent Substrate: the core system 项目地址: https://gitcode.com/GitHub_Trending/substrate7/substrate Agent Substrate 是一个面向 Agent 运行时的…

2026/9/20 13:40:27 阅读更多 →
RIOT PSA Crypto MAC 配置测试深度解析:以 HMAC SHA-256 为例验证 psa_mac 模块与后端选择机制

RIOT PSA Crypto MAC 配置测试深度解析:以 HMAC SHA-256 为例验证 psa_mac 模块与后端选择机制

物联网嵌入式操作系统实时系统 【免费下载链接】RIOT RIOT - The friendly OS for IoT 项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT 点击查看 免费下载 本文聚焦 RIOT 操作系统中 tests/sys/psa_crypto_mac 测试:它是对 PSA Crypto 模块 …

2026/9/20 13:39:27 阅读更多 →

最新新闻

5分钟给Qwerty Learner加上自己的专属词库:私人单词表也能练打字

5分钟给Qwerty Learner加上自己的专属词库:私人单词表也能练打字

5分钟给Qwerty Learner加上自己的专属词库:私人单词表也能练打字 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: h…

2026/9/20 20:18:53 阅读更多 →
iOS应用签名机制解析:从原理到正规测试流程的合规指南

iOS应用签名机制解析:从原理到正规测试流程的合规指南

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

2026/9/20 20:18:53 阅读更多 →
Qt for MCUs 2.11 LTS 与 Qt 5.15.19 收官:ESP32-S3 和 RA8D1 上跑地图渲染的实战解析

Qt for MCUs 2.11 LTS 与 Qt 5.15.19 收官:ESP32-S3 和 RA8D1 上跑地图渲染的实战解析

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

2026/9/20 20:18:53 阅读更多 →
Windows下用uv确定性安装Python+OpenCV(避坑指南)

Windows下用uv确定性安装Python+OpenCV(避坑指南)

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

2026/9/20 20:18:53 阅读更多 →
Windows卸载软件后打开方式残留?注册表清理与排查全指南

Windows卸载软件后打开方式残留?注册表清理与排查全指南

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

2026/9/20 20:18:53 阅读更多 →
如何让10块钱的鼠标比苹果触控板还好用:Mac Mouse Fix完整新手指南

如何让10块钱的鼠标比苹果触控板还好用:Mac Mouse Fix完整新手指南

如何让10块钱的鼠标比苹果触控板还好用:Mac Mouse Fix完整新手指南 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix 是…

2026/9/20 20:17:53 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →