Coalescencia de memoria
Leerlo en el Capítulo 4 · checkpoint +50 XP →
Cuando los 32 hilos de un warp leen direcciones contiguas, el hardware los une en unas pocas transacciones anchas.
La memoria global se accede en segmentos alineados (sectores de 32 bytes, agrupados en líneas de 128 bytes). Si los 32 hilos de un Warp y SIMT leen 32 floats consecutivos de 4 bytes, el hardware los atiende con una transacción de 128 bytes. Si leen con un salto grande, puede necesitar 32 transacciones separadas, una penalización de 32× en ancho de banda.
Arreglos clásicos de la práctica de programación de GPU (p. ej. la guía de PRACE)
- Estructura de arreglos en lugar de arreglo de estructuras.
- Que el hilo i toque el elemento i, no i × salto.
- Pasar los patrones de acceso incómodos (transposiciones, stencils) por memoria compartida y luego escribir de forma coalescente.
- Cuidado con los conflictos de bancos de memoria compartida al hacerlo.
Los profilers (Nsight Compute) reportan "sectores por solicitud". Lo ideal es 4 para cargas de 4 bytes.
Relacionado
Fuentes y lecturas adicionales
- PRACE Best Practice Guide – GPGPU — GPU programming and tuning practice for HPC
- CUDA C++ Best Practices Guide
Escrito para LazyLab con nuestras propias palabras; las fuentes se citan para profundizar y verificar.