Desarrollador (es) | Nvidia |
---|---|
Versión inicial | 23 de junio de 2007 |
Lanzamiento estable | 11.3.0 / 15 de abril de 2021 |
Sistema operativo | Windows , Linux |
Plataforma | GPU compatibles |
Tipo | GPGPU |
Licencia | Propiedad |
Sitio web | desarrollador |
CUDA ( acrónimo de Compute Unified Device Architecture ) es una plataforma de computación paralela y un modelo de interfaz de programación de aplicaciones (API) creado por Nvidia . [1] Permite a los desarrolladores de software e ingenieros de software utilizar una unidad de procesamiento de gráficos (GPU) habilitada para CUDA para el procesamiento de propósito general, un enfoque denominado GPGPU (computación de propósito general en unidades de procesamiento de gráficos). La plataforma CUDA es una capa de software que da acceso directo al conjunto de instrucciones virtuales de la GPU y elementos computacionales paralelos, para la ejecución decalcular núcleos . [2]
La plataforma CUDA está diseñada para trabajar con lenguajes de programación como C , C ++ y Fortran . Esta accesibilidad facilita que los especialistas en programación paralela usen los recursos de la GPU, en contraste con las API anteriores como Direct3D y OpenGL , que requerían habilidades avanzadas en programación gráfica. [3] Las GPU con tecnología CUDA también admiten marcos de programación como OpenMP , OpenACC y OpenCL ; [4] [2] y HIP compilando dicho código en CUDA. Cuando Nvidia introdujo CUDA por primera vez, el nombre era un acrónimo de Compute Unified Device Architecture, [5] pero posteriormente Nvidia abandonó el uso común del acrónimo.
Antecedentes [ editar ]
La unidad de procesamiento de gráficos (GPU), como procesador de computadora especializado, aborda las demandas de las tareas de computación intensiva de gráficos 3D de alta resolución en tiempo real . En 2012, las GPU se habían convertido en sistemas multinúcleo altamente paralelos que permitían una manipulación muy eficiente de grandes bloques de datos. Este diseño es más efectivo que la unidad central de procesamiento (CPU) de propósito general para algoritmos en situaciones en las que el procesamiento de grandes bloques de datos se realiza en paralelo, como:
- algoritmo de flujo máximo push-reetiquetado
- algoritmos de clasificación rápida de listas grandes
- transformada de wavelet rápida bidimensional
- simulaciones de dinámica molecular
- aprendizaje automático
Habilidades de programación [ editar ]
Los desarrolladores de software pueden acceder a la plataforma CUDA a través de bibliotecas aceleradas por CUDA, directivas de compilación como OpenACC y extensiones de lenguajes de programación estándar de la industria, incluidos C , C ++ y Fortran . Los programadores de C / C ++ pueden usar 'CUDA C / C ++', compilado en PTX con nvcc , el compilador C / C ++ basado en LLVM de Nvidia . [6] Los programadores de Fortran pueden usar 'CUDA Fortran', compilado con el compilador PGI CUDA Fortran de The Portland Group .
Además de las bibliotecas, las directivas del compilador, los soportes de plataforma CUDA otras interfaces computacionales, incluyendo CUDA C / C ++ y Fortran CUDA Khronos Group 's OpenCL , [7] de Microsoft DirectCompute , OpenGL Compute Shader y C ++ AMP . [8] Los contenedores de terceros también están disponibles para Python , Perl , Fortran , Java , Ruby , Lua , Common Lisp , Haskell , R , MATLAB , IDL ,Julia y apoyo nativo en Mathematica .
En la industria de los juegos de computadora , las GPU se utilizan para la representación de gráficos y para los cálculos de la física del juego (efectos físicos como escombros, humo, fuego, fluidos); los ejemplos incluyen PhysX y Bullet . CUDA también se ha utilizado para acelerar aplicaciones no gráficas en biología computacional , criptografía y otros campos en un orden de magnitud o más. [9] [10] [11] [12] [13]
CUDA proporciona una API de bajo nivel (CUDA Driver API, no de fuente única) y una API de nivel superior (CUDA Runtime API, de fuente única). El SDK de CUDA inicial se hizo público el 15 de febrero de 2007, para Microsoft Windows y Linux . La compatibilidad con Mac OS X se agregó posteriormente en la versión 2.0, [14] que reemplaza la beta lanzada el 14 de febrero de 2008. [15] CUDA funciona con todas las GPU de Nvidia de la serie G8x en adelante, incluidas GeForce , Quadro y la línea Tesla . CUDA es compatible con la mayoría de los sistemas operativos estándar.
CUDA 8.0 viene con las siguientes bibliotecas (para compilación y tiempo de ejecución, en orden alfabético):
- cuBLAS - Biblioteca de subrutinas de álgebra lineal básica CUDA
- CUDART - biblioteca en tiempo de ejecución CUDA
- cuFFT - Biblioteca de transformada rápida de Fourier CUDA
- cuRAND - Biblioteca de generación de números aleatorios CUDA
- cuSOLVER: colección basada en CUDA de solucionadores directos densos y escasos
- cuSPARSE - Biblioteca de matrices dispersas CUDA
- NPP: biblioteca de primitivas de rendimiento de NVIDIA
- nvGRAPH: biblioteca de NVIDIA Graph Analytics
- NVML - Biblioteca de administración de NVIDIA
- NVRTC: biblioteca de compilación en tiempo de ejecución de NVIDIA para CUDA C ++
CUDA 8.0 viene con estos otros componentes de software:
- nView - Software de administración de escritorio NVIDIA nView
- NVWMI: kit de herramientas de administración empresarial de NVIDIA
- GameWorks PhysX : es un motor de física de juegos multiplataforma
CUDA 9.0–9.2 viene con estos otros componentes:
- CUTLASS 1.0 - algoritmos personalizados de álgebra lineal,
NVCUVID- El decodificador de video NVIDIA quedó obsoleto en CUDA 9.2; ahora está disponible en NVIDIA Video Codec SDK
CUDA 10 viene con estos otros componentes:
- nvJPEG: procesamiento JPEG híbrido (CPU y GPU)
Cuda 11 a 11.3 viene con estos otros componentes: [16] [17] [18] [19]
- CUB es una de las bibliotecas de C ++ más compatibles
- Compatibilidad con GPU de instancias múltiples MIG
Ventajas [ editar ]
CUDA tiene varias ventajas sobre el cálculo tradicional de uso general en GPU (GPGPU) que utiliza API de gráficos:
- Lecturas dispersas: el código puede leer desde direcciones arbitrarias en la memoria.
- Memoria virtual unificada (CUDA 4.0 y superior)
- Memoria unificada (CUDA 6.0 y superior)
- Memoria compartida : CUDA expone una región de memoria compartida rápida que se puede compartir entre subprocesos. Esto se puede usar como una caché administrada por el usuario, lo que permite un ancho de banda mayor que el que es posible mediante búsquedas de texturas. [20]
- Descargas y lecturas más rápidas desde y hacia la GPU
- Soporte completo para operaciones enteras y bit a bit, incluidas búsquedas de texturas enteras
- En las tarjetas de las series RTX 20 y 30, los núcleos CUDA se utilizan para una función llamada "RTX IO", que es donde los núcleos CUDA reducen drásticamente los tiempos de carga del juego.
Limitaciones [ editar ]
- Ya sea para la computadora host o el dispositivo GPU, todo el código fuente CUDA ahora se procesa de acuerdo con las reglas de sintaxis de C ++. [21] Este no fue siempre el caso. Las versiones anteriores de CUDA se basaban en reglas de sintaxis C. [22] Al igual que en el caso más general de compilar código C con un compilador C ++, es posible que el código fuente CUDA antiguo de estilo C no se compile o no se comporte como se pretendía originalmente.
- La interoperabilidad con lenguajes de renderizado como OpenGL es unidireccional, con OpenGL teniendo acceso a la memoria CUDA registrada pero CUDA sin acceso a la memoria OpenGL.
- La copia entre la memoria del host y del dispositivo puede sufrir un impacto en el rendimiento debido al ancho de banda y la latencia del bus del sistema (esto se puede aliviar en parte con transferencias de memoria asíncronas, manejadas por el motor DMA de la GPU).
- Los subprocesos deben ejecutarse en grupos de al menos 32 para obtener el mejor rendimiento, con un número total de subprocesos de miles. Las ramificaciones en el código del programa no afectan el rendimiento de manera significativa, siempre que cada uno de los 32 subprocesos tome la misma ruta de ejecución; el modelo de ejecución SIMD se convierte en una limitación significativa para cualquier tarea intrínsecamente divergente (por ejemplo, atravesar una estructura de datos de partición de espacio durante el trazado de rayos ).
- No hay ninguna funcionalidad de emulador o de respaldo disponible para las revisiones modernas.
- C ++ válido a veces puede marcarse y evitar la compilación debido a la forma en que el compilador se acerca a la optimización para las limitaciones del dispositivo GPU de destino. [ cita requerida ]
- La información de tipo de tiempo de ejecución de C ++ (RTTI) y el manejo de excepciones de estilo C ++ solo se admiten en el código de host, no en el código de dispositivo.
- En dispositivos de precisión simple en dispositivos 1.x con capacidad de cómputo CUDA de primera generación, los números desnormales no son compatibles y, en cambio, se vacían a cero, y la precisión de las operaciones de división y raíz cuadrada es ligeramente menor que la matemática de precisión simple que cumple con IEEE 754. Los dispositivos que admiten la capacidad informática 2.0 y superior admiten números desnormales, y las operaciones de división y raíz cuadrada son compatibles con IEEE 754 de forma predeterminada. Sin embargo, los usuarios pueden obtener las matemáticas anteriores de grado de juego más rápidas de los dispositivos de capacidad de cómputo 1.x si lo desean configurando indicadores del compilador para deshabilitar divisiones precisas y raíces cuadradas precisas, y habilitar el vaciado de números desnormales a cero. [23]
- A diferencia de OpenCL , las GPU habilitadas para CUDA solo están disponibles en Nvidia. [24] Los intentos de implementar CUDA en otras GPU incluyen:
- Project Coriander: convierte el código fuente CUDA C ++ 11 en OpenCL 1.2 C.Una bifurcación de CUDA-on-CL destinada a ejecutar TensorFlow . [25] [26] [27]
- CU2CL: Convierta CUDA 3.2 C ++ a OpenCL C. [28]
- GPUOpen HIP: una fina capa de abstracción sobre CUDA y ROCm destinada a las GPU AMD y Nvidia. Tiene una herramienta de conversión para importar fuente CUDA C ++. Soporta CUDA 4.0 más C ++ 11 y float16.
GPU compatibles [ editar ]
Nivel CUDA compatible de GPU y tarjeta. Véase también en Nvidia :
- Compatibilidad con CUDA SDK 1.0 para capacidad de cómputo 1.0 - 1.1 (Tesla) [29]
- Compatibilidad con CUDA SDK 1.1 para capacidad de cómputo 1.0 - 1.1 + x (Tesla)
- Compatibilidad con CUDA SDK 2.0 para capacidad de cómputo 1.0 - 1.1 + x (Tesla)
- Compatibilidad con CUDA SDK 2.1 - 2.3.1 para la capacidad de cómputo 1.0 - 1.3 (Tesla) [30] [31] [32] [33]
- Compatibilidad con CUDA SDK 3.0 - 3.1 para capacidad de cómputo 1.0 - 2.0 (Tesla, Fermi) [34] [35]
- Compatibilidad con CUDA SDK 3.2 para capacidad informática 1.0 - 2.1 (Tesla, Fermi) [36]
- Compatibilidad con CUDA SDK 4.0 - 4.2 para capacidad de cómputo 1.0 - 2.1 + x (Tesla, Fermi, ¿más?).
- Compatibilidad con CUDA SDK 5.0 - 5.5 para capacidad de cómputo 1.0 - 3.5 (Tesla, Fermi, Kepler).
- Compatibilidad con CUDA SDK 6.0 para capacidad de cómputo 1.0 - 3.5 (Tesla, Fermi, Kepler).
- Compatibilidad con CUDA SDK 6.5 para capacidad de cómputo 1.1 - 5.x (Tesla, Fermi, Kepler, Maxwell). Última versión con soporte para capacidad informática 1.x (Tesla).
- Compatibilidad con CUDA SDK 7.0 - 7.5 para capacidad de cómputo 2.0 - 5.x (Fermi, Kepler, Maxwell).
- Compatibilidad con CUDA SDK 8.0 para capacidad informática 2.0 - 6.x (Fermi, Kepler, Maxwell, Pascal). Última versión compatible con capacidad informática 2.x (Fermi) (Pascal GTX 1070Ti no compatible).
- Compatibilidad con CUDA SDK 9.0 - 9.2 para capacidad de cómputo 3.0 - 7.2 (Kepler, Maxwell, Pascal, Volta) (Pascal GTX 1070Ti no compatible. CUDA SDK 9.0 y compatible con CUDA SDK 9.2).
- Compatibilidad con CUDA SDK 10.0 - 10.2 para capacidad informática 3.0 - 7.5 (Kepler, Maxwell, Pascal, Volta, Turing). Última versión con soporte para capacidad informática 3.x (Kepler). 10.2 es la última versión oficial para macOS, ya que la compatibilidad no estará disponible para macOS en las versiones más recientes.
- Compatibilidad con CUDA SDK 11.0 para capacidad de cálculo 3.5 - 8.0 (Kepler (en parte), Maxwell, Pascal, Volta, Turing, Ampere (en parte)). [37] Nuevos tipos de datos: Bfloat16 y TF32 en núcleos tensores de tercera generación. [38]
- Compatibilidad con CUDA SDK 11.1 - 11.3 para capacidad de cálculo 3.5 - 8.6 (Kepler (en parte), Maxwell, Pascal, Volta, Turing, Ampere). [39]
Capacidad de cálculo (versión) | micro arquitectura | GPU | GeForce | Quadro, NVS | GPU Tesla / centro de datos | Tegra, Jetson, DRIVE |
---|---|---|---|---|---|---|
1.0 | Tesla | G80 | GeForce 8800 Ultra, GeForce 8800 GTX, GeForce 8800 GTS (G80) | Quadro FX 5600, Quadro FX 4600, Quadro Plex 2100 S4 | Tesla C870, Tesla D870, Tesla S870 | |
1.1 | G92, G94, G96, G98, G84, G86 | GeForce GTS 250, GeForce 9800 GX2, GeForce 9800 GTX, GeForce 9800 GT, GeForce 8800 GTS (G92), GeForce 8800 GT, GeForce 9600 GT, GeForce 9500 GT, GeForce 9400 GT, GeForce 8600 GTS, GeForce 8600 GT, GeForce 8500 GT , GeForce G110M , GeForce 9300M GS, GeForce 9200M GS, GeForce 9100M G, GeForce 8400M GT, GeForce G105M | Quadro FX 4700 X2, Quadro FX 3700, Quadro FX 1800, Quadro FX 1700, Quadro FX 580, Quadro FX 570, Quadro FX 470, Quadro FX 380, Quadro FX 370, Quadro FX 370 de perfil bajo, Quadro NVS 450, Quadro NVS 420 , Quadro NVS 290, Quadro NVS 295, Quadro Plex 2100 D4, Quadro FX 3800M, Quadro FX 3700M, Quadro FX 3600M, Quadro FX 2800M, Quadro FX 2700M, Quadro FX 1700M, Quadro FX 1600M, Quadro FX 770M, Quadro FX 570M, Quadro FX 370M, Quadro FX 360M, Quadro NVS 320M, Quadro NVS 160M, Quadro NVS 150M, Quadro NVS 140M, Quadro NVS 135M, Quadro NVS 130M, Quadro NVS 450, Quadro NVS 420, [40] Quadro NVS 295 | |||
1.2 | GT218, GT216 y GT215 | GeForce GT 340 *, GeForce GT 330 *, GeForce GT 320 *, GeForce 315 *, GeForce 310 *, GeForce GT 240, GeForce GT 220, GeForce 210, GeForce GTS 360M, GeForce GTS 350M, GeForce GT 335M, GeForce GT 330M, GeForce GT 325M, GeForce GT 240M, GeForce G210M, GeForce 310M, GeForce 305M | Quadro FX 380 de perfil bajo, Quadro FX 1800M, Quadro FX 880M, Quadro FX 380M, Nvidia NVS 300, NVS 5100M, NVS 3100M, NVS 2100M, ION | |||
1.3 | GT200, GT200b | GeForce GTX 295, GTX 285, GTX 280, GeForce GTX 275, GeForce GTX 260 | Quadro FX 5800, Quadro FX 4800, Quadro FX 4800 para Mac, Quadro FX 3800, Quadro CX, Quadro Plex 2200 D2 | Tesla C1060, Tesla S1070, Tesla M1060 | ||
2.0 | Fermi | GF100, GF110 | GeForce GTX 590, GeForce GTX 580, GeForce GTX 570, GeForce GTX 480, GeForce GTX 470, GeForce GTX 465, GeForce GTX 480M | Quadro 6000, Quadro 5000, Quadro 4000, Quadro 4000 para Mac, Quadro Plex 7000, Quadro 5010M, Quadro 5000M | Tesla C2075, Tesla C2050 / C2070, Tesla M2050 / M2070 / M2075 / M2090 | |
2.1 | GF104, GF106 GF108, GF114, GF116, GF117, GF119 | GeForce GTX 560 Ti, GeForce GTX 550 Ti, GeForce GTX 460, GeForce GTS 450, GeForce GTS 450 *, GeForce GT 640 (GDDR3), GeForce GT 630, GeForce GT 620, GeForce GT 610, GeForce GT 520, GeForce GT 440, GeForce GT 440 *, GeForce GT 430, GeForce GT 430 *, GeForce GT 420 *, GeForce GTX 675M, GeForce GTX 670M, GeForce GT 635M, GeForce GT 630M, GeForce GT 625M, GeForce GT 720M, GeForce GT 620M, GeForce 710M, GeForce 610M, GeForce 820M, GeForce GTX 580M, GeForce GTX 570M, GeForce GTX 560M, GeForce GT 555M, GeForce GT 550M, GeForce GT 540M, GeForce GT 525M, GeForce GT 520MX, GeForce GT 520M, GeForceForce GTX 485M, GeForce GT 520M, GeForceForce 485M GeForce GTX 460M, GeForce GT 445M, GeForce GT 435M, GeForce GT 420M, GeForce GT 415M, GeForce 710M, GeForce 410M | Quadro 2000, Quadro 2000D, Quadro 600, Quadro 4000M, Quadro 3000M, Quadro 2000M, Quadro 1000M, NVS 310, NVS 315, NVS 5400M, NVS 5200M, NVS 4200M | |||
3,0 | Kepler | GK104, GK106, GK107 | GeForce GTX 770, GeForce GTX 760, GeForce GT 740, GeForce GTX 690, GeForce GTX 680, GeForce GTX 670, GeForce GTX 660 Ti, GeForce GTX 660, GeForce GTX 650 Ti BOOST, GeForce GTX 650 Ti, GeForce GTX 650, GeForce GTX 880M, GeForce GTX 870M, GeForce GTX 780M, GeForce GTX 770M, GeForce GTX 765M, GeForce GTX 760M, GeForce GTX 680MX, GeForce GTX 680M, GeForce GTX 675MX, GeForce GTX 670MX, GeForce GeForce GeX 650, GeForce GT 745M, GeForce GT 645M, GeForce GT 740M, GeForce GT 730M, GeForce GT 640M, GeForce GT 640M LE, GeForce GT 735M, GeForce GT 730M | Quadro K5000, Quadro K4200, Quadro K4000, Quadro K2000, Quadro K2000D, Quadro K600, Quadro K420, Quadro K500M, Quadro K510M, Quadro K610M, Quadro K1000M, Quadro K2000M, Quadro K1100M, Quadro K2100M, Quadro K3000M, Quadro K3000M, Quadro K3000M , Quadro K5000M, Quadro K4100M, Quadro K5100M, NVS 510, Quadro 410 | Tesla K10, GRID K340, GRID K520, GRID K2 | |
3.2 | GK20A | Tegra K1, Jetson TK1 | ||||
3,5 | GK110, GK208 | GeForce GTX Titan Z, GeForce GTX Titan Black, GeForce GTX Titan, GeForce GTX 780 Ti, GeForce GTX 780, GeForce GT 640 (GDDR5), GeForce GT 630 v2, GeForce GT 730, GeForce GT 720, GeForce GT 710, GeForce GT 740M (64 bits, DDR3), GeForce GT 920M | Quadro K6000, Quadro K5200 | Tesla K40, Tesla K20x, Tesla K20 | ||
3,7 | GK210 | Tesla K80 | ||||
5,0 | Maxwell | GM107, GM108 | GeForce GTX 750 Ti, GeForce GTX 750, GeForce GTX 960M, GeForce GTX 950M, GeForce 940M, GeForce 930M, GeForce GTX 860M, GeForce GTX 850M, GeForce 845M, GeForce 840M, GeForce 830M | Quadro K1200, Quadro K2200, Quadro K620, Quadro M2000M, Quadro M1000M, Quadro M600M, Quadro K620M, NVS 810 | Tesla M10 | |
5.2 | GM200, GM204, GM206 | GeForce GTX Titan X, GeForce GTX 980 Ti, GeForce GTX 980, GeForce GTX 970, GeForce GTX 960, GeForce GTX 950, GeForce GTX 750 SE, GeForce GTX 980M, GeForce GTX 970M, GeForce GTX 965M | Quadro M6000 24GB, Quadro M6000, Quadro M5000, Quadro M4000, Quadro M2000, Quadro M5500, Quadro M5000M, Quadro M4000M, Quadro M3000M | Tesla M4, Tesla M40, Tesla M6, Tesla M60 | ||
5.3 | GM20B | Tegra X1, Jetson TX1, Jetson Nano, DRIVE CX, DRIVE PX | ||||
6.0 | Pascal | GP100 | Quadro GP100 | Tesla P100 | ||
6.1 | GP102, GP104, GP106, GP107, GP108 | Nvidia TITAN Xp, Titan X, GeForce GTX 1080 Ti, GTX 1080, GTX 1070 Ti, GTX 1070, GTX 1060, GTX 1050 Ti, GTX 1050, GT 1030, GT 1010, MX350, MX330, MX250, MX230, MX150, MX130, MX110 | Quadro P6000, Quadro P5000, Quadro P4000, Quadro P2200, Quadro P2000, Quadro P1000, Quadro P400, Quadro P500, Quadro P520, Quadro P600, Quadro P5000 (móvil), Quadro P4000 (móvil), Quadro P3000 (móvil) | Tesla P40, Tesla P6, Tesla P4 | ||
6.2 | GP10B [41] | Tegra X2, Jetson TX2, DRIVE PX 2 | ||||
7.0 | Volta | GV100 | NVIDIA TITAN V | Quadro GV100 | Tesla V100, Tesla V100S | |
7.2 | GV10B [42] | Tegra Xavier, Jetson Xavier NX, Jetson AGX Xavier, DRIVE AGX Xavier, DRIVE AGX Pegasus | ||||
7.5 | Turing | TU102, TU104, TU106, TU116, TU117 | NVIDIA TITAN RTX, GeForce RTX 2080 Ti, RTX 2080 Super, RTX 2080, RTX 2070 Super, RTX 2070, RTX 2060 Super, RTX 2060, GeForce GTX 1660 Ti, GTX 1660 Super, GTX 1660, GTX 1650 Super, GTX 1650, MX450 | Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Quadro RTX 4000, T1000, T600, T400 T1200 (móvil), T600 (móvil), T500 (móvil), Quadro T2000 (móvil), Quadro T1000 (móvil) | Tesla T4 | |
8.0 | Amperio | GA100 | A100 de 80 GB, A100 de 40 GB, A30 | |||
8,6 | GA102, GA104, GA106, GA107 | GeForce RTX 3090, RTX 3080 Ti, RTX 3080, RTX 3070, RTX 3060 Ti, RTX 3060, RTX 3050 Ti, RTX 3050 | RTX A6000, RTX A5000, RTX A4000 RTX A5000 (móvil), RTX A4000 (móvil), RTX A3000 (móvil), RTX A2000 (móvil) | A40, A16, A10, A4 | ||
9.0 | Tolva | tbd | ||||
? | Lovelace | tbd | tbd | tbd |
'*' - Productos solo OEM
Características y especificaciones de la versión [ editar ]
Compatibilidad con funciones (las funciones no enumeradas son compatibles con todas las capacidades informáticas) | Capacidad de cálculo (versión) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.x | 3,0 | 3.2 | 3,5, 3,7, 5,0, 5,2 | 5.3 | 6.x | 7.x | 8.0 | 8,6 | ||
Funciones atómicas enteras que operan en palabras de 32 bits en la memoria global | No | sí | ||||||||||||
atomicExch () operando en valores de coma flotante de 32 bits en la memoria global | ||||||||||||||
Funciones atómicas enteras que operan en palabras de 32 bits en memoria compartida | No | sí | ||||||||||||
atomicExch () operando en valores de coma flotante de 32 bits en la memoria compartida | ||||||||||||||
Funciones atómicas enteras que operan en palabras de 64 bits en la memoria global | ||||||||||||||
Funciones de voto warp | ||||||||||||||
Operaciones de coma flotante de doble precisión | No | sí | ||||||||||||
Funciones atómicas que operan en valores enteros de 64 bits en la memoria compartida | No | sí | ||||||||||||
Suma atómica de punto flotante que opera en palabras de 32 bits en la memoria global y compartida | ||||||||||||||
_votación() | ||||||||||||||
_threadfence_system () | ||||||||||||||
_syncthreads_count (), _syncthreads_and (), _syncthreads_or () | ||||||||||||||
Funciones de superficie | ||||||||||||||
Cuadrícula 3D de bloque de hilo | ||||||||||||||
Funciones de warp shuffle, memoria unificada | No | sí | ||||||||||||
Cambio de embudo | No | sí | ||||||||||||
Paralelismo dinámico | No | sí | ||||||||||||
Operaciones de coma flotante de media precisión: suma, resta, multiplicación, comparación, funciones warp shuffle, conversión | No | sí | ||||||||||||
Adición atómica que opera en valores de punto flotante de 64 bits en la memoria global y la memoria compartida | No | sí | ||||||||||||
Núcleo tensor | No | sí | ||||||||||||
Funciones de matriz de deformación de precisión mixtas | No | sí | ||||||||||||
Copia asíncrona acelerada por hardware | No | sí | ||||||||||||
Barrera de llegada / espera dividida acelerada por hardware | No | sí | ||||||||||||
Gestión de residencia de caché L2 | No | sí |
[43]
Tipo de datos | Operación | Soportado desde | Soportado desde entonces para la memoria global | Soportado desde para memoria compartida |
---|---|---|---|---|
Entero de 16 bits | operaciones generales | |||
Entero de 32 bits | funciones atómicas | 1.1 | 1.2 | |
Entero de 64 bits | funciones atómicas | 1.2 | 2.0 | |
Punto flotante de 16 bits | suma, resta, multiplicación, comparación, funciones warp shuffle, conversión | 5.3 | ||
Punto flotante de 32 bits | atomicExch () | 1.1 | 1.2 | |
Punto flotante de 32 bits | adición atómica | 2.0 | 2.0 | |
Punto flotante de 64 bits | operaciones generales | 1.3 | ||
Punto flotante de 64 bits | adición atómica | 6.0 | 6.0 | |
núcleo tensor | 7.0 |
Nota: Las líneas que faltan o las entradas vacías reflejan cierta falta de información sobre ese elemento exacto.
[44]
Especificaciones técnicas | Capacidad de cálculo (versión) | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.x | 3,0 | 3.2 | 3,5 | 3,7 | 5,0 | 5.2 | 5.3 | 6.0 | 6.1 | 6.2 | 7.0 | 7.2 | 7.5 | 8.0 | 8,6 | |
Número máximo de grids residentes por dispositivo (ejecución concurrente del kernel) | tbd | dieciséis | 4 | 32 | dieciséis | 128 | 32 | dieciséis | 128 | dieciséis | 128 | |||||||||
Máxima dimensionalidad de la rejilla de los bloques de rosca. | 2 | 3 | ||||||||||||||||||
Dimensión x máxima de una cuadrícula de bloques de rosca | 65535 | 2 31 - 1 | ||||||||||||||||||
Dimensión máxima y o z de una cuadrícula de bloques de rosca | 65535 | |||||||||||||||||||
Máxima dimensionalidad del bloque de rosca | 3 | |||||||||||||||||||
Dimensión x o y máxima de un bloque | 512 | 1024 | ||||||||||||||||||
Dimensión z máxima de un bloque | 64 | |||||||||||||||||||
Número máximo de subprocesos por bloque | 512 | 1024 | ||||||||||||||||||
Tamaño de urdimbre | 32 | |||||||||||||||||||
Número máximo de bloques residentes por multiprocesador | 8 | dieciséis | 32 | dieciséis | 32 | dieciséis | ||||||||||||||
Número máximo de deformaciones residentes por multiprocesador | 24 | 32 | 48 | 64 | 32 | 64 | 48 | |||||||||||||
Número máximo de subprocesos residentes por multiprocesador | 768 | 1024 | 1536 | 2048 | 1024 | 2048 | 1536 | |||||||||||||
Número de registros de 32 bits por multiprocesador | 8 K | 16 K | 32 K | 64 K | 128 K | 64 K | ||||||||||||||
Número máximo de registros de 32 bits por bloque de hilo | N / A | 32 K | 64 K | 32 K | 64 K | 32 K | 64 K | 32 K | 64 K | |||||||||||
Número máximo de registros de 32 bits por hilo | 124 | 63 | 255 | |||||||||||||||||
Cantidad máxima de memoria compartida por multiprocesador | 16 KB | 48 KB | 112 KB | 64 KB | 96 KB | 64 KB | 96 KB | 64 KB | 96 KB (de 128) | 64 KB (de 96) | 164 KB (de 192) | 100 KB (de 128) | ||||||||
Cantidad máxima de memoria compartida por bloque de hilo | 48 KB | 96 KB | 48 KB | 64 KB | 163 KB | 99 KB | ||||||||||||||
Número de bancos de memoria compartida | dieciséis | 32 | ||||||||||||||||||
Cantidad de memoria local por hilo | 16 KB | 512 KB | ||||||||||||||||||
Tamaño de memoria constante | 64 KB | |||||||||||||||||||
Conjunto de trabajo de caché por multiprocesador para memoria constante | 8 KB | 4 KB | 8 KB | |||||||||||||||||
Conjunto de trabajo de caché por multiprocesador para memoria de texturas | 6 - 8 KB | 12 KB | 12 - 48 KB | 24 KB | 48 KB | N / A | 24 KB | 48 KB | 24 KB | 32 - 128 KB | 32 - 64 KB | 28 - 192 KB | 28 - 128 KB | |||||||
Ancho máximo para la referencia de textura 1D vinculada a una matriz CUDA | 8192 | 65536 | 131072 | |||||||||||||||||
Ancho máximo para la referencia de textura 1D vinculada a la memoria lineal | 2 27 | 2 28 | 2 27 | 2 28 | 2 27 | 2 28 | ||||||||||||||
Ancho máximo y número de capas para una referencia de textura en capas 1D | 8192 × 512 | 16384 × 2048 | 32768 x 2048 | |||||||||||||||||
Anchura y altura máximas para la referencia de textura 2D vinculada a una matriz CUDA | 65536 × 32768 | 65536 × 65535 | 131072 x 65536 | |||||||||||||||||
Anchura y altura máximas para la referencia de textura 2D vinculada a una memoria lineal | 65000 x 65000 | 65536 x 65536 | 131072 x 65000 | |||||||||||||||||
Anchura y altura máximas para la referencia de textura 2D vinculada a una matriz CUDA que admite la recopilación de textura | N / A | 16384 x 16384 | 32768 x 32768 | |||||||||||||||||
Ancho, alto y número máximo de capas para una referencia de textura en capas 2D | 8192 × 8192 × 512 | 16384 × 16384 × 2048 | 32768 x 32768 x 2048 | |||||||||||||||||
Anchura, altura y profundidad máximas para una referencia de textura 3D vinculada a una memoria lineal o una matriz CUDA | 2048 3 | 4096 3 | 16384 3 | |||||||||||||||||
Ancho (y alto) máximo para una referencia de textura de mapa de cubos | N / A | 16384 | 32768 | |||||||||||||||||
Anchura máxima (y altura) y número de capas para una referencia de textura en capas de mapa de cubos | N / A | 16384 × 2046 | 32768 × 2046 | |||||||||||||||||
Número máximo de texturas que se pueden unir a un kernel | 128 | 256 | ||||||||||||||||||
Ancho máximo para una referencia de superficie 1D unida a una matriz CUDA | No soportado | 65536 | 16384 | 32768 | ||||||||||||||||
Anchura máxima y número de capas para una referencia de superficie en capas 1D | 65536 × 2048 | 16384 × 2048 | 32768 × 2048 | |||||||||||||||||
Anchura y altura máximas para una referencia de superficie 2D vinculada a una matriz CUDA | 65536 × 32768 | 16384 × 65536 | 131072 × 65536 | |||||||||||||||||
Anchura, altura y número máximos de capas para una referencia de superficie en capas 2D | 65536 × 32768 × 2048 | 16384 × 16384 × 2048 | 32768 × 32768 × 2048 | |||||||||||||||||
Anchura, altura y profundidad máximas para una referencia de superficie 3D vinculada a una matriz CUDA | 65536 × 32768 × 2048 | 4096 × 4096 × 4096 | 16384 × 16384 × 16384 | |||||||||||||||||
Anchura máxima (y altura) para una referencia de superficie de mapa de cubos vinculada a una matriz CUDA | 32768 | 16384 | 32768 | |||||||||||||||||
Anchura máxima y número de capas para una referencia de superficie en capas de mapa de cubos | 32768 × 2046 | 16384 × 2046 | 32768 × 2046 | |||||||||||||||||
Número máximo de superficies que se pueden unir a un kernel | 8 | dieciséis | 32 | |||||||||||||||||
Número máximo de instrucciones por kernel | 2 millones | 512 millones |
[45]
Especificaciones de arquitectura | Capacidad de cálculo (versión) | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1.0 | 1.1 | 1.2 | 1.3 | 2.0 | 2.1 | 3,0 | 3,5 | 3,7 | 5,0 | 5.2 | 6.0 | 6.1, 6.2 | 7.0, 7.2 | 7.5 | 8.0 | 8,6 | |
Número de carriles ALU para operaciones aritméticas de punto flotante de precisión única y entera | 8 [46] | 32 | 48 | 192 | 128 | 64 | 128 | 64 | |||||||||
Número de unidades de función especial para funciones trascendentales de coma flotante de precisión simple | 2 | 4 | 8 | 32 | dieciséis | 32 | dieciséis | ||||||||||
Número de unidades de filtrado de textura para cada unidad de dirección de textura o unidad de salida de renderizado (ROP) | 2 | 4 | 8 | dieciséis | 8 [47] | ||||||||||||
Número de programadores warp | 1 | 2 | 4 | 2 | 4 | ||||||||||||
Número máximo de instrucciones emitidas a la vez por un solo programador | 1 | 2 [48] | 1 | ||||||||||||||
Número de núcleos tensores | N / A | 8 [47] | 4 | ||||||||||||||
Tamaño en KB de memoria unificada para caché de datos y memoria compartida por multiprocesador | tbd | 128 | 96 [49] | 192 | 128 |
[50]
Para obtener más información, consulte el artículo: "Tabla comparativa de capacidad de cómputo de NVIDIA CUDA"y lea la guía de programación de Nvidia CUDA. [51]
Ejemplo [ editar ]
Este código de ejemplo en C ++ carga una textura de una imagen en una matriz en la GPU:
textura < float , 2 , cudaReadModeElementType > tex ;void foo () { cudaArray * cu_array ; // Asignar matriz cudaChannelFormatDesc description = cudaCreateChannelDesc < float > (); cudaMallocArray ( & cu_array , & descripción , ancho , alto ); // Copiar datos de imagen a la matriz cudaMemcpyToArray ( cu_array , image , width * height * sizeof ( float ), cudaMemcpyHostToDevice ); // Establecer parámetros de textura (por defecto) tex . addressMode [ 0 ] = cudaAddressModeClamp ; tex . addressMode [ 1 ] = cudaAddressModeClamp ; tex . filterMode = cudaFilterModePoint ; tex . normalizado = falso ; // no normalizar coordenadas // Vincula la matriz a la textura cudaBindTextureToArray ( tex , cu_array ); // Ejecuta kernel dim3 blockDim ( 16 , 16 , 1 ); dim3 gridDim (( ancho + blockDim . x - 1 ) / blockDim . x , ( altura + blockDim . y - 1 ) / blockDim . y , 1 ); kernel <<< gridDim , blockDim , 0 >>> ( d_data , alto , ancho ); // Desvincula la matriz de la textura cudaUnbindTexture ( tex ); } // fin foo ()__global__ void kernel ( float * odata , int altura , int ancho ) { unsigned int x = blockIdx . x * blockDim . x + threadIdx . x ; unsigned int y = blockIdx . y * blockDim . y + threadIdx . y ; si ( x < ancho && y < altura ) { float c = tex2D ( tex , x , y ); odata [ y * ancho + x ] = c ; } }
A continuación se muestra un ejemplo en Python que calcula el producto de dos matrices en la GPU. Los enlaces no oficiales del lenguaje Python se pueden obtener de PyCUDA . [52]
importar pycuda.compiler como comp importar pycuda.driver como drv importar numpy importar pycuda.autoinitmod = comp . SourceModule ( "" " __global__ void multiply_them (float * dest, float * a, float * b) { const int i = threadIdx.x; dest [i] = a [i] * b [i]; } " "" )multiplicarlos = mod . get_function ( "multiplicarlos" )a = numpy . al azar . randn ( 400 ) . astype ( numpy . float32 ) b = numpy . al azar . randn ( 400 ) . astype ( numpy . float32 )dest = numpy . ceros_como ( a ) multiplicarlos ( drv . Out ( dest ), drv . In ( a ), drv . In ( b ), block = ( 400 , 1 , 1 ))imprimir ( dest - a * b )
Se pueden encontrar enlaces de Python adicionales para simplificar las operaciones de multiplicación de matrices en el programa pycublas . [53]
importar numpy de pycublas importar CUBLASMatrixA = CUBLASMatrix ( numpy . Mat ([[ 1 , 2 , 3 ], [ 4 , 5 , 6 ]], numpy . Float32 )) B = CUBLASMatrix ( numpy . Mat ([[ 2 , 3 ], [ 4 , 5 ], [ 6 , 7 ]], numpy . Float32 )) C = A * Bimprimir ( C . np_mat ())
mientras que CuPy reemplaza directamente a NumPy: [54]
Importar cupya = cupy . al azar . randn ( 400 ) b = cupy . al azar . randn ( 400 )dest = cupy . ceros_como ( a )imprimir ( dest - a * b )
Usos actuales y futuros de la arquitectura CUDA [ editar ]
- Representación acelerada de gráficos 3D
- Interconversión acelerada de formatos de archivos de video
- Cifrado , descifrado y compresión acelerados
- Bioinformática , por ejemplo, secuenciación de ADN NGS BarraCUDA [55]
- Cálculos distribuidos, como predecir la conformación nativa de proteínas
- Simulaciones de análisis médicos, por ejemplo, realidad virtual basada en imágenes de tomografía computarizada y resonancia magnética
- Simulaciones físicas, [56] en particular en dinámica de fluidos
- Entrenamiento de redes neuronales en problemas de aprendizaje automático
- Reconocimiento facial
- Computación distribuída
- Dinámica molecular
- Minería de criptomonedas
- BOINC SETI @ hogar
- Software de estructura a partir de movimiento (SfM)
Ver también [ editar ]
- OpenCL : un estándar abierto de Khronos Group para programar una variedad de plataformas, incluidas las GPU, similar a la API del controlador CUDA de nivel inferior ( no de fuente única )
- SYCL : un estándar abierto de Khronos Group para programar una variedad de plataformas, incluidas las GPU, con C ++ moderno de fuente única , similar a la API de tiempo de ejecución CUDA de nivel superior ( fuente única )
- BrookGPU : el compilador del grupo de gráficos de la Universidad de Stanford
- CADERA
- Programación de matrices
- Computación paralela
- Procesamiento de flujo
- rCUDA : una API para computación en computadoras remotas
- Modelado molecular en GPU
- Vulkan : API informática y de gráficos 3D de bajo nivel y alto rendimiento
- OptiX : API de trazado de rayos de NVIDIA
Referencias [ editar ]
- ^ "Página de inicio de Nvidia CUDA" .
- ↑ a b Abi-Chahla, Fedy (18 de junio de 2008). "CUDA de Nvidia: ¿El fin de la CPU?" . Hardware de Tom . Consultado el 17 de mayo de 2015 .
- ↑ Zunitch, Peter (24 de enero de 2018). "CUDA frente a OpenCL frente a OpenGL" . Videomaker . Consultado el 16 de septiembre de 2018 .
- ^ "OpenCL" . Desarrollador NVIDIA . 2013-04-24 . Consultado el 4 de noviembre de 2019 .
- ^ Shimpi, Anand Lal; Wilson, Derek (8 de noviembre de 2006). "GeForce 8800 (G80) de Nvidia: GPU rediseñadas para DirectX 10" . AnandTech . Consultado el 16 de mayo de 2015 .
- ^ "Compilador CUDA LLVM" .
- ^ Primera demostración de OpenCL en una GPU en YouTube
- ^ Demostración de DirectCompute Ocean que se ejecuta en una GPU habilitada para Nvidia CUDA en YouTube
- ^ Vasiliadis, Giorgos; Antonatos, Spiros; Polychronakis, Michalis; Markatos, Evangelos P .; Ioannidis, Sotiris (septiembre de 2008). "Gnort: detección de intrusiones en la red de alto rendimiento mediante procesadores gráficos" (PDF) . Actas del XI Simposio Internacional sobre Avances Recientes en Detección de Intrusiones (RAID) .
- ^ Schatz, Michael C .; Trapnell, Cole; Delcher, Arthur L .; Varshney, Amitabh (2007). "Alineación de secuencias de alto rendimiento utilizando unidades de procesamiento de gráficos" . BMC Bioinformática . 8 : 474. doi : 10.1186 / 1471-2105-8-474 . PMC 2222658 . PMID 18070356 .
- ^ "Pyrit - Código de Google" .
- ^ "Utilice su GPU Nvidia para la informática científica" . BOINC. 2008-12-18. Archivado desde el original el 28 de diciembre de 2008 . Consultado el 8 de agosto de 2017 .
- ^ "Kit de desarrollo de software Nvidia CUDA (CUDA SDK) - Notas de la versión versión 2.0 para MAC OS X" . Archivado desde el original el 6 de enero de 2009.
- ^ "CUDA 1.1 - Ahora en Mac OS X" . 14 de febrero de 2008. Archivado desde el original el 22 de noviembre de 2008.
- ^ https://developer.nvidia.com/blog/cuda-11-features-revealed/
- ^ https://developer.nvidia.com/blog/cuda-11-1-introduces-support-rtx-30-series/
- ^ https://developer.nvidia.com/blog/enhancing-memory-allocation-with-new-cuda-11-2-features/
- ^ https://developer.nvidia.com/blog/exploring-the-new-features-of-cuda-11-3/
- ^ Silberstein, Mark; Schuster, Assaf ; Geiger, Dan; Patney, Anjul; Owens, John D. (2008). Cálculo eficiente de productos de suma en GPU a través de caché administrada por software (PDF) . Actas de la 22ª conferencia internacional anual sobre supercomputación - ICS '08. págs. 309–318. doi : 10.1145 / 1375527.1375572 . ISBN 978-1-60558-158-3.
- ^ "Guía de programación CUDA C v8.0" (PDF) . Zona de desarrolladores de nVidia . Sección 3.1.5. Enero de 2017. p. 19 . Consultado el 22 de marzo de 2017 . CS1 maint: location (link)
- ^ "NVCC fuerza la compilación en c ++ de archivos .cu" .
- ^ Whitehead, Nathan; Fit-Florea, Alex. "Precisión y rendimiento: punto flotante y cumplimiento de IEEE 754 para GPU de Nvidia" (PDF) . Nvidia . Consultado el 18 de noviembre de 2014 .
- ^ "Productos habilitados para CUDA" . Zona CUDA . Nvidia Corporation . Consultado el 3 de noviembre de 2008 .
- ^ "Proyecto de cilantro: compilar códigos CUDA para OpenCL, ejecutar en todas partes" . Phoronix.
- ^ Perkins, Hugh (2017). "cuda-on-cl" (PDF) . IWOCL . Consultado el 8 de agosto de 2017 .
- ^ "hughperkins / coriander: compile el código NVIDIA® CUDA ™ para dispositivos OpenCL ™ 1.2" . GitHub. 6 de mayo de 2019.
- ^ "Documentación de CU2CL" . chrec.cs.vt.edu .
- ^ "Guía de programación de NVIDIA CUDA. Versión 1.0" (PDF) . 23 de junio de 2007.
- ^ "Guía de programación de NVIDIA CUDA. Versión 2.1" (PDF) . 8 de diciembre de 2008.
- ^ "Guía de programación de NVIDIA CUDA. Versión 2.2" (PDF) . 2 de abril de 2009.
- ^ "Guía de programación de NVIDIA CUDA. Versión 2.2.1" (PDF) . 26 de mayo de 2009.
- ^ "Guía de programación de NVIDIA CUDA. Versión 2.3.1" (PDF) . 26 de agosto de 2009.
- ^ "Guía de programación de NVIDIA CUDA. Versión 3.0" (PDF) . 20 de febrero de 2010.
- ^ "Guía de programación de NVIDIA CUDA C. Versión 3.1.1" (PDF) . 21 de julio de 2010.
- ^ "Guía de programación de NVIDIA CUDA C. Versión 3.2" (PDF) . 9 de noviembre de 2010.
- ^ "Notas de la versión CUDA 11.0" . Desarrollador NVIDIA .
- ^ "Características de CUDA 11 reveladas" . Blog para desarrolladores de NVIDIA . 2020-05-14 . Consultado el 5 de octubre de 2020 .
- ^ "Notas de la versión CUDA 11.1" . Desarrollador NVIDIA .
- ^ "Especificaciones de NVIDIA Quadro NVS 420" . Base de datos de GPU TechPowerUp .
- ^ Larabel, Michael (29 de marzo de 2017). "NVIDIA lanza soporte para GPU Tegra X2 en Nouveau" . Phoronix . Consultado el 8 de agosto de 2017 .
- ^ Especificaciones de Nvidia Xavier en TechPowerUp (preliminar)
- ^ "H.1. Características y especificaciones técnicas - Tabla 13. Soporte de características por capacidad de cómputo" . docs.nvidia.com . Consultado el 23 de septiembre de 2020 .
- ^ https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications
- ^ H.1. Características y especificaciones técnicas - Tabla 14. Especificaciones técnicas por capacidad de cómputo
- ^ Las ALU solo realizan aritmética de punto flotante de precisión simple. Hay 1 unidad de coma flotante de doble precisión.
- ^ a b Durant, Luke; Giroux, Olivier; Harris, Mark; Stam, Nick (10 de mayo de 2017). "Inside Volta: la GPU de centro de datos más avanzada del mundo" . Blog de desarrolladores de Nvidia .
- ^ No más de un programador puede emitir 2 instrucciones a la vez. El primer programador está a cargo de los warps con ID impares. El segundo programador está a cargo de las deformaciones con ID pares.
- ^ "H.6.1. Arquitectura" . docs.nvidia.com . Consultado el 13 de mayo de 2019 .
- ^ "I.7. Capacidad de cálculo 8.x" . docs.nvidia.com . Consultado el 23 de septiembre de 2020 .
- ^ "Apéndice F. Características y especificaciones técnicas" (PDF) . (3.2 MiB) , página 148 de 175 (Versión 5.0 de octubre de 2012).
- ^ "PyCUDA" .
- ^ "pycublas" . Archivado desde el original el 20 de abril de 2009 . Consultado el 8 de agosto de 2017 .
- ^ "CuPy" . Consultado el 8 de enero de 2020 .
- ^ "Bioinformática de nVidia CUDA: BarraCUDA" . BioCentric . 2019-07-19 . Consultado el 15 de octubre de 2019 .
- ^ "Parte V: simulación física" . Desarrollador NVIDIA . Consultado el 11 de septiembre de 2020 .
Enlaces externos [ editar ]
- Página web oficial