¿Cómo se manejan los flotadores desnormalizados en C#?


Acaba de leer este fascinante artículo sobre las ralentizaciones 20x-200x que puede obtener en CPU Intel con flotadores desnormalizados (números de coma flotante muy cercanos a 0).

Existe una opción con SSE para redondearlos a 0, restaurando el rendimiento cuando se encuentran dichos valores de coma flotante.

¿Cómo manejan esto las aplicaciones C#? ¿Hay una opción para activar / desactivar _MM_FLUSH_ZERO?

Author: Community, 2014-04-07

1 answers

No existe tal opción.

La palabra de control FPU en una aplicación C# es inicializada por el CLR al inicio. Cambiarlo no es una opción proporcionada por el marco. Incluso si intenta cambiarlo pinvoking _control87_2() entonces no va a durar mucho tiempo; cualquier excepción hará que la palabra de control se restablezca de nuevo por la implementación de manejo de excepciones dentro del CLR. Que fue escrito para tratar con otro aspecto de la palabra de control FPU, permite desenmascarar el punto flotante salvedad. También será perjudicial para cualquier otro código administrado que no espere que el estado global se cambie de esa manera.

No tener control directo sobre el hardware es una restricción implícita cuando se ejecuta código en una máquina virtual. Tampoco es que esto sea fácil de hacer en código nativo, las bibliotecas tienden a comportarse mal cuando también esperan que la FPU tenga la inicialización predeterminada. Particularmente un problema con la excepción de las banderas de enmascaramiento, los archivos DLL creados con herramientas Borland tienen un habilidad para activar excepciones, haciendo que otro código falle que no está escrito para lidiar con tal excepción. Un problema extremadamente feo para resolver, la palabra de control FPU es la peor variable global posible que puedas imaginar.

Esto coloca a la carga para no dejar que sus cálculos de punto flotante se descontrolan como este. Calcular con valores normales casi siempre produce resultados sin sentido, si no de los valores radicalmente pequeños, entonces al menos de la pérdida rápida de dígitos significativos. Truncar valores inferiores a 2.2 E-308 a 0 depende de usted. Sí, no es muy práctico. Tal vez está bien que un programa entregue resultados sin sentido un poco más lento de lo normal:)

 45
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-23 22:32:26