2012-05-27 26 views

Respuesta

10

No, no hay ningún escenario en el .NET donde se puede escribir código máquina por su cuenta. La generación de código depende completamente del compilador just-in-time. Sin duda, es capaz de personalizar su generación de código en función de las capacidades del procesador de la máquina. Una de las principales razones por las cuales ngen.exe siempre debe ejecutarse en la máquina de destino. Ya sea que el nerviosismo en .NET 4.5 haya sido modificado para aprovechar sse4 o avx es una pregunta abierta, no he oído nada al respecto. Lo dudo bastante, Microsoft no juega mucho con los nervios, aparte de corregir errores. Muy desestabilizador y 4.5 no es una versión lado a lado.

VS-11, sin embargo, tiene un generador de código actualizado para C++. Es capaz de vectorizar automáticamente bucles y utiliza instrucciones SIMD/AVX para hacerlo. Esto blog post lo menciona, un breve video es available here.


Actualización: el new x64 jitter, actualmente en CTP y el nombre en código RyuJIT, incluye algún soporte rudimentario para obtener instrucciones SIMD. El tipo SSE2, que proporciona auto-vectorización. Sin embargo, está bloqueado bastante cerca del paquete Microsoft.Bcl.Simd y las clases Vector <>, no existe una solución universal para el requisito de alineación de memoria de 16 bytes que SIMD necesita para ejecutarse rápidamente.

Es más probable que el camino hacia adelante fructífero sea .NET Native, anunciado en la última conferencia de creación. Utiliza el back-end del compilador de C++ para generar código antes de tiempo, beneficiándose automáticamente de su soporte integrado para auto-vectorización y auto-paralelización. De lo contrario, sin una explicación clara aún cómo se trató el problema de alineación de la memoria. Tiene sus propios problemas, Reflection es difícil y actualmente solo es compatible con aplicaciones empaquetadas, del tipo cuyas dependencias de tiempo de ejecución se pueden determinar con anticipación. Tienda Windows y aplicaciones de teléfono.


Actualización: esto enviado en .NET 4.6, ensamblado System.Numerics.Vectors.dll. Tenga en cuenta que el que se incluye con el marco es el "seguro" y no coincide con la documentación de MSDN, falta el Vector<T>. El paquete Nuget (versión 4.1.0) hace juego.

+0

Gracias por la respuesta –

+2

Ciertamente puede escribir código de máquina usted mismo; escribe bytes en la memoria y luego llama a 'Marshal.GetDelegateForFunctionPointer' para obtener un delegado al que puedes llamar. El costo de llamarlo significará que probablemente no se compare con Mono.Simd, pero ciertamente es posible. –

+0

https://en.wikipedia.org/wiki/NX_bit –

Cuestiones relacionadas