简介
基本概念
- Level0接口
简称L0接口,表示基础Kernel的API,这些API直接调用亲和芯片的Kernel。
L0接口返回值类型是Tensor类型结构,如aclTensor*、std::tuple<aclTensor*, aclTensor*>、aclTensorList*,最后参数固定为aclOpExecutor *executor,类型与名称均不可变,示例如下:
1
aclTensor* AddNd(aclTensor *x1, aclTensor *x2, aclOpExecutor *executor)
L0接口命名空间为“namespace l0op”,接口名为“${op_type}${format}${dtype}”,其中${op_type}为算子名,${format}为算子输入/输出数据格式,${dtype}为算子输入/输出数据类型。调用示例如下:
1 2
l0op::AddNd //Add算子输入都是按ND计算 l0op::MatMulNdFp162Fp32 //MatMul算子输入输出都按ND格式计算,并且输入是fp16,输出是fp32
- Level2接口
简称L2接口,表示更高一层的API(也称为Host API),可以调用多个L0接口实现更灵活的功能,同时对标框架API功能,便于框架适配和脚本迁移。
L2接口返回值类型是aclnnStatus,一般定义为“两段式接口”:
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内存;获取到本次API计算需要的workspace大小后,按照workspaceSize大小申请昇腾AI处理器内存,然后调用二阶段接口aclnnXxx完成计算。
- workspace是指除输入/输出外,API在昇腾AI处理器上完成计算所需要的临时内存。
- 二阶段接口aclnnXxx(...)不能重复调用,如下调用方式会出现异常:
aclnnXxxGetWorkspaceSize(...) aclnnXxx(...) aclnnXxx(...)
- broadcast关系
broadcast(广播)描述了算子在运算期间如何处理具有不同形状的数组。在某些情况下,较小的数组可以“广播至”较大的数组,使两者shape互相兼容。更多关于广播技术的介绍可以参考NumPy官网。
整体说明
本章主要介绍单算子API执行涉及的框架基础接口、宏、类等,还包括基础核函数接口(即Level0接口)。详细阐述了函数原型、函数功能、参数说明、约束与限制、调用示例等,指导开发者快速自定义NN(Neural Network)基础类和融合类算子(一般以aclnn为前缀)或者对CANN内置的NN类算子进行定制化修改,以支撑各式各样的AI业务。
调用单算子API执行相关的接口时,开发者需要根据实际情况include依赖的头文件,各头文件路径如下:
- 框架能力接口头文件一般在${INSTALL_DIR}/runtime/include目录下,内容如表1所示。
- 基础核函数接口头文件一般在${INSTALL_DIR}/opp/include目录下,内容如表2所示。
其中${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。例如,若安装的Ascend-cann-toolkit软件包,则安装后文件存储路径为:$HOME/Ascend/ascend-toolkit/latest。
接口分类 |
说明 |
接口所属头文件 |
---|---|---|
详细介绍了bfloat16数据类型在CPU侧的实现类。 |
aclnn/opdev/bfloat16.h |
|
详细介绍了aclTensor、aclScalar等基础的aclnn数据结构。 |
aclnn/opdev/common_type.h |
|
提供了DataType相关的基础接口,例如获取指定DataType的size等。 |
aclnn/opdev/data_type_utils.h |
|
预留接口,开发者无需关注。 |
详细介绍了FastVector数据类型,该类型为aclnn中实现的高效vector数据结构。 |
aclnn/opdev/fast_vector.h |
提供了Format相关的基础接口。 |
aclnn/opdev/format_utils.h |
|
详细介绍了float16数据类型在CPU侧的实现类。 |
aclnn/opdev/fp16_t.h |
|
详细介绍了框架对外提供的从host侧到device侧拷贝能力。 |
aclnn/opdev/framework_op.h |
|
预留接口,开发者无需关注。 |
对外提供初始化aclOpExecutor的宏声明。 |
aclnn/opdev/make_op_executor.h |
详细介绍了aclnn中aclTensor等基础数据结构的基类Object类,用于重载实现new、delete方法。 |
aclnn/opdev/object.h |
|
详细介绍了OpArgContext类,并对外提供OP_INPUT等宏声明。 |
aclnn/opdev/op_arg_def.h |
|
详细介绍了OpExecCache及相关类,用于完成aclnn缓存,提升运行性能。 |
aclnn/opdev/op_cache.h |
|
详细介绍了带LRU淘汰机制的aclnn缓存容器。 |
aclnn/opdev/op_cache_container.h |
|
定义基础枚举及常量,例如精度模式OpImplMode等。 |
aclnn/opdev/op_def.h |
|
详细介绍了DfxGuard类,用于接口打印及上报profiling。 |
aclnn/opdev/op_dfx.h |
|
定义了aclnn错误码。 |
aclnn/opdev/op_errno.h |
|
详细介绍了aclOpExecutor类。 |
aclnn/opdev/op_executor.h |
|
定义aclnn中日志打印宏。 |
aclnn/opdev/op_log.h |
|
详细介绍了PlatformInfo类,用于存放SOC平台信息。 |
aclnn/opdev/platform.h |
|
详细介绍了PoolAllocator类,用于实现aclnn内部的CPU内存池。 |
aclnn/opdev/pool_allocator.h |
|
提供了shape相关的基础操作,例如shape打印等。 |
aclnn/opdev/shape_utils.h |
|
详细介绍了SmallVector类,该类为aclnn中实现的高效vector数据结构,主要针对已知数据量较小的场景。 |
aclnn/opdev/small_vector.h |
|
提供了对于View类的基础操作,例如判断aclTensor是否连续等。 |
aclnn/opdev/tensor_view_utils.h |
|
提供了DataType相关的基础接口,例如判断指定DataType是否为整数类型等。 |
aclnn/opdev/op_common/data_type_utils.h |
|
提供了AI CPU相关的组合计算任务的处理逻辑,例如拼接计算任务相关的参数等。 |
aclnn/opdev/aicpu/aicpu_args_handler.h |
|
提供了AI CPU相关的计算任务拓展参数的处理逻辑,例如拼接解析拓展参数的接口。 |
aclnn/opdev/aicpu/aicpu_ext_info_handle.h |
|
提供了AI CPU任务设置、下发等逻辑,例如设置调用哪个AI CPU算子,设置算子输入、输出等接口。 |
aclnn/opdev/aicpu/aicpu_task.h |
|
AI CPU任务需要的一些公共接口。 |
aclnn/opdev/aicpu/aicpu_uitls.h |
接口名 |
说明 |
接口所属头文件 |
---|---|---|
将输入tensor转换为指定的数据类型。 |
aclnn_kernels/cast.h |
|
将非连续tensor转换为连续tensor。 |
aclnn_kernels/contiguous.h |
|
将连续tensor搬运到连续或非连续tensor上。 |
||
将输入tensor按照paddings的大小对各个维度进行填充,填充值为0。 |
aclnn_kernels/pad.h |
|
将输入tensor x的shape转换成该函数的第二个参数shape。 |
aclnn_kernels/reshape.h |
|
从输入tensor中提取想要的切片。 |
aclnn_kernels/slice.h |
|
将输入tensor x的shape按指定维度的排列顺序perm进行转置并输出。 |
aclnn_kernels/transpose.h |
|
将输入tensor的format转换为指定的dstPrimaryFormat。 |
aclnn_kernels/transdata.h |
|
将输入tensor的format转换为指定的dstPrimaryFormat,与TransData类似。 |
||
在指定format和输入x的维度相同时,将输入数据格式设置为目标format。 |
||
判断输入的指针是否为空。 |
aclnn_kernels/common/op_error_check.h |
常用宏和类
宏名称 |
宏说明 |
宏所属头文件 |
---|---|---|
在L2_DFX_PHASE_1中,用于打包所有的host侧API输入参数。 |
aclnn/opdev/op_dfx.h |
|
在L2_DFX_PHASE_1中,用于打包所有的host侧API输出参数。 |
||
必须在host侧API L0接口中使用,用于接口及L0接口入参打印。 |
||
必须在一阶段接口最前方调用,用于接口及一阶段入参打印。 |
||
必须在二阶段接口最前方调用,用于接口打印。 |
||
必须在L0接口最开始处使用,用于注册L0算子。 |
||
ADD_TO_LAUNCHER_LIST_AICORE中,打包算子属性参数。 |
aclnn/opdev/op_arg_def.h |
|
ADD_TO_LAUNCHER_LIST_AICORE中,用于占位一个空的输入或输出。 |
||
ADD_TO_LAUNCHER_LIST_AICORE中,打包算子输入aclTensor。 |
||
ADD_TO_LAUNCHER_LIST_AICORE中,打包算子运行选项,例如是否使能HF32。 |
||
ADD_TO_LAUNCHER_LIST_AICORE中,打包算子输出aclTensor。 |
||
ADD_TO_LAUNCHER_LIST_AICORE中,针对第三类算子,设置存放输出shape的aclTensor。 |
||
ADD_TO_LAUNCHER_LIST_AICORE中,打包算子指定的精度模式。 |
||
ADD_TO_LAUNCHER_LIST_AICORE中,打包算子显式指定的workspace参数。 |
||
创建一个UniqueExcutor对象,该对象为aclOpExecutor的生成工厂类。 |
aclnn/opdev/make_op_executor.h |
|
针对指定算子,运行其infershape函数,推导输出shape。 |
||
创建某个AICore算子的执行任务,并置入aclOpExecutor的执行队列,在二阶段时执行。 |
||
String类型的vector,打包AI CPU算子的字符类型属性 |
aclnn/opdev/aicpu/aicpu_task.h |
|
创建某个AI CPU算子的执行任务,并置入aclOpExecutor的执行队列,在二阶段时执行。 |
类名称 |
类说明 |
类所属头文件 |
---|---|---|
aclOpExecutor |
用于表示算子执行器,记录整个host侧API运行信息的上下文结构,如L2接口执行过程中的计算图、L0算子launch子任务、workspace地址和大小等信息。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见op_executor。 |
aclnn/opdev/op_executor.h |
aclTensor |
用于表示一个张量对象,包括描述张量的shape、dtype、format、address等信息,数据可以放在host侧或device侧。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见common_types。 |
aclnn/opdev/common_type.h |
aclScalar |
用于表示一个标量对象,数据一般放在host侧。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见common_types。 |
|
aclTensorList |
用于表示一组aclTensor类型组成的列表对象。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见common_types。 |
|
aclScalarList |
用于表示一组aclScalar类型组成的列表对象。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见common_types。 |
|
aclBoolArray |
用于表示一个布尔类型的数组对象,数据一般放在host侧。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见common_types。 |
|
aclIntArray |
用于表示一个int64_t类型的数组对象,数据一般放在host侧。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见common_types。 |
|
aclFloatArray |
用于表示一个fp32类型的数组对象,数据一般放在host侧。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见common_types。 |
|
aclFp16Array |
用于表示一个fp16类型的数组对象,数据一般放在host侧。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见common_types。 |
|
aclBf16Array |
用于表示一个bf16类型的数组对象,数据一般放在host侧。 该类定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见common_types。 |
|
SmallVector |
该类使用内部内存池实现vector容器,基础功能与C++标准库中std::vector容器相同,无需每次扩容都申请内存,避免影响性能。其定义的成员变量为私有类型,开发者无需关注,定义的成员函数参见small_vector。
|
aclnn/opdev/small_vector.h |
OpExecMode |
用于表示算子运行模式的枚举类,定义参见OpExecMode。 |
aclnn/opdev/op_def.h |
OpImplMode |
用于表示算子精度模式的枚举类,定义参见OpImplMode。 |