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:
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
¿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. –
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