什么时候使用CORDIC或多项式近似更有效?
我正在研究一种不具有浮点硬件功能的架构,但只有一个16位ALU和一个40位MAC。
在这个架构中,我已经在软件中实现了32位单精度浮点加/减,乘法,余弦,正弦,除法,平方根和范围缩减。
为了实现余弦和正弦,我首先使用KC NG I的文章“ARGUMENT REDUCTION FOR HUGE ARGUMENTS”中描述的方法使用范围缩减,然后实现余弦和正弦函数,它们是范围-pi上的余弦函数和正弦函数的多项式近似值/ 4到+π/ 4。 我参考了哈特等人撰写的“计算机近似”一书。 为多项式。
我也听说我应该考虑CORDIC算法。 但是,我想知道是否有人知道它是否会比我已经使用的方法更高效或更低效(就吞吐量,内存开销和所需的指令数量而言)? 我已经在多核架构上实现了我的软件功能,其中每个内核仅具有128字的指令存储器和128字的16位数据存储器。 另外我也尝试过寻找如何实现余弦和正弦的CORDIC算法,但是我找不到任何用于32位浮点实现的良好资源。 有人有建议吗?
谢谢!
CORDIC每循环迭代一次,所以在软件中实现它可能会比你的多项式版本慢。 这也可能是为什么很难找到有关CORDIC的软件实现的文章:它的性能较差,所以没人会反感。
重申您的意见:Horner的方法是通过重复添加系数,然后乘以变量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,这个公式也表明它的生产用途......
如果MAC的速度明显快于等值序列的移位和和增加,则使用多项式; 甚至不考虑CORDIC(除了可能减少单个步骤或两个步骤)。 很难正确地找到FP CORDIC算法,因为该标准对于任何使用FP的系统(过去约35年)都一直适用,因此不考虑CORDIC。
链接地址: http://www.djcxy.com/p/85593.html上一篇: When is it more efficient to use CORDIC or a polynomial approximation?
下一篇: Using MATLAB to find Minimax Polynomial Approximation of Trigonometric Functions