2009-08-18 16 views
6

Las funciones matemáticas del .NET Framework operan principalmente en flotadores de doble precisión, no hay sobrecargas de precisión (float). Cuando se trabaja con datos de precisión simple en un escenario de alto rendimiento, esto da como resultado una fundición innecesaria y también el cálculo de funciones con más precisión de la necesaria, por lo que el rendimiento se ve afectado en cierta medida.operaciones matemáticas de precisión simple en .NET?

¿Hay alguna manera de evitar algo de esta sobrecarga de CPU adicional? P.ej. ¿Existe una biblioteca matemática de código abierto con sobrecargas flotantes que invoca directamente las instrucciones subyacentes de la FPU? (Entiendo que esto requeriría soporte en el CLR). Y en realidad no estoy seguro de si las CPU modernas incluso tienen instrucciones de precisión simple.

Esta pregunta se ha inspirado en parte por esta pregunta acerca de la optimización de una función sigmoide:

Math optimization in C#

Respuesta

3

Que yo sepa, el .NET Framework no incluye una API con acceso directo a las características intrínsecas de matemáticas. Las bibliotecas Mono incluyen soporte de trabajo para intrínsecos, pero no estoy seguro del estado de las mismas.

[Editar:. Este párrafo es comentario sobre por qué no se ve sobrecargas para float parámetros] Un problema es que la pila de evaluación CLI (por ECMA-335) no distingue entre los float y double tipos. Una implementación válida podría tratar todo como double para operaciones matemáticas, pero imagino que CLR (la implementación de Microsoft de la CLI) realiza optimizaciones para la aritmética de precisión simple donde puede.

Creo que es un poco desafortunado que el problema de los intrínsecos (en particular las extensiones SIMD) aún no se haya abordado [en un producto publicado]. El supuesto de mi intruso es que el soporte para intrínsecos requeriría modificaciones significativas en la máquina virtual que planteen riesgos inaceptables en este punto del ciclo de lanzamiento de .NET Framework. El recolector de basura (y creo que los mecanismos de manejo de excepciones) está estrechamente vinculado con el asignador de registro, y el soporte intrínseco agrega una nueva variable radical a esa área.

+0

Cuando se habla de instrinsics ¿es esto lo mismo que las funciones externas? - que es cómo se implementan las funciones matemáticas, frente a las intrínsecas definidas en el lenguaje. AFAIK el CLR podría ampliarse fácilmente para implementar, p. public static extern double Sin (flotante a) además de la versión de doble precisión. – redcalx

+1

¿Estás hablando de implementarlo en código nativo? La sobrecarga de P/Invoke al hacerlo para una operación de coma flotante sería completamente negable al tratar de evitar el impacto en el rendimiento de trabajar con 'Sin (double)'. Los intrínsecos se declaran 'externos' pero no son P/Invocar: el código nativo para ellos es manejado internamente por el JIT para que sean lo más eficientes posible. –

+0

Así que tal vez podría obtenerse algún rendimiento si su algoritmo fuera tal que pudiera hacer una sola P/invocación que realice muchas operaciones de flotación. – Fantius

1

Sí, creamos una biblioteca matemática de escalado directo de alto rendimiento que utiliza cálculos de coma flotante de precisión simple, si eso es todo lo que necesita. Y tiene razón, si se implementa correctamente, puede ser mucho más rápido que con doble precisión.

Consulte this biblioteca de matemáticas de CenterSpace Software.

Paul

+1

¿Entonces esta biblioteca presumiblemente llama al código no administrado? – redcalx

+1

Sí, eso es correcto. – Paul

Cuestiones relacionadas