AlveoU200在pynq-z2上做的那个手写数字识别工程在这块板上复现一下。 数字识别的基础知识
最近实验室租了块xilinx家的AlveoU200加速卡,过去几天被这块板吸引了注意力。刚开始了解,做点什么来试试水呢?一想,可以把曾经学 在pynq-z2上做的那个手写数字识别工程在这块板上复现一下。
数字识别的基础知识在我曾经pynq-z2的总结里讲过了,
接下来就专门来说说加速卡的开发是个什么名堂,以我自己的理解先来比较一下zedboard纯PL开发,pynq使用,以及U200加速卡的区别吧。
1.纯PL开发没啥可说的,写好RTL,烧进去,跑就完事了。
2.pynq的开发跟zedboard的PS开发本质是一回事,只不过pynq是一个先装好了linux的zedboard,同时还有个overlay让这个板子可以支持python。这个在调用的时候,虽然ip核的调用是用python(在zedboard就是用C)来控制的,但ip核之间的调用流程,还有内存的使用方式等细节,我们是控制不了的。
3.U200走的路子跟前面就不同了,它用openCL来写主函数, openCL是专门为异构平台写程序的语言。我们可以实现对ip核调用过程,内存使用等方法的控制。emmm,说实话我简单使用下来的感觉是opencl使用起来并不方便,但起码它提供了方法完成以前做不到的事情2333。
整个事情的流程是这样的:
(1)测试读取目标图像的bmp文件、卷积核以及偏置数据的代码。
(2)使用VITIS的HLS工具将c代码封装成核
(3)用openCL编写host程序,跑仿真,这里面我还分了9步。
3-1:读取main函数的argv[](也就是读取ip核)
3-2:读取图像
3-3:读取卷积核以及偏置参数
3-4: 在host上分配各种ip核处理完后放结果的内存
3-5:用opencl做配置操作
3-6:接下来将device跟host上已经写好的内存位置连接起来
3-7:设置第一次卷积和池化的参数
3-8:将第一次卷积操作压入queue,开始执行
3-9:GUI 操作
(1)读取目标图像的bmp文件、卷积核以及偏置数据
1-1:读bmp
读取目标图像在pynq上面是通过cv2的读取jpeg库函数一步到位完成的。但是U200不支持python,所以这个过程咱们要自己写段简单的C程序完成,为了方便我们将目标函数从jepg格式改成bmp格式。
代码在下面,逻辑很简单,就是bmp整个格式实际有效的数据在文件最后,文件前面有一堆标注格式和文件内容的"废话",我们要做的就是跳过前面的部分,直接把后面的内容读出来。
这里多说一句,这种读文件的操作,写代码的时候还是多花几秒钟把各步的错误信号设置好,说不定就可以为debug省去不少时间。