Utilizando la GPU con c # [cerrado]

135

Estoy tratando de obtener más potencia de procesamiento de mi red.

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

¿Alguien sabe alguna biblioteca o tiene algún código de muestra?

Mark Cidade
fuente

Respuestas:

156

[ Edite 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 dónde creo que está cada proyecto:

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

  • Cudafy : código abierto y muy fácil de usar. Convierte el código del kernel C # a cuda en tiempo de ejecución (con capacidad para 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 al que se refieren otras respuestas es mínimo, y en mi caso al menos me ayudó a comprender cómo funciona el código. Cuda / Nvidia solo sin embargo. Desafortunadamente, parece que tampoco actualizaron sus soluciones durante un par de años (último compromiso en 2015 - soporte de cuda 7.0).

  • Hibridizador . Solución comercial compilando C # a CUDA. Proporciona una edición comunitaria gratuita en el mercado visual studio y muestras en github .

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

  • Brahma : ejecuta expresiones LINQ a través de OpenCL (por lo que también es compatible con AMD). No mucha documentación / ejemplos. Última actualización en 2011.

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

  • Microsoft Accelerator : de manera similar, parece que ya no se está desarrollando activamente.

  • 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 de 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 sobre todos los demás; si pudiera ejecutarse tanto en OpenCL como en Cuda, sería perfecto.

EDITAR SEP 2013 Cudafy ahora le permite compilar tanto para CUDA como para 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 compilación de OpenCL.

mcmillab
fuente
31
+1 para actualizar una pregunta útil en una especie de tema de rápido desarrollo.
filólogo
2
Alea GPU quantalea.com proporciona soporte CUDA para todos los lenguajes .NET, es completamente multiplataforma y brinda la mejor experiencia de desarrollador con depuración y creación de perfiles de código de GPU .NET.
Daniel
El soporte de OpenCL en Cudafy es bastante malo: nunca logré compilar cuando mi proyecto creció. Por lo tanto, me quedaré con OpenCL simple y haré enlaces a C #.
Libor
OpenCL usando Cudafy funciona bien para mí, lo he estado usando durante años ahora
mcmillab
Se agregaron enlaces a proyectos para ayudar a futuros visitantes.
Dan Atkinson
46

Microsoft Research Accelerator era una biblioteca .NET GP GPU.

Mark Cidade
fuente
Ese fue un gran proyecto con una política de licencias deficiente. Desafortunadamente, ya no está disponible en el sitio de MS ...
ForNeVeR
25

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. :)

Vyas Bharghava
fuente
10

¿Podría recomendar XNA Game Studio como una posible vía de exploración? Obviamente, está 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, por ejemplo, en DirectX administrado. También hay formas de combinar WinForms y XNA en aplicaciones híbridas:

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

Tendrá que esforzarse en aprender la programación del sombreador (XNA admite HLSL), pero este puede ser un enfoque más simple que aprender una solución específica del proveedor, como el CUDA de nVidia. La ventaja es que puede programar en un entorno 100% administrado. 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 programación de GPU de propósito general:

http://gpgpu.org/

¡La mejor de las suertes!

Dave R.
fuente
1
Saludos desde el futuro. Aunque podría decirse que fue una buena respuesta en ese momento (incursioné bastante en XNA), lamentablemente XNA ahora está extinta
MickyD
@MickyD Great Scott! Cuando me subí a mi DeLorean y viajé hacia 2018, ¡olvidé por completo actualizar esta respuesta! Si todavía está interesado en XNA, el sucesor espiritual es probablemente el MonoGame multiplataforma: monogame.net
Dave R.
Jajaja Gracias, lo comprobaré
MickyD
9

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

pointernil
fuente
2
Me encanta la idea, pero dejaron de responder a las preguntas de soporte técnico hace aproximadamente dos años, y el sitio ha estado más o menos inactivo durante aproximadamente un año, por lo que creo que el proyecto está muerto. Aparentemente, el autor está en SO , sin embargo.
BlueRaja - Danny Pflughoeft
Tidedpowerd detuvo el desarrollo de GPU.NET y cerró su negocio.
Daniel
9

Aquí hay otro: CUDAfy . Parece GPU.Net, ya 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.

GPU.Net parece no requerir código repetitivo, sin embargo (según sus documentos, es "inyectado automáticamente por la herramienta de compilación") , mientras que CUDAfy sí.


Aquí hay un ejemplo de cómo construir una aplicación con CUDAfy.

BlueRaja - Danny Pflughoeft
fuente
8

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

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

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

Rsh
fuente
1
Acabo de ver tu respuesta, eliminará mi publicación. Vea también la entrevista del Canal 9 de Seth Juarez aquí y la etiqueta SO aquí )
David Cuccia
@DavidCuccia Gran trabajo en verificar sus viejas respuestas. Y también gracias por el enlace del canal 9 (¡diciembre de 2016!)
Rsh
Creo que te refieres a esta grabación del Canal 9
Daniel
@Daniel quise decir "enlace a la grabación del canal 9". ¿Eso fue ambiguo? De todos modos, gracias por señalar.
Rsh
@DavidCuccia perdón por la confusión, el enlace era difícil de ver
Daniel
7

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

El objetivo de [C $] es crear un lenguaje y un sistema unificados para una programación paralela sin interrupciones en las GPU y CPU modernas.

Se basa en C #, se evalúa perezosamente y se dirige a múltiples modelos de aceleradores:

Actualmente, la lista de arquitecturas previstas incluye GPU, CPU multinúcleo, Multi-GPU (SLI, CrossFire) y Arquitectura híbrida Multi-GPU + Multi-CPU.

David Cuccia
fuente
7

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

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

Editar: debo tener en cuenta que C ++ AMP tiene una especificación abierta , lo que significa que no es necesariamente solo para el compilador de MS, o solo para Windows.

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

David Cuccia
fuente
2

DirectX administrado de alguna manera, podría funcionar

Greg Dean
fuente
2
Saludos desde el futuro. Aunque podría decirse que fue una buena respuesta en ese momento, lamentablemente MDX ahora está extinto, ya que ha sido reemplazado por XNA, que también está desactivado.
MickyD
2

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

Coderer
fuente
1

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

Pasi Tuomainen
fuente
0

Si va a aplicar sus propios algoritmos que necesitan núcleos personalizados:

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

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

Aquí hay un ejemplo de su uso (1024 elementos de trabajo particionados en todos los dispositivos, cada uno de los cuales ejecuta el mismo código pero usa diferentes datos e 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<float> data = new ClArray<float>(1024);
ClArray<int> 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 usan, 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 multi-pc-cluster no funcionan y aún no están traducidas al inglés, pero pueden usar todos los dispositivos en una sola PC al menos.

huseyin tugrul buyukisik
fuente
-2

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

Mark Cidade
fuente
WPF no tiene acceso de cómputo GP GPU, que yo sepa. Cuando hablamos de gráficos WPF System.Windows.Media, no es DirectX real. Muy lento en comparación con la programación de vértices de nivel inferior con SharpDX o SlimDX.
Pasi Tuomainen
Agregué un enlace a una serie de artículos sobre efectos personalizados acelerados por GPU en WPF.
Mark Cidade