martes, 27 de agosto de 2013

Conceptos básicos en CUDA

  • 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.

No hay comentarios:

Publicar un comentario