我有一个协处理器连接到主处理器。某些浮点计算需要在协处理器中完成,但它不支持硬件浮点指令,并且仿真速度太慢。
现在,一种方法是让主处理器缩放浮点值,以便它们可以表示为整数,将它们发送给执行某些计算的协处理器,并在返回时缩减这些值。然而,这在大多数情况下都不会起作用,因为数字最终会变得太大或太小而不能超出这些整数的范围。所以我的问题是,正确做到这一点的最快方法是什么。
我有一个协处理器连接到主处理器。某些浮点计算需要在协处理器中完成,但它不支持硬件浮点指令,并且仿真速度太慢。
现在,一种方法是让主处理器缩放浮点值,以便它们可以表示为整数,将它们发送给执行某些计算的协处理器,并在返回时缩减这些值。然而,这在大多数情况下都不会起作用,因为数字最终会变得太大或太小而不能超出这些整数的范围。所以我的问题是,正确做到这一点的最快方法是什么。
你说仿真太慢了。我想你的意思是模拟浮点数。如果缩放整数是唯一剩下的替代方法是定点数学,但它也不是很快,即使它比模拟浮点数快得多。
此外,你永远不会逃避使用缩放整数和 定点数学,你会减少 动态范围 而不是浮点数。
但是,如果事先知道您的范围,则可以针对您需要的范围调整定点数学实现。
这是 一篇关于定点的文章。诀窍的要点是决定如何拆分变量,数字的低部分和高部分的位数。
除了@Amigable Clark Kant的建议, 安东尼威廉姆斯的定点数学库 提供了一个C ++ fixed
几乎可以互换使用的类 float
要么 double
在ARM上,与软件浮点相比,性能提高了5倍。它包括一个完整的 fixed
使用CORDIC算法的标准数学库的点版本,包括trig和log函数等。