0

我正在计算输入数据的增量平均值(这是一个由 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 和 divide 函数,但它似乎不适用于我的数据类型。

编辑 1:我在 vivado HLS 中包含了我的性能分析器。稍后我将通过另一个编辑添加一个独立的可重现代码。如您所见,大部分时间都花在了 SDIV 在此处输入图像描述

4

1 回答 1

2

sin()除了像( FSIN= ~50-170 个周期) 和cos()( = ~50-120 个周期)这样的三角函数FCOS,或者像sqrt()( FSQRT= ~22 个周期) 这样的三角函数,除法总是最痛苦的。

FDIV为 15 个周期。FADD并且FMUL都是5。

在某些情况下,您可以跳过除法并进行位移,如果您正在处理整数数据并且您要除以的数字是 2 的幂,但仅此而已。

您可以在这样的表格中查找任何给定指令的大致 CPU 周期成本。FDIV是一个昂贵的例子。

话虽如此,您可以尝试的一件事是提前计算除法因子,然后使用乘法来应用它:

double inverse_n = 1 / number_of_samples;

temp_mean[i]=temp_mean[i] + (input[i]-temp_mean[i]) * inverse_n;

我不确定这会节省很多,但如果你真的需要减少周期,那么值得一试。

于 2020-10-13T19:29:06.897 回答