Ejecutar código C # en GPU


No tengo conocimiento de conceptos de programación de GPU y API. Tengo algunas preguntas:

  1. ¿Es posible escribir un fragmento de código C# administrado y compilarlo/traducirlo a algún tipo de módulo, que se puede ejecutar en la GPU? ¿O estoy condenado a tener dos implementaciones, una para administrar en la CPU y otra para la GPU (entiendo que habrá restricciones sobre lo que se puede ejecutar en la GPU)?
  2. ¿Existe una API decente y madura para programar de forma independiente ¿contra varios proveedores de hardware de GPU (es decir, una API común)?
  3. ¿Hay alguna práctica recomendada si se desea desarrollar aplicaciones que se ejecuten en una CPU, escritas en lenguaje administrado, y también proporcionar optimizaciones de velocidad si existe hardware de GPU adecuado?

También me gustaría tener enlaces a cualquier tipo de documentación con recursos de aprendizaje apropiados.

Mejor, Jozef

Author: TallGuy, 2010-11-08

6 answers

1) No - no para el caso general de C# - obviamente cualquier cosa puede ser creada para algún subconjunto del lenguaje

2) Sí-HLSL usando Direct X o Open GL

3) Generalmente no es posible: la codificación de CPU y GPU es fundamentalmente diferente

Básicamente no se puede pensar en la codificación de CPU y GPU como comparables. Una GPU es una herramienta de procesamiento en paralelo altamente especializada, para muchos cálculos simples en paralelo.

Tratando de escribir un programa general en una GPU con un montón de ramas, etc simplemente no será eficiente-tal vez ni siquiera es posible.

Sus arquitecturas de acceso a la memoria son totalmente diferentes.

Debe escribir para la CPU pero generar cálculos paralelos apropiados a la GPU.

 21
Author: James Gaunt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-12 20:20:49

1) No, no para el caso general de C#, pero un pequeño subconjunto, sí. Ya sea a través de un tiempo de ejecución (comprobar Tidepowerd GPU.NET) o a través de soporte de idioma (LINQ o Citas de código).

2) Sí, DirectCompute (DX11 Compute Shaders) y OpenCL son API maduras independientes del proveedor y puede encontrar enlaces.NET para ellas.

3) No, como dijo Santiago, son bestias diferentes. GPU son procesadores de alta latencia optimizados para aplicaciones paralelas de datos de alto rendimiento, mientras que la CPU es de baja latencia procesadores optimizados para aplicaciones secuenciales de propósito general.

El único proyecto de investigación que conozco que intenta abordar este problema es el lenguaje SPAP.

Mi consejo, no trate de encontrar la API universal perfecta / tiempo de ejecución porque no hay ninguna. Elija una tecnología existente (DirectCompute u OpenCL) y vea cómo puede aprovecharla para su negocio.

Enlaces Útiles para comenzar:

 17
Author: Stringer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-01 14:17:33

1) No que yo sepa, pero podría haber una biblioteca para C# que pueda ayudarte.

2) OpenCL. Es independiente de la GPU e incluso puede ejecutarse en CPU.

3) OpenCL le ayudará con eso, también puede compilar para CPU con OpenCL, aunque no estoy seguro de cuán grande de código hace para la CPU. Realmente me he enamorado de OpenCL últimamente, funciona muy, muy bien.

 2
Author: Xorlev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-07 22:02:08

También está brahma. Supuestamente captura expresiones y las compila para la GPU. No lo he intentado.

Y Microsoft tiene un prototipo de investigación llamado accelerator, que es similar en objetivo pero sintácticamente diferente.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-07 22:43:06

¿Has mirado Alea GPU? Allí las bibliotecas, aunque no son completamente gratuitas, tienen una licencia justa. Hay una gran documentación y una impresionante cadena de herramientas.

 1
Author: Guy Langston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-15 16:21:14

Para Java, ver el proyecto Aparci ( https://github.com/aparapi/aparapi ). Esto permite ejecutar un subconjunto de Java en cualquier GPU que soporte OpenCL. El bytecode de las clases del núcleo se compila de forma cruzada en tiempo de ejecución con el código OpenCL. Hay severas restricciones en el código java que puede ser compilado de forma cruzada-básicamente no se pueden usar objetos como campos, locales o args de métodos.

Sin embargo, una gran ventaja es que los núcleos se pueden ejecutar en Java u OpenCL (con recurrir a la ejecución de Java ThreadPool en caso de no disponibilidad de un dispositivo GPU/APU apropiado). Esto suena como lo más cercano a lo que está buscando en la parte 3 de su pregunta (aunque, por supuesto, el lenguaje administrado no es C#).

No tengo conocimiento de nada similar en C#.

 0
Author: barneypitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-21 15:03:39