前言
通过最近邻算法的实现,展示在实际的优化中,如何巧妙的将嵌套的for循环进行融合。
最近邻算法
最近邻是机器学习中一种典型的算法,属于K紧邻算法的一种特殊形式。具体的实现过程如下图所示(图片取自百度百科):
从最近邻的计算角度来说,最重要的是从诸多已知点中,寻找对应当前点最近的一个点(默认采用欧几里得距离)。因此,我们主要在FPGA中实现寻找最近点的操作。
嵌套for循环
1 |
|
嵌套for循环的融合
1 |
|
实验结果
软件仿真结果
performence分析
- nearest_neighbor
- nearest_neighbor_loop_fusion
资源占用分析
- nearest_neighbor
- nearest_neighbor_loop_fusion
总结
对于嵌套的for
循环,若是内层的for
循环无法进行循环展开,那么我们只能将内层循环进行pipeline
,而不能兼顾到外层循环的pipeline
状况。编译器对于内层for
循环进行pipeline
后,会默认的去尝试能否对外层的for
循环进行flatten
,如果是perfect loop
或者 semi-perfect loop
能够成功的flatten
,但是对于imperfect loop
则不能。因此,为了避免for
循环的嵌套带来的优化问题,一种很好的解决方式就是将for
循环进行融合,直接对最外层的for
循环进行pipeline
处理。这样既能减少Iteration Latency
。还能减少FF
与LUT
资源的利用率。