前言
通过最近邻算法的实现,展示在实际的优化中,如何巧妙的将嵌套的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资源的利用率。