Qualcomm® AI Engine Direct 使用手册(14)
5.1.4 QNN Converter Op 包代码生成
qnn-op-package-generator生成用于创建 QNN 转换器 op 包共享库的框架代码和 makefile。qnn-op-package-generator将 XML 配置作为输入,描述包属性以及指定是否生成转换器 op 包并生成 QNN 转换器 op 包目录结构的–converter_op_pacakge或选项。-cop
笔记
qnn-op-package-generator使用–converter_op_pacakge或选项执行-cop除了 QNN op 包之外还会创建 Converter op 包。生成的 Converter op 包的名称将为 QNN op 包名称附加字符串Converter_Op_Package。
-
创建 Converter op 包骨架
笔记
这些说明假定已遵循一般设置说明1qnn-op-package-generator并且 可通过命令行访问。-
定义 XML OpDef 配置。该操作定义 XML 描述了包信息,如名称、版本、域。有关 XML 架构的更多信息,请参阅XML OpDef 架构细分。
示例配置也可以在XML Op Def 配置示例和 SDK 中找到:${QNN_SDK_ROOT}/examples/QNN/OpPackageGenerator
笔记
用于生成 QNN 转换器 op 包的 XML 配置与 QNN op 包生成中使用的 XML 配置相同- –config_path运行 qnn-op-package-generator 工具并使用or-p选项和 --converter_op_pacakgeor选项传递 XML 配置-cop。
qnn-op-package-generator -p <QNN_SDK_ROOT>/examples/QNN/OpPackageGenerator/ReluOpPackageCpu.xml -cop -o <output_dir>
此命令创建一个名为ReluOpPackage的 op 包和一个名为ReluOpPackage_Converter_Op_Package的转换器 op 包。2
笔记
可以多次指定-p命令行选项以生成不同的包,前提是每个包名称不同。如果包名称不明确,该工具会将每个配置中定义的所有操作合并到单个包目录中。目录结构
包目录树显示并解释如下:|-- Makefile |-- ConverterOpPackage |-- ConverterOpPackage.cpp `-- Makefile.linux-x86_64
Makefile:包含为 x86 目标编译包源文件的 make 目标和规则。
ConverterOpPackage:包含为配置和目标特定 makefile 中定义的所有操作生成的源文件。
笔记
转换器op包必须在linux-86_64平台上生成和编译。
-
-
实现骨架代码
- Op 源文件 - ConverterOpPackage.cpp
源文件包含应由用户完成的空函数体。本节中使用的代码引用了目录结构中生成的包。下面的示例突出显示了示例配置中定义的 Relu 操作的输出。
以下自动生成的代码包含一个结构体,该结构体采用 Qnn_OpConfig_t 类型的 opConfig 作为其参数。OpConfig 是用于存储和检索输入、输出和参数的操作配置。
通过使用 opConfig 实现填充输出形状的逻辑并添加任何必要的验证来完成该功能。该函数由转换器关联的函数指针调用1EXPORT_API Qnn_ErrorHandle_t ReluShapeInference(Qnn_OpConfig_t *opConfig) { 2 3/** 4* Add code here 5**/ 6 7return QNN_SUCCESS; 8} 9 10Qnn_ErrorHandle_t (*RelushapeInferencePtr)(Qnn_OpConfig_t *) = &ReluShapeInference;
- Op 源文件 - ConverterOpPackage.cpp
-
为 x86 目标编译包
-
设置 QNN 环境。
$ source <QNN_SDK_ROOT>/bin/envsetup.sh
-
x86 所需:确保 clang 编译器位于您的路径中,或将 CXX 设置为指向有效的编译器路径。[3]_
-
编译 x86 目标的包:
make cpu or make cpu_x86
-
这将在<current_dir>/<package_name>_Converter_Op_Package/ConverterOpPackage/lib.so处创建共享库
笔记
步骤 ab 也可以在 makefile 中手动设置,或者作为命令行选项来 make,而无需使用脚本。
1
有关 QNN 工具设置的说明,请参阅设置。
2
如果该目录已存在,该工具将仅生成新文件并尝试附加到现有文件。要强制生成新包,请使用–force- Generation选项。
3
如果不存在,脚本 <QNN_SDK_ROOT>/bin/check-linux-dependency.sh 也可用于下载适当的 clang 版本。