cudafy c# math gpu-programming

cudafy - cuda c#



Cómo utilizar GPU para matemáticas (6)

Estoy buscando utilizar la GPU para analizar 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?


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

Tengo que amar LINQ!


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

  1. Use la biblioteca CUDA.NET mencionada. 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 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 un muy buen tutorial sobre el uso de Accelerator en C #.

La segunda opción es que lo recomendaría, pero si no tienes problemas con solo las GPU nVidia, la primera sería probablemente más rápida.


Lo hice en C # aprovechando las bibliotecas CUDA de NVIDIA y la invocación / invocación 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 tener grandes problemas en 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.


Me temo que mi conocimiento sobre el uso de la GPU es más bien teórico que escribir shaders 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 ejecute en la GPU deberá escribirse específicamente en el subconjunto de C99 de OpenCL (disculpe si esto no cumple con 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 usando The Open Toolkit;

http://www.opentk.com/


No lo hice 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 de 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 te gusta colgar C #, echa 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.


Si su GPU es NVidia, puede usar CUDA .

Aquí hay un ejemplo que explica toda la cadena, incluido algún código C / C ++: integración CUDA con C #

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

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

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