使用内部函数执行单内核编程 - 2023.2 简体中文

AI 引擎内核与计算图编程指南 (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 简体中文
警告:
强烈建议您为自己的设计使用 AI 引擎 API。仅当设计具有苛刻的性能需求,且需要 AI 引擎 API 中尚未涵盖的功能时,才能考虑使用内部调用。例如,AI 引擎 API 当前不支持 fft_data_incrcyclic_add 等部分内部调用所提供的功能。虽然 AI 引擎 API 能支持并抽象化主要的置换用例,但并未涵盖所有置换功能。使用内部调用可能使您能够弥补设计所需的性能缺陷。

每个 AI 引擎内核都是 1 个 C/C++ 程序,该程序是使用原生 C/C++ 语言和专用内部函数编写的,其中内部函数以 VLIW 标量和矢量处理器为目标。AI 引擎内核代码是使用 AI 引擎编译器 (aiecompiler) 编译的,此编译器包含在 AMD Vitis™ 核开发套件内。AI 引擎编译器可编译内核以生成在 AI 引擎处理器上运行的 ELF 文件。

如需了解有关内部函数的更多信息,请参阅 AI 引擎内部函数用户指南(UG1078)。在本章前几节中涵盖了有关 AI 引擎编译器和仿真器的信息。

AI 引擎支持在矢量编程时使用专用数据类型和内部函数。按需利用这些内部函数和矢量数据类型来重构标量应用代码即可实现矢量化的应用代码。AI 引擎编译器负责将内部函数映射到运算、矢量或标量寄存器分配和数据移动、自动调度以及生成微码并将其有效打包到 VLIW 指令内。

以下章节介绍 AI 引擎内核支持的数据类型以及可使用的寄存器。此外,还描述了矢量内部函数如何在矢量寄存器上使用相应的数据类型执行初始化、加载、存储以及运算。

为了在 AI 引擎上达成最高性能,单内核编程的主要目标是确保使用的矢量处理器可达成其理论最大值。算法矢量化至关重要,但管理矢量寄存器、存储器访问和软件流水打拍也同样不可或缺。程序员必须努力在执行当前运算的同时,使数据可用于执行新运算,因为矢量处理器每个时钟周期内只能执行一项运算。借助编译指示即可在循环内使用软件流水打拍来执行最优化。例如,如果内层循环具有顺序或循环进位依赖关系,那么可能可以展开外层循环,并行计算多个值。以下章节也讲解了这些概念。