Resumen A
Resumen A
Resumen A
Nombres:
Edward Manuel
Apellidos:
Arredondo Maleno
Matricula:
1-17-5078
Materia:
Algoritmo paralelo
Profesor:
Eduardo Arvelo
Fecha:
10/07/2021
Introducción
Aunque hay otras API de GPU propuestas, por ejemploOpenCL Y hay otras empresas
(por ejemplo,AMD La GPU competitiva, pero la combinación de GPU de CUDA y
NVIDIA domina en múltiples aplicaciones, incluido el aprendizaje profundo, y es la
computadora más rápida en parte del mundo.
Se puede decir que la tarjeta gráfica es tan antigua como la PC, es decir, si consideras
que el adaptador de exhibición de IBM Monochrome de 1981 como una tarjeta
gráfica. Para 1988, puede obtener una tarjeta de Wonder Wonders 2D VGA de 16 bits
de ATI (la compañía finalmente adquirida por AMD). Para 1996, puede comprar un
acelerador de gráficos en 3D de 3DFX Interactive para ejecutar la primera persona que
disparó el quick.
También en 1996, Ying Weida comenzó a intentar competir con un producto vulnerable
para competir con el mercado de acelerador 3D, pero con su desarrollo, obtuvo un pozo.
En 1999, Yingwei Dan lanzó con éxito GeForce 256, esta es la primera tarjeta gráfica
llamada GPU. En ese momento, la razón principal por tener GPU fue juegos. Hasta que
las personas más tarde utilizaron GPUs por matemáticas, ciencia e ingeniería.
El origen de CUDA
En 2003, un grupo de investigadores dirigido por IAN Buck (Ian Buck) reveló el
misterio de Brooke, que es el primer modelo de programación que se usa ampliamente
en la extensión de la estructura paralela de datos C. Buck luego se unió a NVIDIA y
líder de la versión de CUDA en 2006, que es la primera solución comercial para la
GPU.
OpenCl y Cuda
El competidor de CUDA OpenCL fue lanzado por Apple y Khronos Group en 2009
para proporcionar estándares para cálculos heterogéneos, que no se limita a Intel / AMD
CPU con NVIDIA GPU. Aunque Opencl suena muy atractivo debido a su versatilidad,
el rendimiento en NVIDIA GPU no es tan bueno como CUDA, y muchos marcos de
aprendizaje de profundidad lo apoyan, o solo después de la liberación del apoyo de
CUDA.
Nvidia
El aumento de la velocidad de la GPU se ha convertido en la escasez de cálculos de alto
rendimiento. La ecuación con el tiempo, se mejora el rendimiento de un solo hilo de la
CPU (se recomienda la ley de Moore duplicar cada 18 meses), y debido al fabricante de
chips que encuentran restricciones físicas (incluido el proceso de fabricación, la
resolución de la máscara de chip y la restricción de La resolución de la máscara de chip
y el límite de la tasa de restricción), por lo tanto, se reduce al 10% anual. Restringir la
frecuencia del reloj en tiempo de ejecución.
Nvidia
Dominio de la aplicación CUDA
Nvidia
Como se muestra en la cifra anterior, las GPU de CUDA y NVIDIA se han adoptado en
muchas áreas que requieren un rendimiento informático de alto flotador. Las listas más
completas incluyen:
1. Calcular finanzas
2. CLIMA, TIEMPO Y SIMULACIÓN DEL OCÉANO
8. Imagenes medicas
9. Petróleo y gas
11. Salvaguardia
Kit de cuda
Nvidia
Por ejemplo, considere agregar dos matrices usando las siguientes rutinas sencillas C / C
++:
El soporte triple anterior usa un bloque de hilo y un hilo. Las gpus de NVIDIA actual
pueden manejar muchos bloques y hilos. Por ejemplo, basado enPascal GPU
arquitecturaTESLA P100 GPU tiene 56 multiprocesadores de flujo (SM), cada
procesador admite hasta 2048 hilos activos.
El código del kernel deberá conocer su bloque y índice de hilo para encontrar su
compensación en la matriz de transferencia. Núcleo paralelo usualmente
useCuadrículaCiclo, por ejemplo:
__global__
void add(int n, float *x, float *y)
{
int index = blockIdx.x * blockDim.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
for (int i = index; i < n; i += stride)
y[i] = x[i] + y[i];
}
Modelo de programación
Este capítulo presenta los conceptos principales detrás del modelo de programación
paralela en CUDA y describe cómo se exponen en C ++. En Interfaz de programación
se ofrece una descripción detallada de CUDA C ++ . El código completo para el
ejemplo de suma de vectores utilizado en este capítulo y el siguiente se puede encontrar
en el vectorAddMuestra CUDA .
Jerarquía de hilos
Jerarquía de la memoria
Los subprocesos CUDA pueden acceder a datos de múltiples espacios de memoria
durante su ejecución, como se ilustra en la Figura 5 . Cada hilo tiene memoria local
privada. Cada bloque de subprocesos tiene memoria compartida visible para todos los
subprocesos del bloque y con la misma vida útil que el bloque. Todos los subprocesos
tienen acceso a la misma memoria global.
También hay dos espacios de memoria adicionales de solo lectura accesibles para todos
los subprocesos: los espacios de memoria constante y de textura. Los espacios de
memoria global, constante y de textura están optimizados para diferentes usos de
memoria (consulte Accesos a la memoria del dispositivo ). La memoria de textura
también ofrece diferentes modos de direccionamiento, así como filtrado de datos, para
algunos formatos de datos específicos (consulte Textura y memoria de superficie ). Los
espacios de memoria global, constante y de textura son persistentes en los lanzamientos
del kernel por la misma aplicación.
Programación heterogénea
Capacidad de cómputo
Cualquier código PTX cargado por una aplicación en tiempo de ejecución se compila
además en código binario por el controlador del dispositivo. Esto se llama compilación
justo a tiempo. La compilación justo a tiempo aumenta el tiempo de carga de la
aplicación, pero permite que la aplicación se beneficie de las nuevas mejoras del
compilador que vienen con cada nuevo controlador de dispositivo. También es la única
forma de que las aplicaciones se ejecuten en dispositivos que no existían en el momento
en que se compiló la aplicación, como se detalla en Compatibilidad de aplicaciones .
Compatibilidad binaria
Compatibilidad de aplicaciones
Implementación de hardware
Arquitectura SIMT
Las aplicaciones deben esforzarse por minimizar la transferencia de datos entre el host
y el dispositivo. Una forma de lograr esto es mover más código del host al dispositivo,
incluso si eso significa ejecutar kernels que no exponen suficiente paralelismo para
ejecutarse en el dispositivo con total eficiencia. Las estructuras de datos intermedias
pueden crearse en la memoria del dispositivo, operarse por el dispositivo y destruirse sin
que el host las asigne ni las copie en la memoria del host. Además, debido a la
sobrecarga asociada con cada transferencia, agrupar muchas transferencias pequeñas en
una sola transferencia grande siempre funciona mejor que hacer cada transferencia por
separado.
Una instrucción que accede a la memoria direccionable (es decir, memoria global,
local, compartida, constante o de textura) puede necesitar ser reeditada varias veces
dependiendo de la distribución de las direcciones de memoria en los subprocesos dentro
de la deformación. La forma en que la distribución afecta el rendimiento de la
instrucción de esta manera es específica para cada tipo de memoria y se describe en las
siguientes secciones. Por ejemplo, para la memoria global, como regla general, cuanto
más dispersas están las direcciones, más reducido es el rendimiento.
Cualquier instrucción de control de flujo (Si, cambiar, hacer, para, mientras) puede
afectar significativamente el rendimiento efectivo de las instrucciones al hacer que los
subprocesos del mismo warp diverjan (es decir, sigan diferentes rutas de ejecución). Si
esto sucede, las diferentes rutas de ejecución deben serializarse, aumentando el número
total de instrucciones ejecutadas para este warp. Para obtener el mejor rendimiento en
los casos en los que el flujo de control depende del ID del hilo, la condición de control
debe escribirse de manera que se minimice el número de deformaciones divergentes.
Esto es posible porque la distribución de las deformaciones a lo largo del bloque es
determinista como se menciona en Arquitectura SIMT . Un ejemplo trivial es cuando la
condición de control solo depende de (threadIdx / warpSize) dónde warpSizees el
tamaño de la urdimbre. En este caso, ninguna urdimbre diverge ya que la condición de
control está perfectamente alineada con las urdimbres.
Ventajas
CUDA presenta ciertas ventajas sobre otros tipos de computación sobre GPU utilizando
APIs gráficas.
Limitaciones
El modelo de cuda
CUDA intenta aprovechar el gran paralelismo, y el alto ancho de banda de la memoria
en las GPU 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
Esta función se ejecutaría una vez en cada hilo, reduciendo el tiempo total de ejecución
en gran medida, y dividiendo su complejidad, O(n), por una constante directamente
relacionada con el número de procesadores disponibles.
Invocaciones de kernel
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.
Conclusión
CUDA es una tecnología que permite obtener grandes rendimientos para problemas con
un alto paralelismo. Hay que tener claro su funcionamiento para saber si es adecuado y
obtener el mayor rendimiento posible. Programar en CUDA es fácil, pero no lo es
obtener rendimiento.