改善Vivado HLS部门的绩效

问题描述

我正在计算输入数据的增量均值(它是6个元素组成的数组,因此我将得到6个均值)。

这是每次有新的输入数组可用时我正在使用的代码(很明显,我会更新ecc的样本数量...):

computing_mean:for(int i=0;i<6;i++){
       temp_mean[i]=temp_mean[i] + (input[i]-temp_mean[i])/number_of_samples;
       //Possible optimization?
       //temp_mean[i]=temp_mean[i] + divide(input[i]-temp_mean[i],number_of_samples);

}

其中代码中的所有数据都是数组或以下类型的单个数字:

typedef ap_fixed <36,24,AP_RND_CONV,AP_SAT> decimalNumber;

根据我的综合报告,该循环有324个延迟和54个迭代延迟,主要是由除法运算引起的。

有什么方法可以提高分裂速度?我尝试使用hls_math和除法功能,但似乎不适用于我的数据类型。

编辑1 :我将性能分析器包含在vivado HLS中。我将在以后的编辑中添加一个自包含的可复制代码。 如您所见,大部分时间都花在SDIV上

enter image description here

解决方法

除了三角函数,例如sin()FSIN =〜50-170个周期)和cos()FCOS =〜50-120个周期)或{ {1}}(sqrt() =〜22个周期),分裂永远是最痛苦的。

FSQRT是15个周期。 FDIVFADD均为5。

在某些情况下,如果您使用整数数据,并且要除以的数字是2的幂,则可以跳过除法而进行位移位。

您可以在tables like this中查找任何给定指令的大约CPU周期成本。 FMUL是一个昂贵的例子。

话虽这么说,您可以尝试做的一件事是预先计算除法因子,然后使用乘法来应用它:

FDIV

我不确定是否可以节省很多,但是如果您确实需要节省周期,那值得一试。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...