微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

改善Vivado HLS部门的绩效

如何解决改善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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。