人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载导读LogicalNot 是 CANN asc-devkit 项目中 SIMD-API 高阶数学计算adv_api/math_compute家族的一员用于对 LocalTensor 上的数据按元素执行逻辑取反零被视为False非零被视为True结果以bool类型写入目的操作数。本文以 LogicalNot_interface 文档族为主体完整讲解 LogicalNot 内核侧接口与配套的 Host 侧临时空间查询接口GetLogicalNotMaxMinTmpSize、GetLogicalNotTmpBufferFactorSize并结合仓库源码接口声明、实现、Tiling 实现与单元测试剖析底层实现原理。读完本文你将掌握 LogicalNot 的完整用法、支持的数据类型与产品约束并能基于临时空间接口完成算子 Tiling 参数设计。一、接口家族总览LogicalNot 相关接口分为两类、共三个入口全部位于AscendC命名空间接口运行侧作用LogicalNot核函数Kernel侧对源操作数按元素逻辑取反结果写入目的操作数GetLogicalNotMaxMinTmpSizeHost 侧获取接口计算所需的最大/最小临时空间用于确定 Tiling 参数GetLogicalNotTmpBufferFactorSizeHost 侧获取maxLivedNodeCount与extraBuf用于在固定空间下反推单次最大计算元素数从仓库源码看Kernel 侧接口声明于 include/adv_api/math/logical_not.h其头文件顶部明确限制了编译方式若以--enable-simt编译__NPU_COMPILER_INTERNAL_PURE_SIMT__会直接报错 logical_not.h cannot be used with compile flag --enable-simt enabled即该接口仅面向 SIMDAI Vector编程模式。两个 Host 侧接口声明于 include/adv_api/math/logical_not_tiling.h。二、LogicalNot 内核接口详解2.1 产品支持情况LogicalNot 的产品支持范围非常明确仅 Ascend 950 系列 AI 处理器支持Ascend 950PR 950DT 系列产品支持Atlas A3 系列产品不支持Atlas A2 系列产品不支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core不支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品不支持这一结论在源码中得到印证实现文件 logical_not_common_impl.h 与 Tiling 实现 logical_not_tiling_impl.cpp 中接口主体仅在__NPU_ARCH__ 3510 || 9201 || 5102 || 5162 || 3003 || 3113时被实例化而 Host 侧 Tiling 接口通过ASCENDC_HOST_ASSERT断言npuArch NpuArch::DAV_3510 || npuArch NpuArch::DAV_9201不满足即中止。这与文档中的仅 950 系列支持一致DAV_3510/DAV_9201 对应 950 系列架构。2.2 功能说明按元素进行取反操作。当输入的数据类型不是 bool 时零被视为False非零数据被视为True。即对于任意输入元素x输出满足x 0→ 输出True取反后为真x ! 0→ 输出False底层实现正是输出元素是否等于 0这一判断在 logical_not_common_impl.h 的LogicalNotVF中先通过Reg::CompareScalarU, CMPMODE::EQ(cmpMask, srcVreg, static_castU(0), mask)将源向量与数值 0 做相等比较得到比较掩码再以Reg::Select(dstVreg, brcOneReg, brcZeroReg, cmpMask)依据掩码选择常量 1 或 0 写入目的寄存器——等于 0 的元素得到 1True非 0 元素得到 0False从而完成逻辑取反。brcOneReg/brcZeroReg由Reg::Duplicate分别复制 1u 与 0u 得到。2.3 函数原型与模板参数template const LogicalNotConfig config DEFAULT_LOGICAL_NOT_CONFIG, typename T, typename U __aicore__ inline void LogicalNot(const LocalTensorT dst, const LocalTensorU src, const uint32_t count)模板参数说明参数名描述configLogicalNot 算法的相关配置可选配类型为LogicalNotConfig。其中isReuseSource为预留参数传入默认值false即可。T目的操作数数据类型仅支持bool。U源操作数数据类型支持bool、int8_t、uint8_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、int64_t、uint64_t。LogicalNotConfig的结构体定义与默认值来自仓库 logical_not_utils.hstruct LogicalNotConfig { bool isReuseSource; }; constexpr LogicalNotConfig DEFAULT_LOGICAL_NOT_CONFIG {false};Kernel 侧编译期还会通过static_assert强校验数据类型见 logical_not_common_impl.hT仅允许boolU仅允许上文列出的 12 种类型不满足直接编译失败将错误前移到编译期。2.4 接口参数说明参数名输入/输出描述dst输出目的操作数。类型为 LocalTensor支持的 TPosition 为 VECIN/VECCALC/VECOUT。src输入源操作数。类型为 LocalTensor支持的 TPosition 为 VECIN/VECCALC/VECOUT。count输入参与计算的元素个数。返回值无。2.5 约束说明不支持源操作数与目的操作数地址重叠。该约束在实现中通过参数校验执行LogicalNotImpl调用CHECK_FUNC_HIGHLEVEL_API进而触发 logical_not_check.h 中的CheckFuncLogicalNot参数校验其中 logical_not_check_common.h 的VerifyingParameters依次完成ReuseSourceCheckFuncBasicClass::IsReuseSourceVerifyingParameters、CalCountVerifyingParameters校验 count 与 tensor 关系、TensorVerifyingParameters以及TensorReuseVerifyingParameters校验 dst/src 地址不重叠。操作数地址对齐要求参见 通用地址对齐约束。2.6 调用示例与运行结果文档给出的最小调用示例AscendC::LocalTensorbool dst; AscendC::LocalTensorhalf src; uint32_t count 512; // 参与计算的元素个数 AscendC::LogicalNot(dst, src, count);结果示例如下输入数据src: [1, 2, 0, -1, -2, 0, 3, 4, 0, -3, -4, 0, 5, 6, 0, -5, -6, 0, ... 0] 输出数据dst: [False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, ... True]可见规则为非零含负数→False零 →True。仓库单元测试 test_operator_logical_not.cpp 采用相反方向验证输入全部初始化为1非零期望输出全部为0x00即全部为 False并覆盖了bool→bool、bool→uint8_t/int8_t/half/bfloat16_t/uint16_t/int16_t/float/uint32_t/int32_t/uint64_t/int64_t共 12 种类型组合以及 32/256/1024 三种数据规模是完整的参数化回归用例。2.7 底层向量化实现原理源码视角从 logical_not_common_impl.h 的实现看向量化计算按以下步骤进行分块切分以单次向量指令可处理的元素数oneRepElm GetVecLen() / sizeof(U)为单位64 位类型乘以 2 的 repeat stride通过CeilDivision(count, oneRepElm)计算repeatTime循环执行向量指令。掩码更新每轮用Reg::UpdateMaskU, Trait(count)生成有效元素掩码处理 count 不能整除 oneRepElm 的尾块。比较取反CompareScalarU, CMPMODE::EQ与 0 比较Select按掩码选择 1/0。位宽适配当sizeof(U) 2half、bfloat16_t、int16_t、uint16_t时执行一次Reg::MaskPack当sizeof(U) 4 || 8float、int32_t、uint32_t、int64_t、uint64_t时执行两次Reg::MaskPack以适配 bool 输出的 1 字节位宽64 位类型额外使用RegTraitNumTwo寄存器特质每个寄存器处理两个 64 位元素并设置LOGICAL_NOT_B64_REPEAT_STRIDE 2当U为bool时按uint8_t进行读取Reg::RegTensoruint8_t与 bool 的 1 字节存储语义对齐。这些细节对普通用户是透明的但有助于理解不同源类型在向量引擎上的实际指令开销差异。三、Host 侧临时空间接口 GetLogicalNotMaxMinTmpSize3.1 功能说明Kernel 侧 LogicalNot 接口的计算需要开发者预留/申请临时空间。GetLogicalNotMaxMinTmpSize在 Host 侧获取预留/申请的最大和最小临时空间大小开发者基于该范围选择合适的空间大小作为Tiling 参数传递到 Kernel 侧使用为保证功能正确预留/申请的临时空间大小不能小于最小临时空间大小在最小临时空间 ~ 最大临时空间范围内随着临时空间增大Kernel 侧接口计算性能会有一定程度的优化提升。为达到更好性能开发者可根据实际内存使用情况在范围内选择。3.2 函数原型与参数说明void GetLogicalNotMaxMinTmpSize(const platform_ascendc::PlatformAscendC ascendcPlatform, const AscendC::TensorShape srcShape, const uint32_t typeSize, const bool isReuseSource, uint32_t maxValue, uint32_t minValue)参数名输入/输出功能ascendcPlatform输入平台信息PlatformAscendC的定义参见构造及析构函数。srcShape输入输入 shape 信息类型为 AscendC::TensorShape。typeSize输入输入数据类型大小字节。例如输入为 half 时传入 2。isReuseSource输入预留参数传入默认值false即可。maxValue输出完成计算所需的最大临时空间大小字节超出该值的空间不会被接口使用最大空间为 0 表示计算不需要临时空间。注意 maxValue 仅作参考可能大于 Unified BufferUB剩余空间此时需按 UB 剩余空间选取合适的临时空间大小。minValue输出完成计算所需的最小临时空间大小字节预留空间不能小于该值为 0 表示不需要临时空间。返回值无。约束说明无。3.3 源码实现与当前取值Tiling 实现位于 logical_not_tiling_impl.cpp入口先做三类 Host 侧参数校验SrcShapeSizeVerifyingParametersshape 元素数 × typeSize 不超限、TypeSizeVerifyingParameterstypeSize 必须属于 {1, 2, 4, 8}对应源码常量LOGICAL_NOT_UINT8/UINT16/UINT32/UINT64_SIZE、IsReuseSourceVerifyingParametersisReuseSource 必须为 false随后校验 NPU 架构为 DAV_3510/DAV_9201当前实现直接返回maxValue 0、minValue 0即当前架构下 LogicalNot 计算不需要临时空间。配套的 Tiling 单元测试位于 test_tiling.cppTestLogicalNotTiling用typeSize 2half与shapeDims {128, 128}调用接口并断言minValue 0 maxValue 0。3.4 调用示例// 输入shape信息为1024; 算子输入的数据类型为half; 不允许修改源操作数 std::vectorint64_t shape_vec {1024}; AscendC::TensorShape shape(shape_vec); uint32_t maxValue 0; uint32_t minValue 0; auto plat platform_ascendc::PlatformAscendC(context-GetPlatformInfo()); AscendC::GetLogicalNotMaxMinTmpSize(plat, shape, 2, false, maxValue, minValue);四、Host 侧临时空间因子接口 GetLogicalNotTmpBufferFactorSize4.1 功能说明该接口用于获取maxLivedNodeCount与extraBuf两个因子。在固定空间大小的情况下通过这两个因子可以推算算子单次最大计算元素数量maxLivedNodeCount临时空间是单次计算数据量所占空间的多少倍最大存活节点数extraBuf使用的额外临时空间大小字节。4.2 单接口推算公式算子实现需要调用 LogicalNot 接口开发者为其预留currBuff大小的空间注意currBuff表示接口计算可用的空间需去除用户输入输出等空间利用本接口得到的maxLivedNodeCount、extraBuf输出值可推导单次最大计算元素数量为currentShapeSize (currBuff - extraBuf) / maxLivedNodeCount / typeSize4.3 多接口推算公式算子实现需要调用两个 Kernel 侧 APIKernelIntf1、KernelIntf2利用两个GetXxxTmpBufferFactorSizeXxx 为所调用的两个高阶 API接口的两组输出值以及当前现有临时空间推导单次最大计算元素数量为currentShapeSize1 (currBuff - extraBuf1) / maxLivedNodeCount1 / typeSizecurrentShapeSize2 (currBuff - extraBuf2) / maxLivedNodeCount2 / typeSizecurrentShapeSize min(currentShapeSize1, currentShapeSize2)4.4 注意事项接口获取的maxLivedNodeCount可能为 0计算时需要判断该值非 0避免除零错误当反推出的currentShapeSize * typeSize 256B时currentShapeSize按照256B / typeSize的值向上取整即保证单次计算数据量不低于 256 字节的向量对齐下限。4.5 函数原型与参数说明void GetLogicalNotTmpBufferFactorSize(const platform_ascendc::PlatformAscendC ascendcPlatform, const uint32_t typeSize, uint32_t maxLivedNodeCount, uint32_t extraBuf)参数名输入/输出功能ascendcPlatform输入平台信息PlatformAscendC的定义参见构造及析构函数。typeSize输入输入数据类型大小字节例如 half 传入 2。maxLivedNodeCount输出最大存活节点数表示临时空间是单次计算数据量所占空间的多少倍。extraBuf输出使用的额外临时空间大小字节。返回值无。约束说明无除以零需由调用方规避见 4.4。与 3.3 节同理当前 Tiling 实现logical_not_tiling_impl.cpp在校验 typeSize 与 NPU 架构后返回maxLivedNodeCount 0、extraBuf 0即当前无需额外临时空间测试用例TestLogicalNotTiling亦断言两者为 0。4.6 调用示例uint32_t maxLivedNodeCount 0; uint32_t extraBuf 0; auto plat platform_ascendc::PlatformAscendC(context-GetPlatformInfo()); AscendC::GetLogicalNotTmpBufferFactorSize(plat, typeSize, maxLivedNodeCount, extraBuf);五、典型使用流程与实战建议结合三节文档与仓库代码在一个真实算子的 Tiling 阶段完整使用 LogicalNot 的标准流程为Host 侧确定临时空间调用GetLogicalNotMaxMinTmpSize获取[minValue, maxValue]区间当前实现两者均为 0表示无需为 LogicalNot 单独预留临时空间可直接将 Tiling 参数置 0 或忽略。多接口叠加时校验空间若算子还调用其他高阶接口用各接口的GetXxxTmpBufferFactorSize输出按min()取交集确保空间同时满足所有接口。Kernel 侧执行计算在 Kernel 中按 Tiling 参数切分数据循环调用LogicalNot(dst, src, count)遵守dst/src 地址不重叠、TPosition 取 VECIN/VECCALC/VECOUT、count 为元素个数、地址满足对齐要求三条约定。数据流组织参考 test_operator_logical_not.cpp 中的KernelLogicalNot框架——TPipe初始化VECIN/VECOUT队列CopyIn用DataCopy搬入Compute中PipeBarrierPIPE_ALL后调用LogicalNotCopyOut处理非 32 字节对齐的尾数数据。需要完整调用样例时可继续查看 更多样例 与示例工程 examples/01_simd_cpp_api/04_advanced_api/10_math 中同属逻辑运算家族的 logicaland 示例。六、总结LogicalNot 是 asc-devkit 高阶数学计算接口中实现逻辑取反的最小化接口Kernel 侧仅需dst/src/count三个参数即可完成 bool 化取反支持 12 种源数据类型其配套的两个 Host 侧接口给出了临时空间查询与单次计算量推算的标准范式适用于所有GetXxxTmpBufferFactorSize家族接口。需要特别注意的是该接口当前仅在 Ascend 950 系列产品上可用且 dst 与 src 不允许地址重叠。从源码实现看该接口当前在 DAV_3510/DAV_9201 架构上不需要临时空间max/min 均为 0因此接入现有算子框架的成本极低可直接复用高阶 API 的标准 Tiling 与校验链路。关联文档与源码索引接口文档LogicalNotGetLogicalNotMaxMinTmpSizeGetLogicalNotTmpBufferFactorSize接口声明include/adv_api/math/logical_not.h、include/adv_api/math/logical_not_tiling.h、include/adv_api/math/logical_not_utils.h实现源码impl/adv_api/detail/math/logical_not/logical_not_common_impl.h、impl/adv_api/tiling/math/logical_not_tiling_impl.cpp参数校验impl/adv_api/detail/api_check/kernel_check/math/logical_not/logical_not_check.h、logical_not_check_common.h测试用例tests/api/adv_api/math/logical_not/test_operator_logical_not.cpp、tests/api/adv_api/tiling/test_tiling.cpp赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐Ascend C LogicalAnd 逻辑与高阶 API 实战基于 asc-devkit 的逐元素与运算算子样例解析Ascend C LogicalAnd 逻辑与高阶 API 实战基于 asc devkit 的逐元素与运算算子样例解析 本文以 asc devkit 开源仓库人工智能深度学习算子库CANNAscendAscendC 高阶 API 实战基于 Xor 接口的按元素异或算子样例asc-devkitAscendC 高阶 API 实战基于 Xor 接口的按元素异或算子样例asc devkit 本篇文章以 asc devkit 仓库中的 Xor 高阶 A人工智能深度学习算子库CANNAscendAB Download Manager 浏览器扩展跨浏览器兼容Edge 两条装法一次讲清AB Download Manager 浏览器扩展跨浏览器兼容Edge 两条装法一次讲清 AB Download Manager 是一款开源下载管理器它的人工智能深度学习算子库CANNAscend上一篇Magic CLI安全最佳实践保护你的API密钥和shell历史数据下一篇hass-xiaomi-miot文档翻译指南为你的母语贡献小米集成文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考