本章节介绍的简易自定义算子工程,是上文中介绍的自定义算子工程的简化版,对算子的编译、打包、部署过程进行简化,便于开发者将该工程集成到自己的算子工程。
基于简易自定义算子工程进行算子开发的完整样例请参考简易自定义算子工程。
基于简易自定义算子工程的算子开发流程图如下:
和创建算子工程类似,简易自定义算子工程通过msOpGen生成,基于算子原型定义输出算子工程,包括算子host侧代码实现文件、算子kernel侧实现文件以及工程编译配置文件等。主要差异点在于:创建简易算子工程需要通过-f参数配置framework框架为aclnn。
使用msOpGen工具创建简易算子开发工程的步骤如下:
[ { "op": "AddCustom", "input_desc": [ { "name": "x", "param_type": "required", "format": [ "ND", "ND", "ND" ], "type": [ "fp16", "float", "int32" ] }, { "name": "y", "param_type": "required", "format": [ "ND", "ND", "ND" ], "type": [ "fp16", "float", "int32" ] } ], "output_desc": [ { "name": "z", "param_type": "required", "format": [ "ND", "ND", "ND" ], "type": [ "fp16", "float", "int32" ] } ] } ]
${INSTALL_DIR}/python/site-packages/bin/msopgen gen -i $HOME/sample/add_custom.json -c ai_core-<soc_version> -lan cpp -out $HOME/sample/AddCustom -f aclnn
AI处理器的型号<soc_version>请通过如下方式获取:
基于同系列的AI处理器型号创建的算子工程,其基础功能(基于该工程进行算子开发、编译和部署)通用。
AddCustom ├── build.sh // 编译入口脚本 ├── cmake │ ├── config.cmake // 编译配置项 │ ├── func.cmake │ ├── intf.cmake │ └── util // 算子工程编译所需脚本及公共编译文件存放目录 ├── CMakeLists.txt // 算子工程的CMakeLists.txt ├── op_host // host侧实现文件 │ ├── add_custom_tiling.h // 算子tiling定义文件 │ ├── add_custom.cpp // 算子原型注册、tiling实现等内容文件 │ ├── CMakeLists.txt ├── op_kernel // kernel侧实现文件 │ ├── CMakeLists.txt │ ├── add_custom.cpp // 算子代码实现文件
上述目录结构中的粗体文件为后续算子开发过程中需要修改的文件,其他文件无需修改。
参考Kernel侧算子实现、Host侧tiling实现、算子原型定义完成算子实现。
算子kernel侧和host侧实现开发完成后,需要对算子进行编译,生成算子静态库;自动生成aclnn调用实现代码和头文件,链接算子静态库生成aclnn动态库,以支持后续的单算子API执行方式(aclnn)的算子调用。编译过程如下:
上述编译过程示意图如下:
上文描述的过程都封装在编译脚本中,开发者进行编译时参考如下的步骤进行操作:
set(CMAKE_CXX_FLAGS_DEBUG "") set(CMAKE_CXX_FLAGS_RELEASE "") if (NOT DEFINED CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release CACHE STRING "") endif() if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/build_out" CACHE PATH "" FORCE) endif() if (NOT DEFINED ASCEND_CANN_PACKAGE_PATH) set(ASCEND_CANN_PACKAGE_PATH /usr/local/Ascend/ascend-toolkit/latest CACHE PATH "") //请替换为CANN软件包安装后的实际路径 endif() if (NOT DEFINED ASCEND_PYTHON_EXECUTABLE) set(ASCEND_PYTHON_EXECUTABLE python3 CACHE STRING "") endif() if (NOT DEFINED ASCEND_COMPUTE_UNIT) set(ASCEND_COMPUTE_UNIT ascendxxx CACHE STRING "") endif() if (NOT DEFINED ENABLE_TEST) set(ENABLE_TEST FALSE CACHE BOOL "") endif() if (NOT DEFINED ENABLE_CROSS_COMPILE) set(ENABLE_CROSS_COMPILE FALSE CACHE BOOL "") endif() if (NOT DEFINED CMAKE_CROSS_PLATFORM_COMPILER) set(CMAKE_CROSS_PLATFORM_COMPILER "/your/cross/compiler/path" CACHE PATH "") endif() set(ASCEND_TENSOR_COMPILER_PATH ${ASCEND_CANN_PACKAGE_PATH}/compiler) set(ASCEND_CCEC_COMPILER_PATH ${ASCEND_TENSOR_COMPILER_PATH}/ccec_compiler/bin) set(ASCEND_AUTOGEN_PATH ${CMAKE_BINARY_DIR}/autogen) file(MAKE_DIRECTORY ${ASCEND_AUTOGEN_PATH}) set(CUSTOM_COMPILE_OPTIONS "custom_compile_options.ini") execute_process(COMMAND rm -rf ${ASCEND_AUTOGEN_PATH}/${CUSTOM_COMPILE_OPTIONS} COMMAND touch ${ASCEND_AUTOGEN_PATH}/${CUSTOM_COMPILE_OPTIONS})
参数名称 |
参数描述 |
默认值 |
---|---|---|
ASCEND_CANN_PACKAGE_PATH |
CANN软件包安装路径,请根据实际情况进行修改。 |
“/usr/local/Ascend/ascend-toolkit/latest” |
CMAKE_BUILD_TYPE |
编译模式选项,可配置为:
|
“Release” |
CMAKE_INSTALL_PREFIX |
编译产物存放的目录,不指定则为默认值。 |
${CMAKE_SOURCE_DIR}/build_out: 算子工程目录下的build_out目录 |
环境变量 |
配置说明 |
---|---|
CMAKE_CXX_COMPILER_LAUNCHER |
用于配置C++语言编译器(如g++)、毕昇编译器的启动器程序为ccache,配置后即可开启cache缓存编译,加速重复编译并提高构建效率。用法如下,在对应的CMakeLists.txt进行设置: set(CMAKE_CXX_COMPILER_LAUNCHER <launcher_program>) 其中<launcher_program>是ccache的安装路径,比如ccache的安装路径为/usr/bin/ccache,示例如下: set(CMAKE_CXX_COMPILER_LAUNCHER /usr/bin/ccache) |
# set custom compile options if ("${CMAKE_BUILD_TYPE}x" STREQUAL "Debugx") add_ops_compile_options(ALL OPTIONS -g -O0) endif() #多算子编译通过add_kernel_compile命令增加算子源码文件即可 add_kernel_compile(AddCustom ${CMAKE_CURRENT_SOURCE_DIR}/add_custom.cpp) add_kernel_compile(SubCustom ${CMAKE_CURRENT_SOURCE_DIR}/sub_custom.cpp) if(ENABLE_TEST AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/testcases) add_subdirectory(testcases) endif()
./build.sh
编译成功后,会在CMAKE_INSTALL_PREFIX/op_api目录存放生成的aclnn头文件和lib库,每一个算子都会对应一个单独的头文件。具体目录结构如下:
├── op_api │ ├── include │ ├── aclnn_optype1.h │ └── aclnn_optype2.h │ └── aclnn_optypexxx.h │ ├── lib │ ├── libcust_opapi.so
对于lib目录下生成的库文件可通过msobjdump工具进一步解析得到kernel信息,具体操作参见msobjdump工具。
完成单算子API调用。