编译及运行应用
编译运行应用的步骤,请参见基于Caffe ResNet-50网络实现图片分类(同步推理)。
如果运行应用出错,您可以参见问题定位进一步排查。
相关注意点如下:
- 模型构建,详细说明请参见模型构建。
- 编译代码时,编译脚本的修改点如下。您可以从该样例中获取编译脚本CMakeLists.txt,在该编译脚本的基础上修改如下参数。
- include_directories:添加头文件所在的目录。
示例如下:
include_directories( directoryPath1 directoryPath2 )
- link_directories:添加库文件所在的目录。
示例如下:
link_directories( directoryPath3 directoryPath4 )
- add_executable:修改可执行文件的名称(例如:main)、添加*.cpp文件所在的目录。
示例如下:
add_executable(main directoryPath5 directoryPath6)
- target_link_libraries:修改可执行文件的名称(与 add_executable:修改可执行文件的...中保持一致)、添加可执行文件依赖的库文件。
示例如下:
target_link_libraries(main ascendcl libName1 libName2)
依赖的库文件与接口所在的头文件有关,具体对应关系如下表所示。
AscendCL头文件存在于如下目录:- “Acllib组件的安装目录/acllib”目录
- “FwkACLlib组件的安装目录/fwkacllib”目录。
需要根据运行环境的安装包,确定引用的组件目录,否则会导致运行报错。安装方案请参见《CANN 软件安装指南》。
- 运行环境安装nnrt包,则开发过程中引用Acllib组件目录。
- 运行环境安装nnae包,则开发过程中引用FwkACLlib组件目录。
定义接口的头文件
用途
编译时对应的库文件
include/acl/acl_base.h
用于定义基本的数据类型(例如aclDataBuffer、aclTensorDesc等)及其操作接口、枚举值(例如aclFormat)、日志管理接口等。
lib64/stub/libascendcl.so
include/acl/acl.h
该头文件中已包含acl/acl_mdl.h、acl/acl_rt.h、acl/acl_op.h。包含acl.h文件后,可以引用初始化/去初始化、Device管理、算力Group查询与设置、Context管理、Stream管理、同步等待、内存管理、模型加载与执行、算子编译(除aclopCompile接口)、算子加载与执行(除aclopCompileAndExecute接口)等接口。
lib64/stub/libascendcl.so
include/acl/acl_prof.h
用于定义Profiling配置的接口。
lib64/stub/libascendcl.so
include/acl/ops/acl_cblas.h
用于定义CBLAS接口。
lib64/stub/libacl_cblas.so
include/acl/ops/acl_dvpp.h
用于定义媒体数据处理的接口。
lib64/stub/libacl_dvpp.so
include/acl/ops/acl_fv.h
用于定义特征向量检索的接口。
(当前不支持引用该头文件中的接口。)
须知:该头文件仅存在于“ACLlib组件的安装目录/acl/ops”目录。
lib64/stub/libacl_retr.so
include/acl/acl_op_compiler.h
用于定义aclopCompile、aclopCompileAndExecute、aclSetCompileopt等算子在线编译相关的接口、数据类型、枚举值等。
lib64/stub/libascendcl.so
include/acl/acl_tdt.h
用于定义Tensor数据传输接口。
须知:该头文件仅存在于“FwkACLlib组件的安装目录/acl”目录。
lib64/stub/libascendcl.so
- 使用“lib64/stub”目录下的*.so库,是为了编译基于AscendCL接口的代码逻辑时,不依赖其它组件(例如Driver)的任何*.so库。因此在使用cmake编译命令时,请务必将DCMAKE_SKIP_RPATH设置为TRUE,代表不会将rpath路径(即“lib64/stub”)添加到编译生成的可执行文件中去。
- 编译通过后,运行应用时,通过配置环境变量,应用会链接到运行环境上“lib64”目录下的*.so库,运行时会自动链接到依赖其它组件的*.so库。
- 编译基于AscendCL接口的代码逻辑时,请按照引用的头文件,依赖对应的so文件,引用多余的so文件可能导致后续版本升级时存在兼容性问题。
- 编译选项,修改可执行文件的名称(与 add_executable:修改可执行文件的...中保持一致),以及可执行文件的安装目录。示例如下,表示main安装在${CMAKE_INSTALL_PREFIX}/out目录下,${CMAKE_INSTALL_PREFIX}变量定义的路径是相对路径,相对cmake命令执行的路径:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../../../out") install(TARGETS main DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
- include_directories:添加头文件所在的目录。
- 运行可执行文件时,需将AscendCL初始化配置文件(acl.json)所在的目录、可执行文件所在的目录、测试图片所在的目录、*.om文件所在的目录都上传到运行环境的同一个目录下。
如果在AscendCL初始化阶段,在aclInit接口中传入空指针,则无需将AscendCL初始化配置文件(acl.json)所在的目录上传到运行环境。