En OpenCL, tengo entendido que puede usar la función barrier()
para sincronizar subprocesos en un grupo de trabajo. Sí (generalmente) entiendo para qué son y cuándo usarlos. También sé que todos los hilos en un grupo de trabajo deben golpear la barrera, de lo contrario hay problemas. Sin embargo, cada vez que he intentado utilizar barreras hasta ahora, parece que mi controlador de video se cuelga o aparece un mensaje de error sobre el acceso a algún tipo de memoria no válida. Hasta ahora he visto esto en 2 tarjetas de video diferentes (1 ATI, 1 NVIDIA).Barreras en OpenCL
Por lo tanto, mis preguntas son:
- Cualquier idea de por qué esto iba a pasar?
- ¿Cuál es la diferencia entre
barrier(CLK_LOCAL_MEM_FENCE)
ybarrier(CLK_GLOBAL_MEM_FENCE)
? Leí la documentación, pero no estaba claro para mí. - ¿Existe una regla general sobre cuándo usar
barrier(CLK_LOCAL_MEM_FENCE)
frente abarrier(CLK_GLOBAL_MEM_FENCE)
? - ¿Hay alguna vez que llamar a
barrier()
con el tipo de parámetro incorrecto podría causar un error?
Obviamente CLK_GLOBAL_MEM_FENCE es a menudo más lento que CLK_LOCAL_MEM_FENCE. El motivo es que todos los hilos dentro de un bloque tendrán que esperar a que finalicen los accesos a la memoria. Y esperar a que finalicen los accesos a la memoria global es mucho más costoso que los accesos a la memoria local. Por supuesto, esto no siempre es cierto, depende de los patrones de acceso (Fermi ahora tiene cachés, lo que significa que los accesos globales pueden almacenarse en caché en L1, que tiene latencia similar con memoria compartida), el número de accesos de memoria global/local en el kernel , la ocupación, conflictos bancarios, coaliciones, etc. – Zk1001