Para nvidia (y amd para el caso) gpus, la memoria local se divide en bancos de memoria. Cada banco solo puede direccionar un conjunto de datos a la vez, por lo que si un medio warp intenta cargar / almacenar datos desde / hacia el mismo banco, el acceso debe ser serializado (esto es un conflicto bancario). Para gt200 gpus hay 16 bancos (32 bancos para fermi), 16 o 32 bancos para AMD gpus (57xx o superior: 32, todo a continuación: 16)), que están intercalados con una granuidad de 32 bits (por lo que los bytes 0-3 están en banco 1, 4-7 en el banco 2, ..., 64-69 en el banco 1 y así sucesivamente). Para una mejor visualización, básicamente se ve así:
Bank | 1 | 2 | 3 |...
Address | 0 1 2 3 | 4 5 6 7 | 8 9 10 11 |...
Address | 64 65 66 67 | 68 69 70 71 | 72 73 74 75 |...
...
Entonces, si cada hilo en una media distorsión accede a valores sucesivos de 32 bits, no hay conflictos bancarios. Una excepción a esta regla (cada subproceso debe acceder a su propio banco) son las difusiones: si todos los subprocesos acceden a la misma dirección, el valor solo se lee una vez y se transmite a todos los subprocesos (para GT200 tiene que ser todos los subprocesos en el halfwarp que acceden al misma dirección, iirc fermi y AMD gpus pueden hacer esto para cualquier número de subprocesos que accedan al mismo valor).
La memoria compartida a la que se puede acceder en paralelo se divide en módulos (también llamados bancos). Si dos ubicaciones de memoria (direcciones) ocurren en el mismo banco, entonces se genera un conflicto bancario durante el cual el acceso se realiza en serie, perdiendo las ventajas del acceso paralelo.
fuente
En palabras simples, el conflicto de bancos es un caso en el que cualquier patrón de acceso a la memoria no puede distribuir E / S entre los bancos disponibles en el sistema de memoria. Los siguientes ejemplos elaboran el concepto: -
Supongamos que tenemos una matriz bidimensional de números enteros de 512x512 y nuestra DRAM o sistema de memoria tiene 512 bancos. Por defecto, los datos de la matriz se distribuirán de manera que arr [0] [0] vaya al banco 0, arr [0] [1] vaya al banco 1, arr [0] [2] al banco 2 .... arr [0] [511] va al banco 511. Para generalizar arr [x] [y] ocupa el banco número y. Ahora, algún código (como se muestra a continuación) comienza a acceder a los datos en la columna principal, es decir. cambiando x mientras se mantiene y constante, el resultado final será que todos los accesos consecutivos a la memoria llegarán al mismo banco, de ahí el conflicto de bancos.
Estos problemas, por lo general, los evitan los compiladores almacenando en búfer la matriz o utilizando un número primo de elementos en la matriz.
fuente
(Conflicto del Banco CUDA) Espero que esto ayude ... esta es una muy buena explicación ...
http://www.youtube.com/watch?v=CZgM3DEBplE
fuente
http://en.wikipedia.org/wiki/Memory_bank
y http://mprc.pku.cn/mentors/training/ISCAreading/1989/p380-weiss/p380-weiss.pdf
desde esta página, puede encontrar el detalle sobre el banco de memoria. pero es un poco diferente a lo que dice @Grizzly. en esta página, el banco es así
banco 1 2 3
dirección | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, 5,8 ... |
espero que esto ayude
fuente