Utilizando la GPU con c #

Estoy tratando de obtener más poder de procesamiento de mi grilla.

Estoy usando todos los cpus / núcleos, ¿es posible utilizar la GPU con C #.

¿Alguien conoce alguna biblioteca u obtiene un código de muestra?

[ Editar OCT 2017 ya que incluso esta respuesta se vuelve bastante antigua ]

La mayoría de estas respuestas son bastante antiguas, así que pensé en dar un resumen actualizado de donde creo que cada proyecto es:

  • GPU.Net (TidePowerd) – Intenté esto hace 6 meses más o menos, y lo hice funcionar, aunque me tomó un poco de trabajo. Convierte el código del kernel C # a cuda en tiempo de comstackción. Lamentablemente, su sitio web ha estado inactivo y su github no se ha actualizado durante un par de años, lo que podría indicar que el proyecto está muerto …

  • Cudafy : de código abierto y muy fácil de usar. Convierte el código del núcleo C # en cuda en tiempo de ejecución (con capacidad de serializar y almacenar en caché). Puede ejecutar fácilmente el mismo código de kernel en la CPU (principalmente para la depuración). Admite múltiples GPU. Más ejemplos disponibles que otros aquí. El código repetitivo mencionado en otras respuestas es mínimo, y en mi caso al menos me ayudó a entender cómo funciona el código. Cuda / Nvidia solo. Desafortunadamente, parece que no actualizaron sus soluciones durante un par de años también (el último compromiso en 2015 – soporte de cuda 7.0).

  • Hybridizer . Solución comercial que comstack C # a CUDA. Ofrece una edición comunitaria gratuita en el mercado de estudios visuales y muestras en github .

  • AleaGPU Solución comercial con una edición comunitaria gratuita para consumidores GPUS. Vea los comentarios de Daniel para más detalles.

  • Brahma : ejecuta expresiones LINQ a través de OpenCL (también admite AMD). No hay mucha documentación / ejemplos. Última actualización en 2011.

  • C $ – el último desarrollo fue hace más de 10 años …

  • Microsoft Accelerator : similarmente, no parece que se esté desarrollando activamente por más tiempo.

  • algunos otros ( C ++ AMP , OpenTK – dead / Cloo ) – muchos de estos son solo enlaces – es decir, le permiten llamar a la GPU desde C #, pero su código kernel (código que realmente se ejecuta en la GPU) debe escribirse en C o OpenCL, lo que significa que debe usar (y aprender) otro idioma.

Como dije, recomendaría Cudafy a todos los demás, si funcionara en OpenCL y en Cuda sería perfecto.

EDIT SEP 2013 Cudafy ahora le permite comstackr para CUDA y OpenCL, por lo que ejecutará el mismo código C # en todas las GPU. Esto suena fantástico, aunque todavía no he probado la comstackción OpenCL.

Microsoft Research Accelerator era una biblioteca .NET GP GPU.

Encontré a Brahma … También tiene un proveedor de GPGPU que permite que los métodos se ejecuten en la GPU … Gracias por la pregunta … Aprendí algo nuevo hoy. 🙂

¿Podría recomendar XNA Game Studio como una posible vía de exploración? Está obviamente preparado para escribir juegos, pero le brinda acceso administrado a su tarjeta gráfica y un acceso mucho mejor a las funciones de enumeración de capacidades y al desarrollo de sombreadores que anteriormente estaba disponible en, digamos, Managed DirectX. También hay formas de combinar WinForms y XNA en aplicaciones híbridas:

http://www.ziggyware.com/news.php?readmore=866

Tendrá que esforzarse un poco para aprender la progtwigción del sombreador (XNA es compatible con HLSL), pero esto puede ser un enfoque más simple que aprender una solución específica del proveedor como CUDA de nVidia. La ventaja es que puede progtwigr en un entorno administrado al 100%. Aquí hay algunos enlaces HLSL:

http://www.ziggyware.com/weblinks.php?cat_id=9

El sitio GPGPU también es un destino recomendado para la progtwigción general de GPU:

http://gpgpu.org/

¡La mejor de las suertes!

¿Qué tal http://www.tidepowerd.com/ GPU.NET?

Aquí hay otro: CUDAfy . Suena como GPU.Net, en el sentido de que algo tan simple como un atributo de método puede hacer que todo el método se ejecute en la GPU. Pero a diferencia de GPU.Net, CUDAfy es gratuito y de código abierto.

