dataflow可谓是FPGA性能体现的绝佳表现方式,数据在硬件中能流动起来,靠的就是dataflow!
下面我们将探究SDAccel OpenCL开发方式下两种dataflow的实现方式:pipe
传输方式与function
传输方式。
以及SDAccel HLS 开发方式下两种dataflow的编程风格:loop
与stream
SDAccel Dataflow 那点事儿(一)
SDAccel Dataflow 那点事儿(二)
SDAccel Dataflow 那点事儿(三)
SDAccel Dataflow 那点事儿(四)
dataflow pipe 方式简介
对于OpenCL
来说,Dataflow
的对象除了function
的方式之外,还有Kernel
的方式,因此,Dataflow
在OpenCL
中还有一种在Kernel
与Kernel
之间的传输方式,也就是通过pipe
传输。pipe
的传输机制采用的其实是FIFO
的方式,因此在使用pipe
传输的过程中需要设置FIFO
的深度,也就是在传输过程中有多少的缓存深度。
代码实现
- 实现示意图
1 |
|
- host端代码
1 |
|
- device端代码
1 |
|
关于Pipe不支持结构体的解决办法
当前针对SDAccel 2017.2 版本测试发现关于Pipe的Dataflow方式是不支持结构体类型的,因此对于借助向量化的数据来说,结构体的数据类型传输会造成一定的困难,基于此问题,我们采用Python脚本加宏定义的方式进行代码生成,进而实现结构体的Pipe传输
- 结构体类型的向量加法
1 |
|
- 宏定义模式
1 |
|
- Python 脚本
1 |
|
实验结果
- 非结构体类型Pipe硬件仿真波形图
- 结构体类型Pipe硬件仿真波形图
参考
xilinx github SDAccel_Examples/getting_started/dataflow/
ug1253 SDx Pragma Reference Guide 2017.2
ug1207 SDAccel Environment Optmizaton Guide