目前大多数主流CPU都支持浮点运算单元,或者具备浮点运算功能的辅助运算单元,比如PowerPC e500的SPE APU。在这样的机器上,浮点操作一般被编译成硬浮点指令,但是有的时候为了调试方便,或者由于fpu工作不正常而需要关闭硬浮点,就需要使用软浮点指令来模拟浮点操作。
在Linux下,一般有两种软浮点方式:
1。由kernel来模拟软浮点,应用程序仍然使用硬浮点来编译。在运行的时候,碰到浮点指令或者使用了浮点运算单元的CPU,硬件会产生相应的中断异常,kernel处理这个中断异常,然后根据指令内容进行软浮点操作,将结果保存好之后再恢复原来的执行。
这样的方式好处在于应用程序不需要重新编译,只需要在kernel中把浮点模拟的开关打开即可,所以使用起来非常方便。但是缺点也很明显,每次浮点操作都要触发中断异常,执行过程就要慢很多。另外在有些CPU上,并非所有的浮点指令都会触发中断异常,那么这些指令就没办法用这种方式进行模拟。
2。另一种方式是使用软浮点重新编译所有应用程序,这样可以避免上述问题,而且使用gcc的浮点模拟性能上也会好一些。但缺点是因为使用了不同的编译选项,使用的ABI可能就发生了变化,如果某个库或者应用没有使用同样的编译选项(ABI不同),系统运行时会出现意想不到的情况,甚至造成崩溃。
阅读(4427) | 评论(0) | 转发(0) |