Después de liberar Compute Capability 2.0 (Fermi), me he preguntado si queda algún caso de uso para la memoria compartida. Es decir, ¿cuándo es mejor usar memoria compartida que simplemente dejar que L1 realice su magia en el fondo?CUDA: ¿Cuándo usar la memoria compartida y cuándo confiar en el almacenamiento en caché L1?
¿La memoria compartida está ahí para permitir que los algoritmos diseñados para CC < 2.0 se ejecuten eficientemente sin modificaciones?
Para colaborar a través de la memoria compartida, los hilos en un bloque escriben en la memoria compartida y sincronizan con __syncthreads()
. ¿Por qué no simplemente escribir en la memoria global (a través de L1) y sincronizar con __threadfence_block()
? La última opción debería ser más fácil de implementar, ya que no tiene que relacionarse con dos ubicaciones diferentes de valores, y debería ser más rápida porque no hay una copia explícita de la memoria global a compartida. Dado que los datos se almacenan en caché en L1, los subprocesos no tienen que esperar que los datos lleguen realmente a la memoria global.
Con memoria compartida, se garantiza que un valor que se puso allí permanece allí durante toda la duración del bloque. Esto es opuesto a los valores en L1, que son desalojados si no se usan con la suficiente frecuencia. ¿Hay algún caso en el que también es mejor almacenar en caché esos datos que se usan con poca frecuencia en la memoria compartida que dejar que el L1 los administre en función del patrón de uso que tiene el algoritmo en realidad?
Gracias, eso responde mi pregunta. Me imaginé que el caché podía hacer un seguimiento de los elementos que más se usaban y prefería guardarlos en caché. He leído cachés asociativos n-way ahora y me parece que el problema principal es que pueden arrojar un valor que a menudo se usa simplemente porque otra línea de caché se ajusta a esa ranura. –
Creo que eso significa que una buena estrategia para escribir programas CUDA a menudo puede ser escribir primero el algoritmo para usar solo memoria global y ver si L1 funciona lo suficientemente bien como para que la latencia de la memoria esté oculta. Y luego considere la optimización de la mano con la memoria compartida si el algoritmo resulta estar vinculado a la memoria. –