Buscar este blog

viernes, 24 de febrero de 2012

Los diversos usos de la memoria

Es muy importante saber que ventajas e inconvenientes tiene el uso de cada tipo de memoria de dispositivo, antes de realizar cualquier diseño, deberías tener claro cómo CUDA gestiona cada tipo de memoria, y cual es el coste o penalización que supone su utilización.


La siguiente Figura muestra los tipos de memoria en las GPUs y el ámbito de acceso de cada elemento
Figura 1. Los diferentes tipos de memoria en la GPU

Cada una de ellas tiene unos propósitos concretos que pasamos a detallar: Los registros y la memoria local son espacios de memoria accesibles únicamente por el hilo al que pertenecen. Por otro lado, a la memoria compartida  pueden acceder todos los hilos del mismo bloque, utilizando para ello mecanismos de sincronización que mantienen el orden en las lecturas y escrituras. Al resto de memorias  se puede acceder desde toda la malla que ejecuta un kernel. Se distinguen en que la memoria global no dispone de memoria caché, la memoria de constantes es de sólo lectura, y la memoria de texturas dispone de una caché espacial. 

El cuello de botella principal lo encontramos en la transferencia de memoria entre la CPU y la GPU, de modo que la penalización nos la encontramos en la latencia del acceso a la memoria global (entre 400 y 600 ciclos). Como solución posible se plantea el alineamiento de la memoria global para poder hacer lecturas ordenadas según la posición de cada hilo dentro de la tanda, se puede utilizar la memoria compartida para hacer la ordenación dentro de cada bloque. No siempre es posible hacer esta ordenación y el problema se complica cuando aumentan las dimensiones (matrices por ejemplo).

viernes, 10 de febrero de 2012

Entorno respetuoso de ejecución


A simple vista podríamos pensar que si un Grid solo puede ejecutar el mismo kernel y este es controlado solo por un dispositivo el cual solo es accesible desde el mismo thread del host, no es necesario tener en consideración otras interacciones entre distintos procesos. Hasta la versión 3.2 de CUDA esto era así,
Figura 1. CUDA 4.0 revoluciona la computación paralela en GPGPU
pero con la aparición de CUDA 4.0, se han eliminado ésta y muchas otras barreras: en cuanto a la plataforma GPUDirect™ se pueden realizar transferencias de memoria directamente de una GPU a otra sin pasar por memoria host; arquitectura 64-bit nativa; gestión de clúster; soporte multi-GPU en la que se pueden compartir múltiples GPUs a través de múltiples hilos (de host), un solo hilo (de host) puede acceder a todas las GPUs. En cuanto al modelo de programación: direccionamiento de memoria unificado, ahora se podrá contemplar la memoria de sistema y la memoria de cada una de las GPUs como una sola unidad de memoria simplificando así la migración de programas existentes. 

Además el nuevo toolkit viene acompañado de librerías OpenSource y plantillas de primitivas que ayudan y facilitan el manejo de vectores, matrices, etc. Un nuevo sistema de análisis de rendimiento permitirá obtener todas las métricas necesarias para afinar nuestros desarrollos.

Por eso es importante diseñar no sólo kernels, sino también las rutinas de host que los llaman, para que hagan un uso razonable de los recursos, por ejemplo modificando el tamaño de los bloques e hilos en las llamadas dinámicamente, en lugar de dejar un valor fijo para todas las llamadas.