起初,在Xilinx推出包含AI Engine的FPGA芯片Versal AI Core时,针对AI Engine的编程方式为Intrinsics。Intrinsics可理解为已经被封装的函数,这个函数可实现特定功能,如下图所示,显示了实现两个向量长度为16、向量元素位宽为16的向量乘法(向量元素对应相乘)。形参之多让人眼花缭乱。另一方面,如果要实现向量长度为8的向量乘法,就需要用到另外一个函数。可见,两者之间缺乏继承性。同时,有些参数需要工程师手动计算填写,如其中的xoffset。如此之多的Intrinsics,如此之多的参数,让很多初学者望而生畏。
鉴于此,Xilinx推出了针对AIE的API。一下子简化了AIE的编程方式,降低了AIE的编程难度。那么API具体是什么呢?简言之,API是高抽象度的C++,实际编程时只需要将相应的头文件包含其中即可使用对应的数据类型、运算符,编译工具Vitis则会自动将其翻译为AI Engine的Intrinsics。这些数据类型是可参数化的,这对于提高代码的可复用性很有帮助。而这些运算符又具有普适性。因此,AIE API已成为AIE Kernel编程的主要方法。
针对AIE API,Xilinx提供了专门的文档ug1529加以说明(目前只有网页版本),具体内容如下图所示。从简单的向量加减、向量乘加、向量比较,到非线性运算如倒数、开方求导、正余弦函数,再到复杂的矩阵乘法、傅里叶变化、滤波器等都包含其中。
我们看一个采用AIE API编程的简单案例,这里矩阵A为4×16(4行16列),矩阵B为16×8(16行8列),两者元素均为8-bit,代码第13行使用了矩阵乘的API,M/K/N分别为4/16/8。这里注意代码第1行和第2行将相应的头文件包含其中,这样才能使用相关的API。
没有回复内容