Rob*_*cks 53 .net c# performance sse intel
请阅读这篇引人入胜的文章,了解使用非规范化浮点数(浮点数非常接近0)可以获得的英特尔CPU上20x-200x减速.
SSE有一个选项可以将这些选项舍入为0,在遇到这样的浮点值时恢复性能.
C#apps如何处理这个问题?是否有启用/禁用选项_MM_FLUSH_ZERO?
Han*_*ant 47
没有这样的选择.
C#app中的FPU控制字在启动时由CLR初始化.更改它不是框架提供的选项.即使你试图通过去除_control87_2()来改变它,它也不会持续很长时间; 任何异常都会导致CLR中的异常处理实现再次重置控制字.这是为了处理FPU控制字的另一个方面而编写的,它允许取消屏蔽浮点异常.它也不会对任何其他托管代码产生不利影响,因为它们不会期望像这样改变全局状态.
在虚拟机中运行代码时,无法直接控制硬件是一个隐含的限制.并非这在本机代码中也很容易做到,当库太过于期望FPU具有默认初始化时,库往往行为不端.特别是异常屏蔽标志的问题,使用Borland工具创建的DLL具有打开异常的诀窍,使得其他代码失败而没有编写以处理此类异常.FPU控制字是一个非常难看的问题,是你能想象到的最糟糕的全局变量.
这确实给你带来了负担,不要让你的浮点计算像这样乱.使用非正规数计算几乎总是产生无意义的结果,如果不是从极小的值,那么至少从有效数字的快速丢失.将小于2.2E-308的值截断为0取决于您.是的,不太实际.也许一个程序可以提供比正常慢一点的废话结果:)
| 归档时间: |
|
| 查看次数: |
6346 次 |
| 最近记录: |