Lección 17: __syncthreads() y condiciones de carrera
Cuando cargas datos en memoria compartida y luego los lees entre distintos hilos, surge un problema: los hilos de un bloque no corren exactamente al mismo ritmo. Un hilo puede llegar a la línea de lectura antes de que otro hilo haya terminado de escribir la celda que necesita — eso es una condición
Un grupo de personas coloca libros en un estante compartido, y luego cada una necesita tomar un libro que otra persona colocó. Si empiezas a tomar libros antes de que todos hayan terminado de colocarlos, algunos estirarán la mano hacia un espacio vacío. __syncthreads() es decir 'nadie toma nada hasta que todos hayan colocado su libro'.
- __syncthreads()
- Una barrera dentro de un bloque: todos los hilos se detienen en este punto hasta que todos hayan llegado, y solo entonces continúan juntos.
- condición de carrera (race condition)
- Cuando el resultado depende del orden en que los hilos llegan a una escritura/lectura. Aquí: leer de la memoria compartida antes de que la escritura haya terminado.
- barrera (barrier)
- Un punto de espera al que todos los hilos del bloque deben llegar antes de que alguno continúe. Bloquea las carreras entre una escritura y una lectura.
- alcance de la barrera (bloque)
- __syncthreads() funciona solo dentro de un único bloque. No tiene efecto entre bloques distintos, y no debe llamarse dentro de una rama divergente.