十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PyPTO SIMT 标量计算 API 实战:使用 pl.simt.isnan 判断并处理 NaN 数据

PyPTO SIMT 标量计算 API 实战:使用 pl.simt.isnan 判断并处理 NaN 数据 PyPTO SIMT 标量计算 API 实战使用 pl.simt.isnan 判断并处理 NaN 数据【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto导读pl.simt.isnan是 CANN PyPTO 项目 SIMT 编程范式下提供的标量分类函数用于在 SIMTSingle Instruction, Multiple Threads入口函数或辅助函数中判断源操作数是否为 NaNNot a Number并以DT_BOOL类型的 Scalar 返回判断结果。本文以 isnan.md 为骨架结合 PyPTO 仓库的源码与测试用例完整讲解该 API 的函数原型、参数约束、返回语义、产品支持情况以及它在 SIMT 内核中替换/清洗无效数据NaN的实际写法帮助读者掌握在 PyPTO Pro SIMT 内核中做 NaN 检测与数据兜底的完整方案。1. API 概述与定位1.1 所属体系pl.simt.isnan属于 PyPTO Pro 的 SIMT API 命名空间完整调用形式为pypto_pro.language.simt.isnan在 PyPTO 的 SIMT API 文档树中它归属于“标量计算scalar_compute”分组。该分组还包含cast、bitcast、abs、min、max、sqrt、rsqrt、exp、exp2、log、log2、log1p、sin、cos、tanh、rint、round、floor、ceil、trunc、fma、isinf等标量运算完整的索引见 scalar_compute/index.md。isnan与isinf判断正负无穷、isfinite判断是否为有限数共同构成 SIMT 标量侧的数值分类classification三件套。在仓库的 Python 类型声明文件 _simt_api.py 中三个函数紧邻定义返回值均为 BOOL Scalar。1.2 功能说明pl.simt.isnan的功能是判断源操作数是否为 NaN。源操作数为 NaN 时返回True否则返回False。NaNNot a Number是 IEEE 754 浮点标准中一类特殊的数值状态常见于0.0 / 0.0、inf - inf、负数的平方根或对数等非法运算结果。在算子开发中NaN 一旦进入后续计算链会沿数据流传播并污染最终结果因此通常需要在数据入口处或关键计算节点后对其进行检测和替换。2. 产品支持情况按照 isnan.md 中的说明pl.simt.isnan的硬件支持情况如下产品支持情况Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品不支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品不支持从仓库的系统测试可以印证这一点针对isnan的 SIMT 前端系统测试 test_simt_isnan.py 使用了pytest.mark.soc(950)标记即该用例仅在 950 系列 SoC 上运行与文档中“仅 Ascend 950PR/Ascend 950DT 支持”的产品约束一致。注意产品支持情况以当前仓库文档为准在目标硬件上开发前请再次核对实际发布版本的兼容性说明。3. 函数原型与参数说明3.1 函数原型pypto_pro.language.simt.isnan( value: Scalar, ) - Scalar3.2 参数说明参数输入/输出说明value输入源操作数Scalar 类型支持DT_FP16、DT_BF16和DT_FP32。Tensor 或 Tile 元素需通过下标访问后传入。关于参数使用有两点值得注意必须是 Scalar该 API 面向标量分类不接受 Tensor 或 Tile 整体作为入参。文档明确说明Tensor 或 Tile 的元素必须通过下标访问如tensor[0, tid]后以 Scalar 形式传入。仅支持浮点类型支持的数据类型为DT_FP16、DT_BF16、DT_FP32整数类型不在支持范围内整数类型不存在 NaN 语义。3.3 返回值说明源操作数为 NaN 时返回True否则返回False返回值为DT_BOOL类型的 Scalar。返回值可以直接作为if等控制流条件使用这是它在内核中实现“检测即分支”的关键能力。仓库的类型声明 _simt_api.py 也明确了这一点“Return a BOOL Scalar indicating whether a floating-point Scalar is NaN.”4. 约束说明pl.simt.isnan的使用约束如下源自 isnan.md只能在 SIMT 函数中调用只能在由pypto_pro.language.vector_function(modesimt)定义的 SIMT 入口函数或辅助函数中调用不能在非 SIMT 上下文中使用例如向量vector模式函数或宿主侧 Python 代码。5. 调用示例与实战解读5.1 官方调用示例文档给出的完整示例是“用 NaN 检测实现数据兜底替换”——将source中的 NaN 元素替换为fallback值import pypto_pro.language as pl pl.vector_function(modesimt, max_threads256) def replace_nan( source: pl.Tensor[[1, 256], pl.DT_FP32], output: pl.Tensor[[1, 256], pl.DT_FP32], fallback: pl.DT_FP32, ): tid pl.simt.linear_thread_idx() value source[0, tid] output[0, tid] value if pl.simt.isnan(value): output[0, tid] fallback pl.jit() def simt_isnan_kernel( source: pl.Tensor[[1, 256], pl.DT_FP32], output: pl.Tensor[[1, 256], pl.DT_FP32], fallback: pl.DT_FP32, ): with pl.section_vector(): replace_nan256该示例的完整结构可以拆解为三层SIMT 向量函数定义pl.vector_function(modesimt, max_threads256)声明一个 SIMT 入口函数replace_nanmax_threads256表示线程块规模为 256与 Tensor 第二维大小256一一对应线程索引与逐元素处理tid pl.simt.linear_thread_idx()获取当前线程在一维块内的扁平索引x-major随后value source[0, tid]按下标取出当前线程负责的元素NaN 检测与替换先用output[0, tid] value做默认拷贝再通过if pl.simt.isnan(value):判断当前元素是否为 NaN若是则改写为fallback。这样既避免了在全量数据上做条件写又保证了 NaN 元素被安全替换。外层pl.jit()修饰的simt_isnan_kernel通过with pl.section_vector():将 SIMT 函数以replace_nan256的栅格grid启动语法拉起256 即为线程数。整体形成了“宿主侧 JIT 内核 SIMT 向量函数”的标准 PyPTO Pro SIMT 编程模型。5.2 多数据类型验证用例仓库的系统测试 test_simt_isnan.py 提供了覆盖全部支持类型的验证写法。该用例一次性对DT_FP16、DT_BF16、DT_FP32三种类型执行isnan判断并将布尔结果写入DT_BOOL类型的输出 Tensorpl.vector_function(modesimt, max_threadsELEMENTS) def isnan_all_dtypes( src_fp16: pl.Tensor[[1, ELEMENTS], pl.DT_FP16], src_bf16: pl.Tensor[[1, ELEMENTS], pl.DT_BF16], src_fp32: pl.Tensor[[1, ELEMENTS], pl.DT_FP32], out_fp16: pl.Tensor[[1, ELEMENTS], pl.DT_BOOL], out_bf16: pl.Tensor[[1, ELEMENTS], pl.DT_BOOL], out_fp32: pl.Tensor[[1, ELEMENTS], pl.DT_BOOL], ): tid pl.simt.linear_thread_idx() out_fp16[0, tid] pl.simt.isnan(src_fp16[0, tid]) out_bf16[0, tid] pl.simt.isnan(src_bf16[0, tid]) out_fp32[0, tid] pl.simt.isnan(src_fp32[0, tid])对应的测试数据构造test_simt_isnan.py同时注入了nan、inf、-inf和普通数值1.0并用torch.isnan作为 golden 参考进行比对values torch.zeros(ELEMENTS) values[0] float(nan) values[1] float(inf) values[2] float(-inf) values[3] 1.0 run_float_predicate(simt_isnan_all_dtypes, values, torch.isnan)从该用例可以得到明确的语义边界inf、-inf与普通数值均返回False只有nan返回True。这印证了isnan只检测 NaN不检测无穷——无穷的检测应使用同组的pl.simt.isinf见 isinf.md。6. 源码实现路径6.1 Python 前端声明在 _simt_api.py 中Simt.isnan被声明为静态方法并带有_api_decl装饰器staticmethod _api_decl def isnan(value: Scalar) - Scalar: Return a BOOL Scalar indicating whether a floating-point Scalar is NaN.需要说明的是这些声明并非运行时真正执行的函数在 PyPTO 内核内部AST 解析器会在 Python 实际执行之前拦截每一次pl.simt.xxx调用并转换为 IR在内核之外直接调用该声明会抛出RuntimeError该设计在 _simt_api.py 的模块 docstring 中有明确说明。6.2 IR 构建在 IR 构建层 simt_ops.py 中isnan通过统一的标量数学调用构建器生成 IR Calldef isnan(value: Expr, span: Span | None None) - Call: Build a floating-point scalar NaN-classification call. return _create_math_call(isnan, value, spanspan)同时同一文件末尾通过解析器注册表将simt.isnan名称绑定到该构建函数_register_scalar_math_parser(simt.isnan, 1, isnan)1表示该操作接收 1 个操作数。这条注册是前端解析器把pl.simt.isnan(...)调用转换为 IR 节点的入口。6.3 底层实现绑定在 C 侧绑定 operation.cpp 中isnan与同族的isfinite、isinf等谓词操作统一注册并映射到npu::tile_fwk::IsNan(self)等实现isfinite, [](const Tensor self) { return npu::tile_fwk::IsFinite(self); }, isnan, [](const Tensor self) { return npu::tile_fwk::IsNan(self); },由此可见isnan从 Python 前端声明 → AST 解析拦截 → IR Call 构建 → C 绑定 →tile_fwk底层数值分类实现形成了一条完整、可追踪的调用链。对希望深入理解编译栈的读者可继续阅读 simt_ops.py 与 _simt_api.py 中的完整实现。7. 使用建议与易错点结合文档约束、源码与测试用例总结以下实战建议先下标取元素再传入判断pl.simt.isnan的入参是 Scalar必须通过tensor[0, tid]或tile[row, col]下标访问获得元素后传入不能直接传入整个 Tensor 或 Tile。仅在 SIMT 上下文中使用只能在pl.vector_function(modesimt)修饰的 SIMT 入口函数或辅助函数中调用向量模式函数或宿主代码中不可使用。区分 NaN 与无穷isnan只对 NaN 返回Trueinf/-inf返回False如需判断无穷请使用pl.simt.isinf如需判断“有限数”请使用pl.simt.isfinite。注意平台限制当前文档标注该能力仅 Ascend 950PR/Ascend 950DT 支持Atlas A2/A3 系列不支持跨平台移植时需要先确认目标 SoC 的兼容性。结合控制流做兜底返回值是DT_BOOLScalar可直接作为if条件典型用法是先做默认拷贝、再用if pl.simt.isnan(value)分支替换避免 NaN 污染后续计算链。8. 延伸阅读同组标量计算 API 索引scalar_compute/index.md无穷判断 APIisinf.mdSIMT 前端声明源码python/pypto_pro/language/_simt_api.pySIMT IR 构建源码python/pypto_pro/ir/op/simt_ops.pyisnan系统测试用例python/tests/st/pypto_pro/frontend/simt/scalar/test_simt_isnan.py【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表