CANN/opbase算子开发API接口介绍
nnopbase接口列表【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase无论是CANN内置算子或自定义算子例如Transformer、NN类均可通过aclnn API也称为Level2层接口实现底层算子调用。针对开发aclnn API场景本章提供开发过程中依赖的底层框架能力接口和基础张量操作接口也称为Level0层接口。框架能力接口提供实现aclnn API的基础能力接口比如算子执行器opExecutor处理、数据类型/格式/shape等操作具体如表1所示还包括常用类和宏具体参见表2、表3。基础张量操作接口提供实现aclnn API的基础张量操作接口比如Tensor数据类型转换、shape重构等具体如表4所示。框架能力接口头文件说明调用本章接口时请按实际情况include依赖的头文件一般定义在${INSTALL_DIR}/include目录。其中${INSTALL_DIR}表示为CANN软件安装后的路径以root安装举例安装后路径为/usr/local/Ascend/cann。表 1接口列表接口分类说明所属头文件bfloat16详细介绍了bfloat16数据类型在CPU侧的实现类。aclnn/opdev/bfloat16.hcommon_types详细介绍了aclTensor、aclScalar等基础的aclnn数据结构。aclnn/opdev/common_types.hdata_type_utils提供了DataType相关的基础接口例如获取指定DataType的size等。aclnn/opdev/data_type_utils.hfast_vector详细介绍了FastVector数据类型该类型为aclnn中实现的高效vector数据结构。说明该头文件定义的接口均为预留接口开发者无需关注。aclnn/opdev/fast_vector.hformat_utils提供了Format相关的基础接口。aclnn/opdev/format_utils.hfp16_t详细介绍了float16数据类型在CPU侧的实现类。aclnn/opdev/fp16_t.hfloat4_e1m2详细介绍了Float4E1M2数据类型在CPU侧的实现类。aclnn/opdev/float4_e1m2.hfloat4_e2m1详细介绍了Float4E2M1数据类型在CPU侧的实现类。aclnn/opdev/float4_e2m1.hfloat6_e2m3详细介绍了Float6E2M3数据类型在CPU侧的实现类。aclnn/opdev/float6_e2m3.hfloat6_e3m2详细介绍了Float6E3M2数据类型在CPU侧的实现类。aclnn/opdev/float6_e3m2.hfloat8_e4m3fn详细介绍了Float8E4M3FN数据类型在CPU侧的实现类。aclnn/opdev/float8_e4m3fn.hfloat8_e5m2详细介绍了Float8E5M2数据类型在CPU侧的实现类。aclnn/opdev/float8_e5m2.hfloat8_e8m0详细介绍了Float8E8M0数据类型在CPU侧的实现类。aclnn/opdev/float8_e8m0.hhifloat4详细介绍了HiFloat4数据类型在CPU侧的实现类。aclnn/opdev/hifloat4.hhifloat8详细介绍了HiFloat8数据类型在CPU侧的实现类。aclnn/opdev/hifloat8.hframework_op详细介绍了框架对外提供的从host侧到device侧拷贝能力。aclnn/opdev/framework_op.hmake_op_executor对外提供初始化aclOpExecutor的宏声明。说明该头文件定义的接口均为预留接口开发者无需关注。aclnn/opdev/make_op_executor.hobject详细介绍了aclnn中aclTensor等基础数据结构的基类Object类用于重载实现new、delete方法。aclnn/opdev/object.hop_arg_def详细介绍了OpArgContext类并对外提供OP_INPUT等宏声明。aclnn/opdev/op_arg_def.hop_cache详细介绍了OpExecCache及相关类用于完成aclnn缓存提升运行性能。aclnn/opdev/op_cache.hop_cache_container详细介绍了带LRU淘汰机制的aclnn缓存容器。aclnn/opdev/op_cache_container.hop_config提供了算子运行时相关的配置信息如确定性计算开关等。aclnn/opdev/op_config.hop_def定义基础枚举及常量例如精度模式OpImplMode等。aclnn/opdev/op_def.hop_dfx详细介绍了DfxGuard类用于接口打印及上报profiling。aclnn/opdev/op_dfx.haclnn返回码定义了aclnn错误码。aclnn/opdev/op_errno.hop_executor详细介绍了aclOpExecutor类。aclnn/opdev/op_executor.hop_log定义aclnn中日志打印宏。aclnn/opdev/op_log.hplatform详细介绍了PlatformInfo类用于存放SOC平台信息。aclnn/opdev/platform.hpool_allocator详细介绍了PoolAllocator类用于实现aclnn内部的CPU内存池。aclnn/opdev/pool_allocator.hshape_utils提供了shape相关的基础操作例如shape打印等。aclnn/opdev/shape_utils.hsmall_vector详细介绍了SmallVector类该类为aclnn中实现的高效vector数据结构主要针对已知数据量较小的场景。aclnn/opdev/small_vector.htensor_view_utils提供了对于View类的基础操作例如判断aclTensor是否连续等。aclnn/opdev/tensor_view_utils.hdata_type_utils提供了DataType相关的基础接口例如判断指定DataType是否为整数类型等。aclnn/opdev/op_common/data_type_utils.haicpu_args_handler提供了AI CPU相关的组合计算任务的处理逻辑例如拼接计算任务相关的参数等。aclnn/opdev/aicpu/aicpu_args_handler.haicpu_ext_info_handle提供了AI CPU相关的计算任务拓展参数的处理逻辑例如拼接解析拓展参数的接口。aclnn/opdev/aicpu/aicpu_ext_info_handle.haicpu_task提供了AI CPU任务设置、下发等逻辑例如设置调用哪个AI CPU算子设置算子输入、输出等接口。aclnn/opdev/aicpu/aicpu_task.haicpu_utilsAI CPU任务需要的一些公共接口。aclnn/opdev/aicpu/aicpu_utils.h表 2常用宏表宏名称说明所属头文件DFX_IN在L2_DFX_PHASE_1中用于打包所有的host侧API输入参数。aclnn/opdev/op_dfx.hDFX_OUT在L2_DFX_PHASE_1中用于打包所有的host侧API输出参数。aclnn/opdev/op_dfx.hL0_DFX必须在host侧API L0接口中使用用于接口及L0接口入参打印。aclnn/opdev/op_dfx.hL2_DFX_PHASE_1必须在一阶段接口最前方调用用于接口及一阶段入参打印。aclnn/opdev/op_dfx.hL2_DFX_PHASE_2必须在二阶段接口最前方调用用于接口打印。aclnn/opdev/op_dfx.hOP_TYPE_REGISTER必须在L0接口最开始处使用用于注册L0算子。aclnn/opdev/op_dfx.hOP_ATTRADD_TO_LAUNCHER_LIST_AICORE中打包算子属性参数。aclnn/opdev/op_arg_def.hOP_EMPTY_ARGADD_TO_LAUNCHER_LIST_AICORE中用于占位一个空的输入或输出。aclnn/opdev/op_arg_def.hOP_INPUTADD_TO_LAUNCHER_LIST_AICORE中打包算子输入aclTensor。aclnn/opdev/op_arg_def.hOP_MODEADD_TO_LAUNCHER_LIST_AICORE中打包算子运行选项例如是否开启HF32。aclnn/opdev/op_arg_def.hOP_OUTPUTADD_TO_LAUNCHER_LIST_AICORE中打包算子输出aclTensor。aclnn/opdev/op_arg_def.hOP_OUTSHAPEADD_TO_LAUNCHER_LIST_AICORE中针对第三类算子设置存放输出shape的aclTensor。aclnn/opdev/op_arg_def.hOP_OPTIONADD_TO_LAUNCHER_LIST_AICORE中打包算子指定的精度模式。aclnn/opdev/op_arg_def.hOP_WORKSPACEADD_TO_LAUNCHER_LIST_AICORE中打包算子显式指定的workspace参数。aclnn/opdev/make_op_executor.hCREATE_EXECUTOR创建一个UniqueExecutor对象该对象为aclOpExecutor的生成工厂类。aclnn/opdev/make_op_executor.hINFER_SHAPE针对指定算子运行其infershape函数推导输出shape。aclnn/opdev/make_op_executor.hADD_TO_LAUNCHER_LIST_AICORE创建某个AICore算子的执行任务并置入aclOpExecutor的执行队列在二阶段时执行。aclnn/opdev/make_op_executor.hOP_ATTR_NAMESString类型的vector打包AI CPU算子的字符类型属性。aclnn/opdev/aicpu/aicpu_task.hADD_TO_LAUNCHER_LIST_AICPU创建某个AI CPU算子的执行任务并置入aclOpExecutor的执行队列在二阶段时执行。aclnn/opdev/aicpu/aicpu_task.h表 3常用class和struct表class/struct名称说明所属头文件aclOpExecutor用于表示算子执行器记录整个host侧API运行信息的上下文结构如L2接口执行过程中的计算图、L0算子launch子任务、workspace地址和大小等信息。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见op_executor。aclnn/opdev/op_executor.haclTensor用于表示一个张量对象包括描述张量的shape、dtype、format、address等信息数据可以放在host侧或device侧。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见common_types。aclnn/opdev/common_types.haclScalar用于表示一个标量对象数据一般放在host侧。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见common_types。aclnn/opdev/common_types.haclTensorList用于表示一组aclTensor类型组成的列表对象。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见common_types。aclnn/opdev/common_types.haclScalarList用于表示一组aclScalar类型组成的列表对象。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见common_types。aclnn/opdev/common_types.haclBoolArray用于表示一个布尔类型的数组对象数据一般放在host侧。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见common_types。aclnn/opdev/common_types.haclIntArray用于表示一个int64_t类型的数组对象数据一般放在host侧。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见common_types。aclnn/opdev/common_types.haclFloatArray用于表示一个fp32类型的数组对象数据一般放在host侧。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见common_types。aclnn/opdev/common_types.haclFp16Array用于表示一个fp16类型的数组对象数据一般放在host侧。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见common_types。aclnn/opdev/common_types.haclBf16Array用于表示一个bf16类型的数组对象数据一般放在host侧。该类定义的成员变量为私有类型开发者无需关注定义的成员函数参见common_types。aclnn/opdev/common_types.hSmallVector该类使用内部内存池实现vector容器基础功能与C标准库中std::vector容器相同无需每次扩容都申请内存避免影响性能。其定义的成员变量为私有类型开发者无需关注定义的成员函数参见small_vector。aclnn/opdev/small_vector.hOpExecMode用于表示算子运行模式的枚举类定义参见OpExecMode。aclnn/opdev/op_def.hOpImplMode用于表示算子精度模式的枚举类定义参见OpImplMode。aclnn/opdev/op_def.hSmallVector类使用说明op::FVector本质是存储容量长度为8的SmallVector。namespace op { templatetypename T, size_t N 8 using FVector op::internal::SmallVectorT, N, op::internal::PoolAllocatorT; }op::Strides本质是存储容量长度为25的FVector元素类型int64_t存储stride信息。namespace op { constexpr uint64_t MAX_DIM_NUM 25; using Strides FVectorint64_t, MAX_DIM_NUM; }op::ShapeVector本质是存储容量长度为25的FVector元素类型int64_t存储shape信息。namespace op { constexpr uint64_t MAX_DIM_NUM 25; using ShapeVector FVectorint64_t, MAX_DIM_NUM; }基础张量操作接口表 4接口列表接口名说明所属头文件Cast将输入tensor转换为指定的数据类型。aclnn_kernels/cast.hContiguous将非连续tensor转换为连续tensor。aclnn_kernels/contiguous.hViewCopy将连续tensor搬运到连续或非连续tensor上。aclnn_kernels/contiguous.hPad将输入tensor按照paddings的大小对各个维度进行填充填充值为0。aclnn_kernels/pad.hReshape将输入tensor x的shape转换成该函数的第二个参数shape。aclnn_kernels/reshape.hSlice从输入tensor中提取所需的切片。aclnn_kernels/slice.hTranspose将输入tensor x的shape按指定维度的排列顺序perm进行转置并输出。aclnn_kernels/transpose.hTransDataj将输入tensor的format转换为指定的dstPrimaryFormat。aclnn_kernels/transdata.hTransDataSpecial将输入tensor的format转换为指定的dstPrimaryFormat与TransData类似。aclnn_kernels/transdata.hReFormat在指定format和输入x的维度相同时将输入数据格式设置为目标format。aclnn_kernels/transdata.hIsNullptr判断输入的指针是否为空。aclnn_kernels/op_error_check.h基本概念Level0层接口简称L0层接口表示调用单Kernel的Host侧API提供了细颗粒API单Kernel下发和算子API开发的基础结构体如Tensor定义等和公共基础能力如workspace复用、引擎调度等上层应用或者L2层接口可通过L0接口的快速组装实现高性能计算。L0接口返回值类型是Tensor的类型结构如aclTensor*、std::tupleaclTensor*, aclTensor*、aclTensorList*最后一个参数固定为aclOpExecutor *executor类型与名称均不可变示例如下aclTensor* AddNd(aclTensor *x1, aclTensor *x2, aclOpExecutor *executor)L0接口命名空间为“namespace l0op”接口名为“${op_type}${format}${dtype}”其中${op_type}为算子名${format}为算子输入/输出数据格式${dtype}为算子输入/输出数据类型对于非常规的输入/输出数据类型需带上数据类型匹配关系。调用示例如下l0op::AddNd //Add算子输入均按ND计算 l0op::MatMulNdFp162Fp32 //MatMul算子输入输出均按ND格式计算并且2代表“To”表示输入fp16、输出fp32 l0op::MatMulNzFp162Fp16 //MatMul算子输入输出均按NZ格式计算并且2代表“To”表示输入与输出都是fp16Level2层接口简称L2层接口是对L0层接口的高层级封装内部通过调用单个或多个L0接口实现更灵活功能表示更上层的Host侧API。该类接口提供单算子直调方式屏蔽了算子内部实现逻辑用户直接调用L2接口即可实现调用算子。L2接口返回值类型是aclnnStatus一般包括获取workspaceSize和算子执行“两段式接口”aclnnStatus aclnnXxxGetWorkspaceSize(const aclTensor *src, ..., aclTensor *out, ..., uint64_t *workspaceSize, aclOpExecutor **executor); aclnnStatus aclnnXxx(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream);aclnnXxxGetWorkspaceSize最后两个参数固定为(uint64_t *workspaceSize, aclOpExecutor **executor)名称和类型均不可变。aclnnXxx接口参数固定为(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream)。其中aclnnXxxGetWorkspaceSize为第一段接口主要用于计算本次API调用过程中需要多少workspace内存获取到本次计算所需的workspaceSize后按照workspaceSize申请NPU内存然后调用第二段接口aclnnXxx执行计算_。“Xxx”表示对应的算子类型如Add算子。_说明workspace是指除输入/输出外API在AI处理器上完成计算所需要的临时内存workspaceSize是指workspace内存大小。二阶段接口aclnnXxx(...)不能重复调用如下调用方式会出现异常aclnnXxxGetWorkspaceSize(...) aclnnXxx(...) aclnnXxx(...)原地算子接口表示在原地址进行更新操作的算子接口其计算过程中输入和输出为同一地址以减少不必要的内存占用。aclnn类原地算子接口名一般定义为aclnnInplaceXxxGetWorkspaceSize一阶段接口、aclnnInplaceXxx二阶段接口。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