【2023·CANN训练营第一季】ResNet50图片分类应用——编译程序
配置环境变量
完成了环境、资源的准备,将资源进行预处理之后就进入到正式的模型编译执行环节啦
没有完成环境、资源准备的同学们先看我前两篇文章
请注意,下文中的样例目录均指“
cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
”目录。
export APP_HOME=$HOME/samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
# 样例目录
编译文件涉及的代码结构
├── src │ ├── acl.json //系统初始化的配置文件 │ ├── CMakeLists.txt //编译脚本 │ ├── main.cpp //主函数,图片分类功能的实现文件 │ ├── model_process.cpp //模型处理相关函数的实现文件 │ ├── sample_process.cpp //资源初始化/销毁相关函数的实现文件 │ ├── utils.cpp //公共函数(例如:文件读取函数)的实现文件 ├── .project //工程信息文件,包含工程类型、工程描述、运行目标设备类型等 ├── CMakeLists.txt //编译脚本,调用src目录下的CMakeLists文件
配置程序编译依赖的头文件与库文件路径
设置以下环境变量后,编译脚本会根据“{DDK_PATH}环境变量值/runtime/include/acl
”目录查找编译依赖的头文件,根据{NPU_HOST_LIB}
环境变量指向的目录查找编译依赖的库文件。“$HOME/Ascend
”请替换“Ascend-cann-toolkit
”包的实际安装路径。
注意,在配置
{NPU_HOST_LIB}
环境变量时,需使用的“runtime/lib64/stub
”目录下*.so
库,确保在编译基于AscendCL接口的应用程序时,不依赖其它组件(例如Driver)的*.so
库,编译成功后,运行应用程序时,系统会根据LD_LIBRARY_PATH
环境变量查找“Ascend-cann-toolkit安装目录/runtime/lib64
”目录下的*.so
库,同时会自动链接到所依赖的其它组件的*.so
库。
-
当开发环境与运行环境的操作系统架构相同时,配置示例如下所示:
export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
-
当开发环境与运行环境的操作系统架构不同时,配置示例如下所示:
例如,当开发环境为
X86
架构、运行环境为AArch64
架构时,则涉及交叉编译,需在开发环境上安装AArch64
架构的软件包,将{DDK_PATH}
环境变量的路径指向AArch64
架构的软件包安装目录(如下所示),便于使用与运行环境架构相同的软件包中的头文件和库文件来编译代码。您可以登录对应的环境,执行“
uname -a
”命令查询其操作系统的架构export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/arm64-linux export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
编译代码
1. 创建目录存放编译文件
切换到样例目录,创建目录用于存放编译文件,例如,本文中,创建的目录为“build/intermediates/host
“。
cd $APP_HOME
mkdir -p build/intermediates/host # 创建目录存放编译文件
2. 生成编译文件
切换到“build/intermediates/host
“目录,执行如下命令生成编译文件。
cd build/intermediates/host
-
当开发环境与运行环境操作系统架构相同时,执行如下命令编译
cmake ../../../src -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE
-
当开发环境与运行环境操作系统架构不同时,执行以下命令进行交叉编译
cmake ../../../src -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_SKIP_RPATH=TRUE
“
../../../src
“表示CMakeLists.txt
文件所在的目录,请根据实际目录层级修改。
DCMAKE_CXX_COMPILER
编译器
DCMAKE_SKIP_RPATH
设置为TRUE,代表不会将
rpath
信息(即NPU_HOST_LIB
配置的路径)添加到编译生成的可执行文件中去,可执行文件运行时会自动搜索实际设置的LD_LIBRARY_PATH中的动态链接库。
3. 编译
执行如下命令,生成的可执行文件main在“样例目录/out
“目录下
make
好了,今天编译的过程就讲到这里,明天我们继续讲解运行和修改程序的部分