Diferencia entre revisiones de «CUDA»
(→Tarjetas Soportadas) |
(→Tarjetas Soportadas) |
||
Línea 119: | Línea 119: | ||
ejemplo de una imagen (un pixel). | ejemplo de una imagen (un pixel). | ||
− | == Tarjetas Soportadas == | + | == Tarjetas Soportadas == |
+ | |||
{| cellpadding="12" | {| cellpadding="12" | ||
|- valign="top" | |- valign="top" | ||
− | + | | | |
− | + | {| class="standard" | |
− | + | |- | |
− | + | ! [[GeForce|Nvidia GeForce]] <br> | |
− | + | |- | |
− | + | | GeForce GTX 295 | |
− | + | |- | |
− | + | | GeForce GTX 285 | |
− | + | |- | |
− | + | | GeForce GTX 280 | |
− | + | |- | |
− | + | | GeForce GTX 275 | |
− | + | |- | |
− | + | | GeForce GTX 260 | |
− | + | |- | |
− | + | | GeForce GTS 250 | |
− | + | |- | |
− | + | | GeForce GT 220 | |
− | + | |- | |
− | + | | GeForce G210 | |
− | + | |- | |
− | + | | GeForce 9800 GX2 | |
− | + | |- | |
− | + | | GeForce 9800 GTX+ | |
− | + | |- | |
− | + | | GeForce 9800 GTX | |
− | + | |- | |
− | + | | GeForce 9800 GT | |
− | + | |- | |
− | + | | GeForce 9600 GSO | |
− | + | |- | |
− | + | | GeForce 9600 GT | |
− | + | |- | |
− | + | | GeForce 9500 GT | |
− | + | |- | |
− | + | | GeForce 9400 GT | |
− | + | |- | |
− | + | | GeForce 9400 mGPU | |
− | + | |- | |
− | + | | GeForce 9300 mGPU | |
− | + | |- | |
− | + | | GeForce 8800 Ultra | |
− | + | |- | |
− | + | | GeForce 8800 GTX | |
− | + | |- | |
− | + | | GeForce 8800 GTS | |
− | + | |- | |
− | + | | GeForce 8800 GT | |
− | + | |- | |
− | + | | GeForce 8800 GS | |
− | + | |- | |
− | + | | GeForce 8600 GTS | |
− | + | |- | |
− | + | | GeForce 8600 GT | |
− | + | |- | |
− | + | | GeForce 8600 mGT | |
− | + | |- | |
− | + | | GeForce 8500 GT | |
− | + | |- | |
− | + | | GeForce 8400 GS | |
− | + | |- | |
− | + | | GeForce 8300 mGPU | |
− | + | |- | |
− | + | | GeForce 8200 mGPU | |
− | + | |- | |
− | + | | GeForce 8100 mGPU | |
− | + | |} | |
− | + | ||
− | + | | | |
− | + | {| class="standard" | |
− | + | |- | |
− | + | ! [[GeForce|Nvidia GeForce Mobile]] | |
− | + | |- | |
− | + | | GeForce GTS 360M | |
− | + | |- | |
− | + | | GeForce GTX 280M | |
− | + | |- | |
− | + | | GeForce GTX 260M | |
− | + | |- | |
− | + | | GeForce GTS 260M | |
− | + | |- | |
− | + | | GeForce GTS 250M | |
− | + | |- | |
− | + | | GeForce GT 330M | |
− | + | |- | |
− | + | | GeForce GT 240M | |
− | + | |- | |
− | + | | GeForce GT 230M | |
− | + | |- | |
− | + | | GeForce GT 220M | |
− | + | |- | |
− | + | | GeForce G210M | |
− | + | |- | |
− | + | | GeForce 9800M GTX | |
− | + | |- | |
− | + | | GeForce 9800M GTS | |
− | + | |- | |
− | + | | GeForce 9800M GT | |
− | + | |- | |
− | + | | GeForce 9700M GTS | |
− | + | |- | |
− | + | | GeForce 9700M GT | |
− | + | |- | |
− | + | | GeForce GT 130M | |
− | + | |- | |
− | + | | GeForce 9650M GT | |
− | + | |- | |
− | + | | GeForce 9650M GS | |
− | + | |- | |
− | + | | GeForce 9600M GT | |
− | + | |- | |
− | + | | GeForce 9600M GS | |
− | + | |- | |
− | + | | GeForce 9500M GS | |
− | + | |- | |
− | + | | GeForce 9500M G | |
− | + | |- | |
− | + | | GeForce 9400M G | |
− | + | |- | |
− | + | | GeForce 9300M GS | |
− | + | |- | |
− | + | | GeForce 9300M G | |
− | + | |- | |
− | + | | GeForce 9200M GS | |
− | + | |- | |
− | + | | GeForce 9100M G | |
− | + | |- | |
− | + | | GeForce 8800M GTS | |
− | + | |- | |
− | + | | GeForce 8700M GT | |
− | + | |- | |
− | + | | GeForce 8600M GT | |
− | + | |- | |
− | + | | GeForce 8600M GS | |
− | + | |- | |
− | + | | GeForce 8400M GT | |
− | + | |- | |
− | + | | GeForce 8400M GS | |
− | + | |- | |
− | + | | GeForce 8400M G | |
− | + | |- | |
− | + | | GeForce 8200M G | |
− | + | |} | |
− | + | ||
− | + | | | |
− | + | {| align="left" class="standard" style="width: 175px; height: 454px;" | |
− | + | |- | |
− | + | ! valign="middle" align="left" | [[Nvidia Quadro|Nvidia Quadro ]] | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 5800 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 5600 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 4800 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 4700 X2 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 4600 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 3700 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 1800 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 1700 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 570 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 370 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro NVS 290 | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 3600M | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 1600M | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 770M | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 570M | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro FX 370M | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro Plex 1000 Model IV | |
− | + | |- | |
− | + | | valign="middle" align="left" | Quadro Plex 1000 Model S4 | |
− | + | |} | |
− | + | ||
− | + | | | |
− | + | {| style="width: 129px; height: 194px;" class="standard" | |
− | + | |- | |
− | + | ! [[Nvidia Quadro Mobile]] | |
− | + | |- | |
− | + | | Quadro NVS 360M | |
− | + | |- | |
− | + | | Quadro NVS 140M | |
− | + | |- | |
− | + | | Quadro NVS 135M | |
− | + | |- | |
− | + | | Quadro NVS 130M | |
− | + | |} | |
− | + | ||
− | + | | | |
− | + | {| class="standard" | |
− | + | |- | |
− | + | ! [[Nvidia Tesla]] | |
− | + | |- | |
− | + | | Tesla S1070 | |
− | + | |- | |
+ | | Tesla C1060 | ||
+ | |- | ||
+ | | Tesla C870 | ||
+ | |- | ||
+ | | Tesla D870 | ||
+ | |- | ||
+ | | Tesla S870 | ||
+ | |} | ||
+ | |||
+ | |} | ||
+ | |||
+ | | ||
== Enlaces externos == | == Enlaces externos == |
Revisión del 19:37 27 mar 2011
|
CUDA son las siglas de (Compute Unified Device Architecture) que
hace referencia tanto a un compilador como a un conjunto de herramientas de desarrollo creadas
por nVidia que permiten a los programadores usar una variación del lenguaje de programación C para codificar algoritmos en GPUs de nVidia.
Por medio de Adapter (patrón de diseño)wrappers se puede usar Python, Fortran y Java en vez de C/C++ y en el futuro también se añadirá FORTRAN, OpenCL y Direct3D.
Funciona en todas las GPUs nVidia de la serie G8X en adelante, incluyendo GeForce, Quadro y la línea Tesla. nVidia afirma que los programas desarrollados para la serie GeForce 8 también funcionarán sin modificaciones en todas las futuras tarjetas nVidia,gracias a la compatibilidad binaria.
CUDA intenta explotar las ventajas de las GPUs frente a las CPUs de propósito general utilizando el paralelismo que ofrecen sus múltiples núcleos, que permiten el lanzamiento de un altísimo número de
hilos simultáneos. Por ello, si una aplicación está diseñada utilizando numerosos hilos que realizan tareas independientes (que es lo que hacen las GPUs al procesar gráficos, su tarea natural), una GPU podrá ofrecer un gran rendimiento en campos que podrían ir desde la biología computacional a la criptografía por ejemplo.
El primer SDK se publicó en febrero de 2007 en un principio para Windows, Linux, y más
adelante en su versión 2.0 para Mac OS. Actualmente se ofrece para Windows XP Windows Vista, Windows 7, para Linux 32/64 bits y para Mac OS.
Ejemplo de flujo de procesamiento CUDA
1. Se copian los datos de la memoria principal a la memoria de la GPU
2. La CPU encarga el proceso a la GPU
3. La GPU lo ejecuta en paralelo en cada núcleo
4. Se copia el resultado de la memoria de la GPU a la memoria principal
Sumario
Ventajas
CUDA presenta ciertas ventajas sobre otros tipos de computación sobre GPU utilizando APIs gráficas.
- Lecturas dispersas: se puede consultar cualquier posición de memoria.
- Memoria compartida: CUDA pone a disposición del programador un área de memoria de 16KB que se
compartirá entre threads. Dado su tamaño y rapidez puede ser utilizada como caché.
- Lecturas más rápidas de y hacia la GPU.
- Soporte para enteros y operadores a nivel de bit.
Limitaciones
- No se puede utilizar recursividad, punteros a funciones, variables estáticas dentro de funciones
o funciones con número de parámetros variable
- No está soportado el renderizado de texturas
- En precisión simple no soporta números desnormalizados o NaNs
- Puede existir un cuello de botella entre la CPU y la GPU por los anchos de banda de los buses y
sus latencias.
- Los threads, por razones de eficiencia, deben lanzarse en grupos de al menos 32, con miles de
hilos en total.
El modelo CUDA
CUDA intenta aprovechar el gran paralelismo, y el alto ancho de banda de la memoria en las GPUs en aplicaciones con un gran coste aritmético frente a realizar numerosos accesos a memoria principal, lo que podría actuar de cuello de botella.
El modelo de programación de CUDA está diseñado para que se creen aplicaciones que de forma transparente escalen su paralelismo para poder incrementar el número de núcleos computacionales. Este diseño contiene tres puntos claves, que son la jerarquía de grupos de hilos, las memorias compartidas y las barreras de sincronización.
La estructura que se utiliza en este modelo está definido por un grid, dentro del cual hay bloques de hilos que están formados por como máximo 512 hilos distintos.
Cada hilo está identificado con un identificador único, que se accede con la variable threadIdx. Esta variable es muy útil para repartir el trabajo entre distintos hilos. threadIdx tiene 3 componentes (x, y, z), coincidiendo con las dimensiones de bloques de hilos. Así, cada elemento de una matriz, por ejemplo, lo podría tratar su homólogo en un bloque de hilos de dos dimensiones.
Al igual que los hilos, los bloques se identifican mediante blockIdx (en este caso con dos componentes x e y). Otro parámetro útil es blockDim, para acceder al tamaño de bloque.
Kernel
Un kernel en C para CUDA, es una función la cual al ejecutarse lo hará en N distintos hilos en lugar de en secuencial.
Invocaciones a un kernel
En una llamada a un kernel, se le ha de pasar el tamaño de grid y de bloque
Sincronización
Como los distintos hilos colaboran entre ellos y pueden compartir datos, se requieren unas directivas de sincronización. En un kernel, se puede explicitar una barrera incluyendo una llamada a __syncthreads(), en la que todos los hilos se esperarán a que los demás lleguen a ese mismo punto.
Jerarquía de memoria
Los hilos en CUDA pueden acceder a distintas memorias, unas compartidas y otras no.
- En primer lugar, está la memoria privada de cada hilo, solamente accesible desde él mismo.
- Cada bloque de hilos posee también un espacio de memoria, compartida en este caso por los hilos
del bloque y con un ámbito de vida igual que el del propio bloque.
- Todos los hilos pueden acceder a una memoria global.
Además, existen otros dos espacios de memoria más, que son de solo lectura y accesibles por todos los hilos. Son la memoria constante y la de texturas. Todas las memorias de acceso global persisten mientras esté el kernel en ejecución.
Arquitectura CUDA
Un multiprocesador contiene ocho procesadores escalares, dos unidades especiales para funciones trascendentales, una unidad multihilo de instrucciones y una memoria compartida. El multiprocesador crea y maneja los hilos sin ningún tipo de overhead por la planificación, lo cual unido a una rápida sincronización por barreras y una creación de hilos muy ligera, consigue que se pueda utilizar CUDA en problemas de muy baja granularidad, incluso asignando un hilo a un elemento por ejemplo de una imagen (un pixel).
Tarjetas Soportadas
|
|
|
|
|