No obstante, parece que GPU.Net no requiere un código repetitivo (según sus documentos, es “inyectado automáticamente por la herramienta de creación”) , mientras que CUDAfy sí.


Aquí hay un ejemplo de creación de una aplicación con CUDAfy.

Bueno, esta es una pregunta muy antigua, y dado que se ha preguntado, las cosas han cambiado mucho.
Otra opción para usar .Net para escribir código de GPU, que nadie ha mencionado en las respuestas en la GPU de Alea . Cubre C #, F # y VB.

Entorno profesional de desarrollo de software GPU para .NET y Mono. Verdaderamente multiplataforma

En el sitio oficial de F #, Alea es la primera opción para usar F # en la progtwigción de GPGPU.
Para conocer este marco, sugiero echar un vistazo a su lista completa de ejemplos .

Además de Brahma, eche un vistazo a C $ (pronunciado “C Bucks”). Desde su sitio CodePlex:

El objective de [C $] es crear un lenguaje y sistema unificados para la progtwigción paralela sin problemas en las GPU y CPU modernas.

Está basado en C #, evaluado de forma perezosa y se dirige a múltiples modelos de acelerador:

Actualmente, la lista de architectures previstas incluye GPU, CPU multinúcleo, Multi-GPU (SLI, CrossFire) y Multi-GPU + Multi-CPU Hybrid Architecture.

Hay una nueva solución de Microsoft en la ciudad: C ++ AMP (introducción aquí ).

El uso de C # sería a través de P / Invoke, como se muestra aquí para aplicaciones de escritorio, y aquí para aplicaciones Metro (no lo llames).

Editar: Debo señalar que C ++ AMP tiene una especificación abierta , lo que significa que no es necesariamente solo para el comstackdor de MS, o solo para Windows.

Editar: Aparentemente, la tecnología ahora está en “modo de mantenimiento”, lo que significa que están corrigiendo errores, pero no están desarrollando activamente.

Gestionado DirectX de alguna manera, podría funcionar

Si sus GPU son todas de la misma marca, es posible que pueda obtener el respaldo de GPGPU del proveedor, ya sea a través de Nvidia’s CUDA o ATI’s Stream. AFAIK, proporcionan archivos DLL, que puede usar a través de P / Invoke.

El software CenterSpace tiene computación impulsada por GPU en sus bibliotecas NMath que puede agregar al proyecto C #. Es un producto comercial.

Si va a aplicar sus propios algoritmos que necesitan kernels personalizados:

Recientemente he subido un proyecto de código abierto mío a este repository github que utiliza OpenCL.

Lo que hace (puedes consultar también desde su página wiki) es seleccionar múltiples dispositivos compatibles con OpenCL y una cadena de kernel del usuario y crear envoltorios de matriz C o C ++ y luego calcular usando todo, con la ayuda de un equilibrador de carga automática y un pipeliner (para ocultar latencias) para obtener una buena eficiencia de la PC.

Aquí hay un ejemplo de su uso (1024 workitems particionados en todos los dispositivos, cada uno ejecutando el mismo código pero usando datos diferentes y threadId):

// select all GPUs and all CPUs in same pc ClNumberCruncher gpuCpu = new ClNumberCruncher(AcceleratorType.GPU | AcceleratorType.CPU, @" __kernel void distributeTanh(__global float * data,__global int * data2) { int threadId=get_global_id(0); data[threadId]=tanh(data[threadId]); data2[threadId]=threadId; } "); // a wrapper that can hold C# or C++ arrays ClArray data = new ClArray(1024); ClArray data2 = new int[1024]; // load-balances "distributeTanh" on all devices more fairly // at each repeatation of this line with same compute-id(1 here) data.nextParam(data2).compute(gpuCpu, 1, "distributeTanh", 1024); // threadId in kernel receives unique continuous id value for all work // either it is in cpu or gpu doesn't matter // compute method also has parameters to enable pipelining to // elliminate buffer copy latencies or compute latencies 

cuando ya no se utilizan, liberan todos los recursos de C ++ con sus destructores.

Pero no es tan maduro, así que siéntase libre de agregar cualquier “problema” en la pestaña de problemas de github. Las clases relevantes de clúster de varios equipos no funcionan y aún no se han traducido al inglés, pero pueden usar todos los dispositivos en una sola PC al menos.

WPF también usa la GPU y puede agregar sombreadores personalizados usando HLSL.

  • Una serie sobre efectos basados ​​en GPU para WPF (Blog de Greg Schechter)