我正在为ARM-Target编写代码,它使用了很多浮点运算和三角函数。AFAIK浮点计算要比int慢得多(特别是在ARM上)。准确性不是关键。
我考虑用比例因子(p.e )实现我自己的三角函数。0*pi到2*pi的范围变为int 0到1024)和查找表。这是个好办法吗?还有别的选择吗?
目标平台是一个运行ubuntu的Odroid U2 (Exynos4412)和许多其他东西(webserver等)。
(允许使用c++11和boost/库)
发布于 2013-07-31 20:47:04
Exynos4412使用Cortex-A9 core1,它具有完全流水线的单精度和双精度浮点.没有理由诉诸整数运算,因为有一些较老的ARM核心。
根据您的特定精度要求(尤其是如果您能够保证输入的范围有限),您可能能够使用比标准库中可用的实现快得多的近似值。为了给出合理的建议,更多关于你的确切用法的信息是必要的。
1
发布于 2013-07-31 16:00:46
如果您的目标平台有一个数学库,请使用它。如果它有什么好处的话,它是由考虑速度的专家写的。您不应该将代码设计建立在猜测什么是快还是慢的基础上。如果您没有实际的度量或处理器规范,并且不知道您的应用程序中的三角函数正在消耗大量时间,那么您就没有充分的理由替换数学库。
浮点指令的延迟通常比整型指令长,但它们是流水线的,因此吞吐量可能是可比的。(例如,一个浮点单元可能有四个阶段来完成这项工作,因此一个指令需要四个周期来完成所有阶段,但是您可以将一个新指令推入每个周期的第一个阶段。)流水线是否足以提供与整数实现相当的性能,在很大程度上取决于目标处理器、所使用的算法和实现者的技能。
如果在您的情况下使用数学例程的自定义实现是有益的,那么它们应该如何设计在很大程度上取决于环境。正确的建议取决于要支持的域(仅从0到2π?-2π到+2π?可能更大的值,必须折叠到-π到π?),需要支持什么特殊情况(传播can?),所需的准确性,处理器中还发生了什么(大量内存在使用,或者我们可以依赖仍然存在于缓存中的查找表?)等等。
三角函数例程的一个重要部分是处理各种情况(NaNs、无穷大、小值)和减少参数模2π。可以实现不处理特殊情况或执行参数约简但仍然使用浮点的精简例程。
发布于 2013-07-31 15:50:03
一个可能的替代办法是:
https://stackoverflow.com/questions/17974082
复制相似问题