什么时候使用CORDIC或多项式近似更有效?

时间:2013-03-14 18:35:39

标签: c algorithm math assembly floating-point

我正在研究一种不采用浮点硬件但只有16位ALU和40位MAC的架构。

我已经在这个架构的软件中实现了32位单精度浮点加法/减法,乘法,余弦,正弦,除法,平方根和范围缩减。

为了实现余弦和正弦我首先使用文章"ARGUMENT REDUCTION FOR HUGE ARGUMENTS" by K.C. NG中描述的方法使用范围缩减 然后我实现了余弦和正弦函数,它是-pi / 4到+ pi / 4范围内余弦和正弦函数的多项式近似。我提到了“计算机近似”一书,Hart等人。对于多项式。

我也听说过我应该考虑CORDIC算法。但是,我想知道是否有人知道它是否会比我已经使用的方法更高效或更低效(在吞吐量,内存开销和所需指令数方面)?我在多核架构上实现了我的软件功能,其中每个核心只有128个字的指令存储器和一个128字的16位数据存储器。 我也尝试过搜索如何为余弦和正弦实现CORDIC算法,但我找不到任何用于32位浮点实现的好资源。有人有建议吗?

谢谢!

2 个答案:

答案 0 :(得分:6)

CORDIC为每个循环迭代提供一位,因此在软件中实现它可能比您的多项式版本慢。这也可能是为什么很难找到有关CORDIC软件实现的文章:它的表现较差,所以没有人烦恼。

重新评论:Horner's method是通过重复添加系数,然后乘以变量x来评估从最高系数到最低系数的多项式的实践。相比之下,天真的方法(即首先评估x的幂,然后将它们乘以系数并将它们加在一起)需要更多的工作,并且比Horner的方法在数值上更稳定。

您还没有准确提到您是如何评估多项式的​​,所以我建议一个公式:

x2 = x * x
cos = ((COS_D * x2 + COS_C) * x2 + COS_B) * x2 + COS_A
sin = (((SIN_D * x2 + SIN_C) * x2 + SIN_B) * x2 + SIN_A) * x

请注意,如果您将常量调整到评估函数的范围,而不是使用泰勒系数,则可以获得更好的精度。 (再次,如果你已经完成了部分或全部这些事情,请道歉,但你没有提到你已经尝试过的事情......)


这可能与您的情况(可能只有16x16位MAC)的相关性较小,但如果您的处理器可以同时启动多个算术评估,那么如果您在评估中编写评估,则可能会获得更好的性能。类似树的形式,避免了一些操作的顺序依赖:

x2 = x * x
x4 = x2 * x2
cos = (COS_D * x2 + COS_C) * x4 + (COS_B * x2 + COS_A)
sin = ((SIN_D * x2 + SIN_C) * x4 + (SIN_B * x2 + SIN_A)) * x

如果你的处理器有一个矢量ALU,这个公式也建议它有效地使用......

答案 1 :(得分:3)

如果MAC明显快于等效的移位序列和并且添加,则使用多项式;甚至不考虑CORDIC(可能只有一步或两个范围减少)。很难找到FP CORDIC算法,因为该标准始终适用于任何使用FP的系统(过去约35年),因此不考虑CORDIC。