¿Usar SSE en c#es posible?
(9)
Estaba leyendo una pregunta sobre la optimización del código c # y una solución fue usar c ++ con SSE. ¿Es posible hacer SSE directamente desde ac # program?
Claro que puedes (la pregunta más importante es: ¿por qué lo harías? Simplemente déjalo en tiempo de ejecución; ese es su trabajo).
C # le permite asignar un delegado a una dirección de memoria. Esa dirección de memoria puede contener códigos de ensamblado sin procesar. Puedes leer más en el blog de Michael Giagnocavo .
Aunque no me he probado, también es posible usar Marshal.GetDelegateForFunctionPointer .
Según esta publicación en el foro, el compilador MS JIT usa automáticamente SSE si SSE está disponible en la máquina de destino.
¿Puede C # hacer explícitamente una llamada SSE?
No. C # no puede producir IL en línea mucho menos ensamblado x86 / amd64 en línea.
El CLR, y más específicamente el JIT, utilizará SSE si está disponible, lo que elimina la necesidad de forzarlo en la mayoría de las circunstancias. Digo más porque no soy un experto en SSE y estoy seguro de que hay casos en los que podría ser beneficioso y el JIT no hace la optimización.
La próxima versión de Mono 2.2 tendrá soporte SIMD. Miguel de Icaza blogueó sobre la próxima función aquí , y la API está aquí .
Aunque habrá una biblioteca que admitirá el desarrollo bajo el tiempo de ejecución de .NET Windows de Microsoft, no tendrá los beneficios de rendimiento que está buscando a menos que ejecute el código bajo el tiempo de ejecución Mono. Lo cual podría ser factible dependiendo de tus circunstancias.
Actualización: Lanzamiento de Mono 2.2
Si desea hacer un "trozo" de trabajo, la mejor opción es escribirlo en C ++ utilizando las características intrínsecas de MMX / SSE y luego crear una clase de C ++ administrada muy simple / clr que ajuste su funcionalidad y la exponga como una clase .net Entonces su código puede usar ese ensamblaje como si fuera una clase normal.
Para obtener más información sobre los intrínsecos de VC, puede ver esta pequeña canción que escribí hace muchos años.
http://msdn.microsoft.com/en-us/library/0aws1s9k.aspx
Oh, estoy asumiendo que realmente quieres usar las funciones paralelas para acelerar algo. Como otros han señalado, si solo desea mover datos en fragmentos más grandes y similares, el JIT ya sabe cómo usar SSE para esos conceptos básicos.
Filip es correcto Tengo otra publicación anterior que muestra un ejemplo similar pero más detallado. De hecho, he ejecutado este código y lo he modificado para probarme a mí mismo que funciona. Estoy pensando en usar esta técnica en un proyecto en el que estoy trabajando y es por eso que estoy buscando ver qué puede ser nuevo ya que es un poco viejo. Como lo implica el autor, puede escribir cualquier función que desee en C ++, compilarla y luego copiar los bytes en su C #.
http://blogs.msdn.com/b/devinj/archive/2005/07/12/438323.aspx
Yo agregaría que la clase CLI C ++ de Joe es una buena idea también, sin embargo, no creo que el indicador del compilador sse y el indicador / clr sean compatibles en el mismo proyecto. Acabo de verificar que: tengo que escribir su código de alto rendimiento en un proyecto separado para usar el indicador del compilador SSE (/ arch: sse o / arch: sse2) ya que / clr es incomatible. Para hacer algo mucho más complejo que la aritmética simple en algunas entradas, creo que este es el mejor enfoque.
SIMD for .NET estará disponible en un futuro cercano. Se requiere RyuJIT (el compilador JIT de próxima generación para .NET) para esta característica ATM.
Debe utilizar la clase Microsoft.Numerics.Vectors.Vector<T>
del paquete Microsoft.Bcl.Simd para aprovechar esta característica. Código de muestra aquí .
Por fin es posible. Aquí la publicación http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx
Recientemente, Microsoft lanzó una biblioteca de vectores beta SIMD ( Microsoft.Bcl.Simd ) para C # que requiere la instalación del RyuJIT CTP y funciona solo con Windows 8.
También puede utilizar una biblioteca SSE nativa e invocarla desde C #. Por ejemplo, la biblioteca Yeppp, vea esta respuesta .