29.04.2013 Views

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

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

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

Saved successfully!

Ooh no, something went wrong!