2011-05-05 24 views
37

Estoy buscando utilizar la GPU para hacer algunas ecuaciones pero no puedo entender cómo puedo acceder a ella desde C#. Sé que los marcos XNA y DirectX te permiten usar sombreadores para acceder a la GPU, pero ¿cómo podría acceder a ellos sin estos marcos?Cómo usar la GPU para matemáticas

+0

NVidia, ATI, Intel o genérico? – Bobby

+0

@Bobby: Estaba buscando algo genérico, idealmente. –

+7

Sería interesante ver una respuesta que muestre cómo detectar la tarjeta gráfica y ejecutar el código en ella o recurrir a la CPU. – tiagoboldt

Respuesta

11

No lo he hecho desde C#, pero básicamente utilizas el CUDA (asumiendo que estás usando una tarjeta nVidia aquí, por supuesto) SDK y CUDA toolkit para llevarlo a cabo.

nVidia ha portado (¿o escrito?) Una implementación BLAS para su uso en dispositivos con capacidad CUDA. Han proporcionado muchos ejemplos de cómo hacer el cálculo numérico, aunque tendrás que averiguar cómo lo lograrás desde C#. Mi apuesta es que vas a tener que escribir algunas cosas en C o C++ no administrado y vincularlas.

Si no está acostumbrado a usar C#, eche un vistazo a Theano. Puede ser un poco exagerado para sus necesidades, ya que están construyendo un marco para hacer aprendizaje automático en GPU de Python, pero ... funciona y funciona muy bien.

7

¿Qué hay de Brahma (LINQ a GPU)?

¡Tengo que querer LINQ!

+1

Oops, acabo de enterarme de que no pude ver el enlace. Gracias por editar @Bobby, (todavía estoy aprendiendo SO). –

0

Me temo que mi conocimiento sobre el uso de la GPU es más bien teórico que escribir sombreadores para DirectX/XNA y profundizar un poco con CUDA (específico de NVidia). Sin embargo, he escuchado bastante sobre OpenCL (Open Computing Language) que te permite ejecutar algoritmos que OpenCL inteligentemente enviará a tus tarjetas gráficas, o ejecutar en la CPU si no tienes una GPU compatible.

El código que ejecuta en la GPU deberá escribirse específicamente en el subconjunto de C99 de OpenCL (disculpe si esto no cumple sus requisitos ya que ha preguntado cómo usarlo desde C#), pero más allá de los algoritmos de cálculo numérico , puede escribir el resto de su aplicación en C# y hacer que todo funcione bien junto con The Open Toolkit;

http://www.opentk.com/

7

Si su GPU es NVidia, puede utilizar CUDA.

Hay un ejemplo aquí, que explican toda la cadena, incluyendo algunos en C/C++ código: CUDA integration with C#

Y hay una biblioteca llamada CUDA.NET disponible aquí: CUDA.NET

Si su GPU es ATI , luego está ATI Stream. El soporte de .NET es menos claro para mí en esto. Tal vez el Open Toolkit Library lo tiene, a través del soporte OpenCL.

Y, por último, hay un proyecto de Microsoft Research llamado "Accelerator" que tiene un contenedor administrado que debería funcionar en cualquier hardware (siempre que sea compatible con DirectX 9).

1

Hay dos opciones si no quiere meterse con P/Invoke cosas y código no administrado:

  1. Uso mencionó CUDA.NET biblioteca. Funciona muy bien, pero se dirige a CUDA, por lo que solo las tarjetas nVidia. Si desea resolver problemas más complejos, debe aprender CUDA, escribir su propio kernel (en C ...), compilarlo con nvcc y ejecutar desde C# a través de esta biblioteca.
  2. Use Microsoft Research Accelerator. Es una buena biblioteca creada por MS Research que ejecuta su código en cualquier cosa que tenga muchos núcleos (GPU nVidia/ATI de muchos núcleos y procesadores multi-core). Es completamente independiente de la plataforma. Lo usé y estoy muy impresionado con los resultados. También hay una muy buena tutorial sobre el uso de Accelerator en C#.

La segunda opción es que se lo recomiendo, pero si usted no tiene ningún problema con que se pega a las GPU nVidia única - la primera probablemente sería más rápido.

1

Lo he hecho en C# aprovechando las bibliotecas CUDA de NVIDIA y la invocación/P de .NET. Esto requiere una gestión cuidadosa de la memoria y una buena comprensión detallada de las bibliotecas de CUDA. Esta técnica se puede usar junto con cualquier kernel GPU/CUDA personalizado que le gustaría crear en C, por lo que es un enfoque flexible muy poderoso.

Si desea ahorrarse un gran esfuerzo, puede comprar NMath Premium del software CenterSpace (para quien trabajo) y puede estar corriendo grandes problemas con su GPU NVIDIA en minutos desde C#. NMath Premium una gran biblioteca matemática C#/.NET que puede ejecutar gran parte de LAPACK y FFT en la GPU, pero vuelve a la CPU si el hardware no está disponible o el tamaño del problema no justifica un viaje de ida y vuelta a la GPU.

Cuestiones relacionadas