C 提高division Vivado HLS的性能

C 提高division Vivado HLS的性能,c,optimization,vivado,vivado-hls,C,Optimization,Vivado,Vivado Hls,我正在计算输入数据的增量平均值(这是一个由6个元素组成的数组,因此我将以6个平均值结束) 这是我每次使用新的输入数组时使用的代码(显然,我会更新样本数ecc…): 计算的意思是:对于(int i=0;i除了像sin()(FSIN=~50-170个周期)和cos()(FCOS=~50-120个周期)这样的三角函数,或者像sqrt()(FSQRT=~22个周期)这样的函数,除法总是最痛苦的 FDIV为15个周期。FADD和FMUL均为5个周期 在某些情况下,如果使用整数数据,并且除以的数字是2的幂,

我正在计算输入数据的增量平均值(这是一个由6个元素组成的数组,因此我将以6个平均值结束)

这是我每次使用新的输入数组时使用的代码(显然,我会更新样本数ecc…):


计算的意思是:对于(int i=0;i除了像
sin()
FSIN
=~50-170个周期)和
cos()
FCOS
=~50-120个周期)这样的三角函数,或者像
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;

我不确定这是否节省了一大笔钱,但如果你真的需要减少周期,那就值得一试。

除了三角函数,比如
sin()
FSIN
=~50-170个周期)和
cos()
FCOS
=~50-120个周期),或者类似
sqrt()
FSQRT
),分裂永远是最痛苦的

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;

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

ANSI C?这是一个遗留的代码库吗?矢量化只是利用SIMD指令,它不是C本身的一个功能。如果你问“有没有一根魔杖我可以在代码上挥舞,让它更快?”答案是否定的。如果你问“有没有办法通过修改代码来加快代码的速度?”答案很长也很复杂,但是答案是肯定的。困难但相对简单的方法是看你是否可以用SIMD指令将其矢量化。更困难但可能更好的方法是看你是否可以将所有这些都转储到GPU上,并将其作为内核函数写入。你要求的是一根魔杖。它不存在。你为什么要这样做墨迹这一行是问题所在?你有一个探查器报告吗?这看起来可能需要很多时间,但实际上不是。除法在计算上更昂贵,这是真的,但在大多数情况下它不会非常昂贵。如果你有性能问题,它可能与以下之一有关:缓存未命中、数据布局问题、错误的str结构设计或根本无效的算法。除了三角函数,如
sin()
cos()
,或类似
sqrt()的东西
,除法永远是最痛苦的。有时,如果处理整数数据时,除法是2的幂,则可以跳过除法而进行位移位。仅此而已。ANSI C?这是某种遗留代码库吗?矢量化只是利用SIMD指令,而不是函数如果你问“有没有一根魔杖我可以在这段代码上挥舞并使它更快”答案是否定的。如果你问“有没有办法通过修改它使这段代码更快?”答案很长也很复杂,但是答案是肯定的。困难但相对简单的方法是看你是否可以用SIMD指令将其矢量化。更困难但可能更好的方法是看你是否可以将所有这些都转储到GPU上,并将其作为内核函数写入。你要求的是一根魔杖。它不存在。你为什么要这样做墨迹这一行是问题所在?你有一个探查器报告吗?这看起来可能需要很多时间,但实际上不是。除法在计算上更昂贵,这是真的,但在大多数情况下它不会非常昂贵。如果你有性能问题,它可能与以下之一有关:缓存未命中、数据布局问题、错误的str结构设计或根本无效的算法。除了三角函数,如
sin()
cos()
,或类似
sqrt()的东西
,除法永远是最痛苦的。如果处理整数数据时,除法的位数是2的幂,则有时可以跳过除法而进行位移位,但仅此而已。
double inverse_n = 1 / number_of_samples;

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