Introducción a la programación de GPU [cerrado]

176

Todos tienen esta enorme supercomputadora paralela masiva en su escritorio en forma de tarjeta gráfica GPU.

  • ¿Cuál es el equivalente de "hola mundo" de la comunidad de GPU?
  • ¿Qué hago, a dónde voy, para comenzar a programar la GPU para los principales proveedores de GPU?

-Adán

Adam Davis
fuente
1
¿Estás hablando de GPGPU o codificación de gráficos?
Menkboy
55
Está hablando de CUDA (una API para GPU nVidia) y otras técnicas. Uso de las unidades FPU disponibles en GPU para la codificación sin gráficos.
Wedge
1
Como referencia, una GeForce 8800 de última generación tiene 128 procesadores de flujo que funcionan a ~ 1.3 GHz, una GTX 280 de primera línea tiene 240 procesadores de flujo, el rendimiento teórico de estas GPU es 0.5 y 0.9 TeraFLOPS, respectivamente.
Wedge

Respuestas:

70

Echa un vistazo a CUDA by NVidia, IMO es la plataforma más fácil para hacer programación de GPU. Hay toneladas de materiales geniales para leer. http://www.nvidia.com/object/cuda_home.html

Hola mundo sería hacer cualquier tipo de cálculo con GPU.

Espero que ayude.

Nazgob
fuente
17
  1. Obtiene sombreadores de vértices y píxeles programables que permiten la ejecución de código directamente en la GPU para manipular los búferes que se dibujarán. Estos lenguajes (es decir, GL Shader Lang de OpenGL y Shader Lang de alto nivel y equivalentes de DirectX) son sintaxis de estilo C y realmente fáciles de usar. Algunos ejemplos de HLSL se pueden encontrar aquí para XNA Game Studio y Direct X. No tengo referencias GLSL decentes, pero estoy seguro de que hay muchas. Estos lenguajes de sombreado brindan una inmensa cantidad de poder para manipular lo que se dibuja en un nivel por vértice o por píxel, directamente en la tarjeta gráfica, lo que hace que cosas como las sombras, la iluminación y la floración sean realmente fáciles de implementar.
  2. Lo segundo que viene a la mente es usar openCL para codificar las nuevas líneas de GPU de uso general. No estoy seguro de cómo usar esto, pero entiendo que openCL le ofrece el comienzo de poder acceder a los procesadores tanto en la tarjeta gráfica como en la CPU normal. Esta no es una tecnología convencional todavía, y parece ser impulsada por Apple.
  3. CUDA parece ser un tema candente. CUDA es la forma en que nVidia accede a la potencia de la GPU. Aquí hay algunas introducciones
DavidG
fuente
9

Creo que los demás han respondido tu segunda pregunta. En cuanto al primero, el "Hola Mundo" de CUDA, no creo que haya un estándar establecido, pero personalmente, recomendaría un sumador paralelo (es decir, un programa que suma N enteros).

Si observa el ejemplo de "reducción" en el SDK de NVIDIA, la tarea superficialmente simple puede extenderse para demostrar numerosas consideraciones de CUDA, como lecturas fusionadas, conflictos de bancos de memoria y desenrollamiento de bucles.

Vea esta presentación para más información:

http://www.gpgpu.org/sc2007/SC07_CUDA_5_Optimization_Harris.pdf

biozinc
fuente
7

Eche un vistazo al SDK de ATI Stream Computing . Está basado en BrookGPU desarrollado en Stanford.

En el futuro, todo el trabajo de GPU se estandarizará con OpenCL . Es una iniciativa patrocinada por Apple que será neutral para los proveedores de tarjetas gráficas.

gráficos
fuente
7

OpenCL es un esfuerzo para crear una biblioteca multiplataforma capaz de programar código adecuado para, entre otras cosas, GPU. Le permite a uno escribir el código sin saber en qué GPU se ejecutará, lo que facilita el uso de parte de la potencia de la GPU sin tener como objetivo específicamente varios tipos de GPU. Sospecho que no es tan eficaz como el código de GPU nativo (o tan nativo como lo permitirán los fabricantes de GPU), pero la compensación puede valer la pena para algunas aplicaciones.

Todavía está en sus etapas relativamente tempranas (1.1 a partir de esta respuesta), pero ha ganado algo de tracción en la industria, por ejemplo, es compatible de forma nativa con OS X 10.5 y superior.

Adam Davis
fuente
6

CUDA es un excelente marco para comenzar. Le permite escribir núcleos GPGPU en C. El compilador producirá microcódigo GPU a partir de su código y enviará todo lo que se ejecuta en la CPU a su compilador habitual. Sin embargo, es NVIDIA y solo funciona en tarjetas de la serie 8 o superior. Puede consultar la zona CUDA para ver qué se puede hacer con ella. Hay algunas demostraciones excelentes en el SDK de CUDA . La documentación que viene con el SDK es un buen punto de partida para escribir código. Le guiará a través de la escritura de un núcleo de multiplicación matricial, que es un excelente lugar para comenzar.

Jay Conrod
fuente
5

Otra forma fácil de ingresar a la programación de GPU, sin ingresar a CUDA u OpenCL, es hacerlo a través de OpenACC .

OpenACC funciona como OpenMP, con directivas de compilación (como #pragma acc kernels) para enviar trabajo a la GPU. Por ejemplo, si tiene un bucle grande (solo los más grandes realmente se benefician):

int i;
float a = 2.0;
float b[10000];
#pragma acc kernels
for (i = 0; i < 10000; ++i) b[i] = 1.0f;
#pragma acc kernels
for (i = 0; i < 10000; ++i) {
  b[i] = b[i] * a;
}

Editar: desafortunadamente, solo el compilador PGI realmente admite OpenACC en este momento, para tarjetas GPU NVIDIA.

Kyle Niemeyer
fuente
3

Prueba GPU ++ y libSh

El enlace LibSh tiene una buena descripción de cómo unen el lenguaje de programación a las primitivas gráficas (y obviamente, las primitivas mismas), y GPU ++ describe de qué se trata, ambos con ejemplos de código.

gbjbaanb
fuente
3

Si usa MATLAB, se vuelve bastante simple usar GPU para computación técnica (computaciones matriciales y cálculo de números / matemática). Lo encuentro útil para usos de tarjetas GPU fuera de los juegos. Revisa el enlace a continuación:

http://www.mathworks.com/discovery/matlab-gpu.html

Chetan Rawal
fuente