30.07.2015 Views

Actas JP2011 - Universidad de La Laguna

Actas JP2011 - Universidad de La Laguna

Actas JP2011 - Universidad de La Laguna

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Actas</strong> XXII Jornadas <strong>de</strong> Paralelismo (<strong>JP2011</strong>) , <strong>La</strong> <strong>La</strong>guna, Tenerife, 7-9 septiembre 2011Shared MemoryL2 CacheDRAML1 Cache48 or 16 Kb 16 or 48 KbP0 P1 P2 P3 P4 P5256 bytesThread384 bits768 Kb1.5 GbFig. 1. Jerarquía <strong>de</strong> memoria Fermi (NVidia GTX-480).<strong>de</strong> transacción <strong>de</strong> memoria eran <strong>de</strong> 32, 64 y 128 Bytes.Sin embargo, en Fermi son <strong>de</strong> 128 ó 32 Bytes,<strong>de</strong>pendiendo <strong>de</strong> si la caché L1 está activa.B. Bloque <strong>de</strong> hilos, Warps y SMsFermi dobla el número <strong>de</strong> registros por SM (32KB). El número <strong>de</strong> procesadores (SPs) por SM hasido multiplicado por cuatro (32 SPs). En Fermi elnúmero máximo <strong>de</strong> hilos por bloque es 1024, mientrasque el máximo número <strong>de</strong> hilos concurrentes enun SM es 1536.C. Conflictos en memoria globalActualmente en Fermi la memoria global <strong>de</strong> estosdispositivos está distribuida en 5 ó 6 bancos con suscorrespondientes controladores in<strong>de</strong>pendientes. Unproblema frecuente a la hora <strong>de</strong> implementar códigosparalelos sobre arquitecturas pre-Fermi era el partitioncamping [5]. Este problema surge cuando hilosconcurrentes activos en cualquier SM solicitan segmentos<strong>de</strong> memoria diferentes pertenecientes al mismobanco <strong>de</strong> memoria global. Ello implica una serialización<strong>de</strong> dichas transacciones. Con la introducción<strong>de</strong> las cachés L1 y L2 en Fermi, este problema se aliviócuando los mismos segmentos <strong>de</strong> transacción sesolicitan una y otra vez.III. selección <strong>de</strong>l tamaño y la geometría<strong>de</strong>l bloque <strong>de</strong> hilosEn esta sección discutimos cómo los <strong>de</strong>talles <strong>de</strong>la arquitectura Fermi afectan a las <strong>de</strong>cisiones <strong>de</strong> losprogramadores respecto al tamaño y geometría <strong>de</strong>los bloques <strong>de</strong> hilos, así como a la configuración <strong>de</strong>la memoria caché L1.A. Tamaño <strong>de</strong> bloque <strong>de</strong> hilosA.1 Maximizar ocupaciónEn CUDA el factor ocupación <strong>de</strong> un SM es el ratioentre el número <strong>de</strong> warps presentes en el mismo yel número máximo <strong>de</strong> warps soportados por un SM(48 warps en Fermi). Maximizar la ocupación es importantepara ocultar las latencias en los accesos amemoria global.Para obtener máxima ocupación es necesario seleccionarun tamaño <strong>de</strong> bloque <strong>de</strong> hilos apropiado.<strong>La</strong> arquitectura Fermi soporta 1024 hilos por bloque,1536 hilos por SM y un máximo <strong>de</strong> 8 bloquesresidiendo simultáneamente en un SM. Por lo tanto,el tamaño <strong>de</strong> bloques <strong>de</strong> hilos <strong>de</strong>be ser inferior o iguala 1024, a la vez divisor entero <strong>de</strong> 1536 y el máximonúmero <strong>de</strong> hilos <strong>de</strong>l SM dividido entre el tamaño <strong>de</strong>lbloque no pue<strong>de</strong> exce<strong>de</strong>r <strong>de</strong> 8. Por ello concluimosque los únicos tamaños <strong>de</strong> bloques <strong>de</strong> hilos que maximizanla ocupación son 192, 256, 384, 512 y 768.Finalmente, cuando se va a lanzar un kernel quenecesita menos <strong>de</strong> 192 hilos por el número <strong>de</strong> SMsen el dispositivo, pue<strong>de</strong> ser recomendable escoger tamaños<strong>de</strong> bloques más pequeños, que no consiganmaximizar la ocupación. De esta forma, se aumentael número <strong>de</strong> bloques y se distribuyen mejor el conjunto<strong>de</strong> hilos entre los SMs, aumentando el grado <strong>de</strong>paralelismo global.A.2 <strong>La</strong> coalescencia y la carga <strong>de</strong> accesos a memoria<strong>La</strong> coalescencia es una técnica <strong>de</strong> implementaciónpara conseguir que hilos consecutivos <strong>de</strong> un warp,cuando solicitan memoria global, pidan direccioneslógicas contiguas. Esta técnica permite minimizar elnúmero <strong>de</strong> segmentos <strong>de</strong> transacción solicitados a lamemoria global. <strong>La</strong> coalescencia es especialmente importanteen aquellos códigos don<strong>de</strong> existe un alto ratio<strong>de</strong> accesos a memoria.Una técnica común para facilitar la programación<strong>de</strong> la coalescencia es utilizar estructuras <strong>de</strong> datosalineadas con el número <strong>de</strong> hilos por warp y el tamaño<strong>de</strong> los segmentos <strong>de</strong> transacción. Para reducirlas probabilida<strong>de</strong>s <strong>de</strong> la aparición <strong>de</strong> partition camping,es también aconsejable usar estructuras <strong>de</strong> datosque estén perfectamente alineadas con el número<strong>de</strong> controladores <strong>de</strong> memoria global <strong>de</strong>l dispositivoGPU. Por ejemplo, facilita la programación el escogerarrays <strong>de</strong> enteros o floats cuya última dimensiónes múltiplo <strong>de</strong> 32 y a la vez <strong>de</strong>l número <strong>de</strong> bancos.Para kernels <strong>de</strong> CUDA don<strong>de</strong> prevalezca el patrón<strong>de</strong> acceso coalescente y un alto ratio <strong>de</strong> accesos a memoria(uno o más accesos a memoria por operaciónaritmética), consi<strong>de</strong>ramos que utilizando bloques <strong>de</strong>192 hilos se obtendrán los mejores resultados por dosmotivos: (1) se maximiza la ocupación, (2) se consigueel mayor número <strong>de</strong> bloques concurrentes porSM (8). De esta forma, cuando los warps <strong>de</strong> un bloquevan terminando este se <strong>de</strong>saloja lo antes posiblepor tener un menor número <strong>de</strong> warps. Por tanto, lacantidad <strong>de</strong> warps que están activos en el SM se mantieneen el máximo (48) la mayor cantidad <strong>de</strong> tiempoposible dando más oportunida<strong>de</strong>s a la ocultación <strong>de</strong>las latencias.Kernels <strong>de</strong> programas como la multiplicación <strong>de</strong>matrices, a pesar <strong>de</strong> su coalescencia, presentan característicasdiferentes. Tienen mucha carga computacionalpor hilo y reutilizan datos en segmentos <strong>de</strong>memoria requeridos previamente. En este caso se esperaque aumentar el tamaño <strong>de</strong> bloque hasta 768 hilos(mayor tamaño <strong>de</strong> bloque que maximiza la ocupa-<strong>JP2011</strong>-682

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!