remarks example cref code c# .net mono clr intrinsics

c# - example - ¿Cómo afecta JitIntrinsicAttribute a la generación de código?



params comments c# (1)

Estaba navegando por el código fuente de .NET y vi este atributo . Dice,

Un atributo que se puede asociar a los métodos / propiedades intrínsecas de JIT

y según MSDN :

Indica que un método modificado es un valor intrínseco para el cual el compilador just-in-time (JIT) puede realizar una generación de código especial. Esta clase no puede heredarse.

pero tuve problemas para encontrar cómo . ¿En qué tipo de código realiza una generación de código especial?

Mi suposición principal es que utiliza principalmente instrucciones de procesador como SIMD, algo así como Java JIT . Aquí hay un ejemplo . Tengo curiosidad sobre la aceleración y me pregunto si Mono también lo hace.


Esto es específico de RyuJIT , la nueva generación de fluctuación de 64 bits en la que Microsoft está trabajando actualmente. Todavía en alfa (también conocido como CTP), la próxima versión de .NET y Visual Studio está programada para incluirlo. Actualmente disponible en .NET 4.6 Preview.

Una nueva característica en RyuJIT es su capacidad para generar código máquina SIMD, aprovechando las instrucciones de vectorización en los procesadores Intel / AMD. Realizando operaciones de coma flotante en arreglos hasta x8 veces más rápido. El atributo [JitIntrisic] es un marcador para el código C # con el que RyuJIT tiene un conocimiento especial incorporado, generará la versión SIMD del código máquina en lugar de la versión normal no vectorizada.

Tenga en cuenta que esto todavía está a un millón de millas del tipo de código que los compiladores actuales de C y C ++ pueden generar. RyuJIT solo puede hacer esto para los tipos ungidos que conoce. Como System.Numerics.Vector2. El código SIMD tiene requisitos de alineación muy fuertes para ser eficiente, alineado a 16 para instrucciones SSE2, a 32 para instrucciones AVX. Conseguir dicha alineación en un programa .NET requerirá una revisión completa del CLR, actualmente solo se puede alinear a 4 en el modo de 32 bits, a 8 en el modo de 64 bits.

Para resumir, la forma en que preguntas es la inestabilidad. Mono ha estado jugando con su propio soporte SIMD, parece haberse estancado hace 5 años . Recientemente, se anunció que .NET Core iba a ser de código abierto con la muy liberal licencia de MIT, supongo (aunque todavía no lo sé) que esto incluirá el código fuente de RyuJIT. El proyecto github es un trabajo en progreso en este momento y muy incompleto.

ACTUALIZACIÓN: Esto lo hizo en .NET 4.6 RTM. Vector.IsHardwareAccelerated ahora es interno. Solo los tipos System.Numerics.Vector2, Vector3 y Vector4 obtienen el amor SIMD. Puede obtener System.Numerics.Vectors versión 4.1.0.0 de Nuget . Expone más, incluido Vector<T> .