RTC是Ascend C运行时编译库,通过接口,在程序运行时,将中间代码动态编译成目标机器码,提升程序运行性能。
运行时编译库提供以下核心接口:
- aclrtcCreateProg:根据输入参数(字符串形式表达的Ascend C源代码等)创建aclrtcProg程序实例。
- aclrtcAddNameExpr(可选):注册需要导出的核函数名表达式,支持模板参数(如 "Kernel::add_custom<float>"),非模板核函数可跳过。
- aclrtcCompileProg:编译给定的程序,支持用户自定义编译选项,比如指定NPU架构版本号:--npu-arch=dav-2201。支持的编译选项可以参考。
- aclrtcGetBinDataSize:获取编译后的Device侧二进制数据的大小。
- aclrtcGetBinData:获取编译后的Device侧二进制数据。
- aclrtcGetLoweredName(可选):获取核函数编译后的mangled name,用于后续通过aclrtBinaryGetFunction查找核函数句柄,非模板核函数可跳过。
- aclrtcDestroyProg:在编译和执行过程结束后,销毁给定的程序。
编译完成后需要调用如下接口完成(仅列出核心接口)Kernel加载与执行。完整流程和详细接口说明请参考中的“Kernel加载与执行”章节。
- 通过aclrtBinaryLoadFromData接口解析由aclrtcGetBinData接口获取的算子二进制数据。
- 获取核函数句柄并根据核函数句柄操作其参数列表,相关接口包括aclrtBinaryGetFunction(获取核函数句柄)、aclrtKernelArgsInit(初始化参数列表)、aclrtKernelArgsAppend(追加拷贝用户设置的参数值如xDevice, yDevice, zDevice)等。
- 调用aclrtLaunchKernelWithConfig接口,启动对应算子的计算任务。
如下样例演示了如何使用aclrtc接口编译并运行一个核函数,该核函数中调用了printf进行打印。完整样例请参考。
[object Object]
编译命令如下,编译时需要设置-I${ASCEND_HOME_PATH}/include,用于找到aclrtc相关头文件,并设置-L${ASCEND_HOME_PATH}/lib64链接alc_rtc动态库。
[object Object]
对于非模板核函数(如[object Object]),编译器可自动导出符号,无需额外操作。
当核函数为模板函数时,编译器无法自动确定需要导出的特化实例,需要通过[object Object]手动注册需要导出的核函数名(含模板参数);编译后通过[object Object]获取mangled name,用于后续[object Object]查找句柄。
[object Object]