Implementación en GPU del algoritmo K-Means para ... - UMBC
Implementación en GPU del algoritmo K-Means para ... - UMBC
Implementación en GPU del algoritmo K-Means para ... - UMBC
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Implem<strong>en</strong>tación</strong> <strong>en</strong> <strong>GPU</strong> <strong>del</strong> <strong>algoritmo</strong> K-<strong>Means</strong> <strong>para</strong> procesami<strong>en</strong>to <strong>para</strong>lelo<br />
de imág<strong>en</strong>es de satélite disponibles <strong>en</strong> la herrami<strong>en</strong>ta Google Maps<br />
__constant__: la variable reside <strong>en</strong> el espacio de memoria constante <strong>del</strong><br />
dispositivo.<br />
• Está viva durante todo el tiempo de ejecución de la aplicación.<br />
• Accesible por todos los threads <strong>del</strong> grid, así como desde el host.<br />
__shared__: la variable reside <strong>en</strong> el espacio de memoria compartida <strong>del</strong> bloque<br />
de threads <strong>en</strong> el dispositivo.<br />
• Está viva mi<strong>en</strong>tras el bloque está vivo.<br />
• Accesible sólo por los threads <strong>del</strong> bloque.<br />
Herrami<strong>en</strong>tas de sincronización:<br />
Todas las ejecuciones de los kernels son asíncronas. El control es devuelto a la<br />
CPU inmediatam<strong>en</strong>te. Los kernels que se ejecut<strong>en</strong> después de llamadas CUDA<br />
previas ti<strong>en</strong><strong>en</strong> que completarse. De la misma manera la llamada cudaMemcpy<br />
síncrona, por lo que el control se devuelve a la CPU después de que las copias se han<br />
completado. Las copias que comi<strong>en</strong>zan después de llamadas CUDA previas ti<strong>en</strong><strong>en</strong><br />
que completarse. Para sincronizar contamos con la sigui<strong>en</strong>te llamada:<br />
cudaThreadSynchronize()<br />
cudaError_t cudaThreadSynchronize(void);<br />
La CPU espera hasta que el device ha completado todas las áreas p<strong>en</strong>di<strong>en</strong>tes<br />
anteriores. CudaThreadSynchronize() retorna error si una de las tareas p<strong>en</strong>di<strong>en</strong>tes<br />
falla.<br />
Existe otra herrami<strong>en</strong>ta de sincronización interna a un kernel que se utiliza <strong>para</strong><br />
sincronizar hilos d<strong>en</strong>tro de un bloque, esto resulta útil por ejemplo cuando todos los<br />
hilos de un bloque necesitan leer un dato común que debe ser calculado previam<strong>en</strong>te,<br />
suele utilizarse también tras finalizar una escritura <strong>en</strong> la memoria compartida de<br />
manera que ningún hilo lea de ésta hasta que no se haya finalizado la escritura.<br />
Utilizamos la sigui<strong>en</strong>te llamada:<br />
syncthreads()<br />
cudaError_t syncthreads(void);<br />
Trabajo Fin de Máster -93- Sergio Bernabé García