3

我们正在开发一个实时系统,该系统将在关键的操作期间执行 sin/cos 计算。我们正在考虑使用查找表来帮助提高性能,并且我正在尝试对实现表的收益/成本进行基准测试。不幸的是,我们还不知道我们需要什么程度的准确度,但可能在小数点后 5-6 位左右。

我认为之前已经完成了 C++ 三角函数与查找方法的比较。我希望有人可以为我提供一个链接,指向记录任何此类基准测试的网站。如果不存在这样的结果,我将不胜感激有关如何确定假设给定最小精度的查找表需要多少内存以及如何确定潜在的速度优势的任何建议。

谢谢!

4

3 回答 3

2

我无法回答您的所有问题,但与其尝试确定理论上的速度优势,您几乎肯定会在实际应用中对其进行分析更好。然后,您可以准确了解您在特定问题域中将获得什么样的改进,这是满足您需求的最有用的信息。

于 2010-09-15T20:41:56.000 回答
1

您的度数输入的准确度是多少(让我们使用度数而不是弧度来保持讨论“更简单”)。几十度?百分之一的学位?如果你的角度精度不是很好,那么你的三角结果就不会更好。

我已经看到这实现为以百分之一度为索引的数组(将角度保持为整数,带两个隐含的小数点也有助于计算 - 无需使用高精度浮点/双弧度角)。

存储 0.00 到 90.00 度的 SIN 值将是 9001 32 位浮点结果值。

SIN[0] = 0.0 ... SIN[4500] = 0.7071068 ... SIN[9000] = 1.0

如果您有 SIN,则 COS(a) = SIN(90-a) 的 trig 属性仅表示您执行 SIN[9000-a] 以获得 COS(a)

如果您需要更高的精度但没有更多表空间的内存,您可以在数组中的两个条目之间进行线性插值,例如 45.00123 的 SIN 将是

正弦[4500] + 0.123 * (正弦[4501] - 正弦[4500])

于 2010-09-16T01:09:21.987 回答
0

了解这两种方法的性能特征的唯一方法是尝试它们

是的,其他人可能对此进行了基准测试,但是它们没有在您的代码上下文中运行,并且它们没有在您的硬件上运行,因此它们不太适用于您的情况。

但是,您可以做的一件事是在您的 CPU 手册中查找指令延迟。(Intel 和 AMD 在其网站上以 PDF 形式提供了此信息,大多数其他 CPU 制造商也有类似的文档)

然后,您至少可以找出实际触发指令的速度有多快,从而为您提供一个基线,查找表必须超过该基线才有价值。

但这只能让您粗略估计等式的一侧。如果您知道 CPU 缓存的延迟,并且您对内存访问的延迟有一个粗略的了解,那么您也可以对查找表的成本进行类似的粗略估计。

但获得准确信息的唯一方法是尝试一下。实现两者,看看你的应用程序会发生什么。只有这样,您才会知道哪种情况更适合

于 2010-09-16T00:20:10.263 回答