7

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

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

为了实现余弦和正弦,我首先使用KC NG 的论文“ARGUMENT REDUCTION FOR HUGE ARGUMENTS”中描述的方法使用范围缩减, 然后我实现了余弦和正弦函数,它们是余弦和正弦函数在范围 -pi 上的多项式逼近/4 到 +pi/4。我参考了 Hart 等人的《计算机近似》一书。为多项式。

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

谢谢!

4

2 回答 2

6

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

回复您的评论: 霍纳的方法是通过重复添加系数,然后乘以变量来评估从最高阶系数到最低阶系数的多项式的做法x。相比之下,朴素方法(即,x首先评估 的幂,然后将它们乘以它们的系数并将它们相加)需要更多的工作并且在数值上可能比霍纳的方法更不稳定。

你还没有确切地提到你是如何尝试评估你的多项式的,所以我会建议一个公式:

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,这个公式也表明它的生产用途......

于 2013-03-14T19:31:13.280 回答
3

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

于 2013-03-14T23:30:14.357 回答