- Una GPGPU corre de forma asíncrona al CPU del host
- Una GPGPU corre en un espacio de memoria separado del CPU del host
- La velocidad de la memoria del host es 8-20 GB/s, mientras que la velocidad de la memoria en una GPGPU es aproximadamente 160-200 GB/s.
- Los programas en CUDA usan kernels
- Un kernel es una subrutina llamada desde el host que se ejecutara en la GPGPU.
- Un kernel no es una función, ya que no puede retornar un valor.
- Un kernel está definido con una especificador declarativo __global__ , el cual le indica al compilador que el kernel es llamable desde el procesador del host.
- Las llamadas a kernels son asíncronas
- El host encola un kernel para su ejecución en el GPGPU y no lo espera a que finalice.
- En algún momento después el kernel corre en el GPGPU
- Para mayor eficiencia, se pueden crear pipelines para encolar kernels y mantener el GPGPU ocupado tanto sea posible.
- Más adelante, puede ser necesario determinar cuando el kernel o la pipeline ha sido completada, por lo que se utilizan comúnmente dos mecanismos de sincronización:
- cudaThreadSynchronize(), hace que el host se detenga y espere a que todos los kernels encolados se ejecuten
- Ejecutar una transferencia de datos con bloque mediante cudaMemcpy(), ya que incluye dentro la llamada a cudaThreadSyncrhonize().
- La unidad básica de trabajo de una GPGPU es un thread.
- Cada thread actúa como si tuviera su propio procesador con identidad y registros separados
- El hardware de la GPGPU (GPU thread scheduler) define cuando un grupo de threads que pueden correr concurrentemente. También tiene la habilidad para intercambiar entre threads de forma rápida y transparente desde el punto de vista del software.
- Existen algunas instrucciones que permiten que los threads se comuniquen a través de espacios de memoria compartida de CUDA.
- Una configuración de ejecución define el número de threads que ejecutará el kernel y el arreglo del grid computacional en 1D, 2D o 3D. Esta información se encierra en triples brackets "<<<" y ">>>" después del nombre del kernel y antes de la lista de parámetros entre paréntesis.
- La región más grande en una GPGPU es llamada memoria global.
- La memoria global está sujeta a reglas de fusión que combinan múltiples transacciones de memoria en una sola carga en funciones que pueden obtener una transferencia más alta desde y hacia la memoria.
- En general, el mayor rendimiento de la memoria ocurre cuando se accesa de manera en trozos de 128 bytes consecutivos.
- Existen otras formas de memoria accesible para el programador de una GPGPU, como son constant, cache, shared, local, texture y register memory.
- Aunque el ancho de banda de la memoria global es de 160-200 GB/s, es lento comparado con el rendimiento de 1 teraflop que puede alcanzar. Por lo tanto es esencial hacer reuso de datos para alcanzar el máximo rendimiento.
martes, 27 de agosto de 2013
Conceptos básicos en CUDA
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario