从一个矩阵乘法的例子一步一步进行功能设计与性能优化。
SDAccel矩阵乘法优化(一)
SDAccel矩阵乘法优化(二)
SDAccel矩阵乘法优化(三)
SDAccel矩阵乘法优化(四)
mmult实现及优化步骤
步骤 | 实现功能 | 关键概念/ Keywords |
---|---|---|
1、cpu实现 | 即在host 端实现简单的矩阵乘法,便于比对数据与性能对比 |
|
2、OpenCL实现 | 在device 端实现基于OpenCL的FPGA矩阵乘法硬件设计. |
Key Concepts - OpenCL APIs |
3、加入Local Memory |
采用 Local Memory 减少数据访存次数 |
Key Concepts - Kernel Optimization - Local Memory |
4、实现读写的突发传输 | 采用突发传输的方式更好的实现DDR 与 Local Memory 数据的读写访问 |
Key Concepts - Kernel Optimization - Burst Read/Write |
5、数组分割 | 通过循环展开与数组分割的方式,实现更好的计算性能 | Key Concepts - Array Partition - Loop Unroll Keywords - xcl_pipeline_loop - xcl_array_partition(complete, dim) - opencl_unroll_hint |
CPU端实现mmult计算
1 | void mmult_cpu( int *in1, // Input matrix 1 |
FPGA端实现mmult计算
OpenCL Host端初始化流程
host 端代码实现
1 | //OpenCL utility layer include |
device端代码实现(简单实现mmult逻辑)
1 |
|
实验结果分析
- vivado hls log文件分析(重点关注WARNING)
1 | WARNING: [XFORM 203-542] Cannot flatten a loop nest 'LOOP2' (/home/lab611/workspace/xuke/mmult_test/src/mmult.cl:47:44) in function 'mmult' : |
- HLS Report
- 综合结果分析
分析综合结果的方法:
* 首先分析对于添加的优化指令是否综合实现,若不能实现,原因是什么?
* 然后分析代码pipeline
的情况。SDAccel对于嵌套的for循环来讲:pipeline内层的for循环全部unroll,pipeline外层的for循环试图进行Flattening,Flatten成功则统一到一个pipeline中。
* 对于pipeline
的循环进一步分析II值是多少,理论能优化到多少?
从上述日志分析可知,该硬件的综合实现有很多问题:
* 首先,硬件代码没有优化指令,不需要关注指令是否实现。
* 然后,对于实现的三层for循环,只是实现了最内层LOOP3
循环的pipeline
,中间层未实现Flatten
的原因是:the outer loop is not a perfect loop.
。而LOOP2
向LOOP1
继续试图进行Flattening
,成功则LOOP2
与LOOP1
统一为LOOP1_LOOP2
。一般情况下对于Flattening不成功的原因有两种:一种是外层for循环中夹杂内层for循环的结构;另一种是内层for循环的循环边界是变量。具体循环的类型如下图所示。所以此例中LOOP2
不能与LOOP3
实现Flatten
的原因是前者。也就是在LOOP2
循环体中有out[i * dim + j] = 0;
操作,而out
数组在内层LOOP3
中同样用到。反过来说,假如说编译器对LOOP2
与LOOP3
进行Flatten
,那么对于out[i * dim + j] = 0
操作在同一个循环中将不知如何与内部的循环体进行融合。
* 最后对于试图Pipeline
的LOOP3
进行II
值的分析,从log文件中可知II值过大,以至于无法进行Pipeline
,原因是产生接口gmem
的carried dependence
。所以,所有的loop
都未能实现pipeline
。
关于gmem
的carried dependence
问题可以关注我的另一篇文章 gmem carry dependency 分析
- 硬件仿真结果
- 硬件实现结果
参考
xilinx github Xilinx/SDAccel_Examples/cpu_to_fpga
ug1253 SDx Pragma Reference Guide 2017.2
ug1207 SDAccel Environment Optmizaton Guide