Pregunta

Estaba leyendo una pregunta sobre la optimización del código de c # y una solución era usar c ++ con SSE. ¿Es posible hacer SSE directamente desde un programa de C #?

¿Fue útil?

Solución

La próxima versión Mono 2.2 tendrá soporte SIMD. Miguel de Icaza escribió en su blog sobre la próxima función aquí , y la API está < a href = "http://go-mono.com/docs/index.aspx?tlink=0@N%3aMono.Simd" rel = "noreferrer"> aquí .

Aunque habrá una biblioteca que admitirá el desarrollo en el tiempo de ejecución de Windows .NET de Microsoft, no tendrá los beneficios de rendimiento que está buscando a menos que ejecute el código en el tiempo de ejecución de Mono. Lo que puede ser factible dependiendo de sus circunstancias.

Actualización: Mono 2.2 se lanzado

Otros consejos

¿Puede C # hacer explícitamente una llamada SSE?

No. C # no puede producir IL en línea y mucho menos ensamblado x86 / amd64 en línea.

El CLR, y más específicamente el JIT, usará SSE si está disponible, eliminando la necesidad de forzarlo en la mayoría de las circunstancias. Lo 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 realiza la optimización.

SIMD para .NET estará disponible en un futuro próximo. RyuJIT (el compilador JIT de próxima generación para .NET) requerido para esta función ATM.

Debe usar la clase Microsoft.Numerics.Vectors.Vector<T> del paquete Microsoft.Bcl.Simd para aprovechar esta característica. Código de muestra aquí .

Basado en esta publicación en el foro, el compilador MS JIT usa automáticamente SSE si SSE está disponible en la máquina de destino.

Si tiene una 'porción' de trabajo que desea hacer, la mejor opción es escribirla en C ++ usando los intrínsecos MMX / SSE y luego crear una clase de C ++ administrada muy simple / clr que envuelva su funcionalidad y la exponga fuera 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, supongo 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 tiene razón. Tengo otra publicación anterior que muestra un ejemplo similar pero más detallado. De hecho, ejecuté este código y lo modifiqué para demostrarme 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 el autor lo indica, 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

Agregaría que la clase CLI C ++ de Joe también es una buena idea, sin embargo, no creo que el indicador del compilador sse y el indicador / clr sean compatibles en el mismo proyecto. Acabo de verificar que: tiene 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 incompatible. Para hacer algo mucho más complejo que hacer aritmética simple en algunas entradas, creo que este es el mejor enfoque.

Recientemente, Microsoft lanzó una biblioteca de vectores SIMD beta ( Microsoft.Bcl.Simd ) para C # que requiere la instalación de RyuJIT CTP y solo funciona en Windows 8.

También puede usar una biblioteca SSE nativa e invocarla desde C #. Por ejemplo, la biblioteca Yeppp, consulte esta respuesta de StackOverflow .

Claro que puedes (la pregunta más importante es: ¿por qué lo harías? Simplemente déjalo en el 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 ensamblaje sin procesar. Puede leer más en blog de Michael Giagnocavo .

Aunque no lo he probado yo mismo, es posible utilizar Marshal.GetDelegateForFunctionPointer también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top