PyPTO bitwise_and 详解:逐元素按位与操作的用法、TileShape 配置与源码级实现

📅 发布时间:2026/9/18 20:05:59
PyPTO bitwise_and 详解:逐元素按位与操作的用法、TileShape 配置与源码级实现
PyPTO bitwise_and 详解逐元素按位与操作的用法、TileShape 配置与源码级实现【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto本文围绕 PyPTO 的pypto.bitwise_and接口展开完整覆盖其功能语义、函数原型、参数与返回值约束、各平台支持的数据类型以及 TileShape 配置和接口调用示例并结合 PyPTO 仓库中的 Python 封装、C 算子实现与系统测试用例讲解该算子从前端调用到向量单元执行的实际链路帮助你在 Ascend 设备上正确编写和验证按位与运算的 Tile 代码。功能说明bitwise_and是一个逐元素element-wise的二元位运算接口将input与other对应位置的值进行按位与AND运算计算公式为$$ \text{res}_i \text{input_i other_i} $$该运算属于 PyPTO Tensor API 中向量Vector算子家族常用于整数 Tensor 的掩码mask提取、标志位组合、位域抽取等场景例如用掩码常量截取整数的低位字段。产品支持情况根据官方 API 文档 pypto-bitwise_and.md该接口的产品支持情况如下Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持函数原型bitwise_and(input: Tensor, other: Union[Tensor, int]) - Tensor其中other既可以是 Tensor也可以是一个 Pythonint标量。标量用法在 Python 封装中有明确体现math.py 中的实现会对other做类型检查非int类型会抛出PyptoError错误码0xF00001合法的整型标量会经_clip_scalar_to_dtype截断到input的数据类型后被包装为标量Element再进入pypto_impl.BitwiseAnd。参数说明参数名输入/输出说明input输入源操作数。支持的类型为 Tensor。不同型号支持的数据类型有所差异详见下文约束说明。不支持空 TensorShape 仅支持 1-4 维支持多维度广播到相同形状Shape Size 不大于 2147483647即 INT32_MAX。other输入源操作数。支持的类型为 int 以及 Tensor 类型。不同型号支持的数据类型有所差异详见下文约束说明。不支持空 TensorShape 仅支持 1-4 维支持多维度广播到相同形状Shape Size 不大于 2147483647即 INT32_MAX。返回值说明返回输出 TensorTensor 的数据类型和input、other相同Shape 为input和other广播后的大小。也就是说输出 dtype 不发生改变广播只作用于形状推导。约束说明input和other都为 Tensor 时数据类型应该相同。Tensor 数据类型说明不同平台有所差异Ascend 950PR / Ascend 950DTDT_INT8DT_UINT8DT_INT16DT_UINT16DT_INT32DT_UINT32DT_INT64DT_UINT64Atlas A3 训练/推理系列产品DT_INT8DT_UINT8DT_INT16DT_UINT16DT_INT32DT_UINT32Atlas A2 训练/推理系列产品DT_INT8DT_UINT8DT_INT16DT_UINT16DT_INT32DT_UINT32Tensor 类型输入不支持TileOpFormat.TILEOP_NZ格式。上述约束在源码中可以得到逐条印证。在 C 算子入口 bitwise.cpp 中BitwiseAnd依次执行了三类检查通过CheckTensorFormat(..., {TileOpFormat::TILEOP_NZ}, BitwiseAnd)拒绝 NZ 格式输入对应约束 3通过CheckTensorsDataTypeConsistency保证两个 Tensor 输入 dtype 一致对应约束 1通过ConfigManager::Instance().GetOpSupportedInputDtypes(Opcode::OP_BITWISEAND)按当前平台查询支持的数据类型再用CheckTensorDataType做最终校验对应约束 2。各平台支持的数据类型由配置文件声明a2a3_supported_op_dtypes.json 中BITWISEAND的input_dtypes为 int8、int16、int32、uint8、uint16、uint32与文档中 A2/A3 平台列出的 6 种类型一致a5_supported_op_dtypes.json 中BITWISEAND额外包含 int64、uint64对应 Ascend 950PR/950DT 平台文档列出的 8 种类型。从源码结构看同一配置中还定义了BITWISEANDS标量版本后缀 S 表示另一操作数为标量其支持的数据类型与 Tensor 版本相同——这也解释了为什么 Python 层other允许传int标量场景在 C 侧映射到BITWISEANDS算子。TileShape 设置示例调用该 operation 接口前应通过set_vec_tile_shapes设置 TileShape且 TileShape 的维度应和输出一致。非广播场景输入inputshape 为[m, n]other为[m, n]输出为[m, n]TileShape 设置为[m1, n1]则m1、n1分别用于切分m、n轴广播场景输入inputshape 为[m, n]other为[m, 1]输出为[m, n]TileShape 设置为[m1, n1]则m1、n1同样分别用于切分m、n轴即按广播后的输出形状切分而非按各输入自身的形状切分。pypto.set_vec_tile_shapes(4, 16)从源码的 Tile 切分逻辑看bitwise.cpp中TiledBitwiseShiftOperation的递归切分方式与二元算子通用逻辑相同框架会沿输出形状的每个轴按vecTile步进用View取出输入/输出 Tile 再逐 Tile 发射操作当输入维度少于输出维度时切分偏移使用i % input.shape[axis]回绕这正是“广播输入沿该轴重复取数”的实现机制与文档描述的广播场景语义一致。接口调用示例最简示例a pypto.tensor([2], pypto.DT_INT16) b pypto.tensor([2], pypto.DT_INT16) out pypto.bitwise_and(a, b)对应文档中的结果示例输入数据a: [2, 5] 输入数据b: [1, 7] 输出数据out: [0, 5]验证一下位运算2 1 0b10 0b01 05 7 0b101 0b111 0b101 5与示例输出一致。标量操作数示例other也可以直接传整数标量Python 封装会将其按input的 dtype 截断并转换为Element后执行# 假设 a 为 DT_INT32 Tensor提取每个元素的低 8 位 mask 0xFF low_byte pypto.bitwise_and(a, mask)从 Python 封装到向量执行的实际链路综合前端封装、C 实现与测试用例可以还原bitwise_and的完整执行链路Python 前端math.py 中的bitwise_and经op_wrapper注册。other为 Tensor 时直接调用pypto_impl.BitwiseAnd(self, other)为int时做截断与Element转换后再调用。C 算子入口bitwise.cpp 中的BitwiseAnd(const Tensor, const Tensor)完成格式与 dtype 校验后通过RETURN_CALL(BinaryOperationBinaryOpType::BITWISEAND, ...)把操作加入当前 Function 的 IR。Tile 切分注册文件末尾通过REGISTER_OPERATION_TILED_FUNC(OP_BITWISEAND, Opcode::OP_BITWISEAND, BinaryOperationTileFuncBinaryOpType::BITWISEAND)将OP_BITWISEAND与二元算子的通用 Tile 切分函数绑定。这意味着bitwise_and并非独立的切分实现而是复用了与加法、乘法等二元向量算子相同的BinaryOperationTileFunc切分框架——这也是 TileShape 规则按输出切分、广播轴回绕能统一适用的原因。系统测试验证test_bitwiseand_onboard.py 提供了上板系统测试。测试内核中先pypto.set_vec_tile_shapes(*config.tile_shape)再在双循环中对输入view切分、调用pypto.bitwise_and最后用pypto.assemble写回输出测试期望值直接由torch.bitwise_and在 CPU 上计算得到再做逐元素比对。 对应的用例配置见 bitwiseand_onboard_test_case.py一个uint16类型、形状为(1, 32)与(32, 32)的输入做广播按位与输出(32, 32)view_shape与tile_shape均为(16, 16)——这正是一个文档中描述的“广播场景下按输出形状设置 TileShape”的实例。小结pypto.bitwise_and是 PyPTO Tensor API 中最基础也最直接的二元位运算接口之一语义上就是逐元素input other支持 Tensor-Tensor 与 Tensor-int 标量两种形态输出 dtype 与输入一致、Shape 为广播后的形状约束上两个 Tensor 输入必须同 dtype不支持 NZ 格式维度 1-4 维Shape Size 不超过 INT32_MAX950 平台额外支持 INT64/UINT64使用上调用前需set_vec_tile_shapes按输出形状设置 TileShape广播输入按输出形状切分实现上Python 封装math.py→ C 校验入口bitwise.cpp→ 复用二元算子通用切分框架并有上板 STtest_bitwiseand_onboard.py以torch.bitwise_and为 golden 做数值验证。【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考