usar - ¿Qué es un conflicto bancario?(Haciendo la programación de Cuda/OpenCL)
tutorial de cuda en español (5)
(CUDA Bank Conflict) Espero que esto ayude ... esta es una muy buena explicación ...
He estado leyendo la guía de programación para CUDA y OpenCL, y no puedo entender qué es un conflicto bancario. Simplemente se sumergen en la forma de resolver el problema sin profundizar en el tema en sí. ¿Alguien puede ayudarme a entenderlo? No tengo preferencia si la ayuda se encuentra en el contexto de CUDA / OpenCL o simplemente conflictos bancarios en general en ciencias de la computación.
En palabras simples, el conflicto bancario es un caso en el que cualquier patrón de acceso a la memoria no puede distribuir IO entre los bancos disponibles en el sistema de memoria. Los siguientes ejemplos elaboran el concepto:
Supongamos que tenemos una matriz bidimensional de 512x512 enteros y nuestra DRAM o sistema de memoria tiene 512 bancos. Por defecto, los datos de la matriz se diseñará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 número de banco y. Ahora, algunos códigos (como se muestra a continuación) comienzan a acceder a los datos en la columna de moda principal, es decir. cambiando x manteniendo constante a y, entonces el resultado final será que todo el acceso a la memoria consecutiva llegará al mismo banco, de ahí el conflicto bancario.
int arr[512][512];
for ( j = 0; j < 512; j++ ) // outer loop
for ( i = 0; i < 512; i++ ) // inner loop
arr[i][j] = 2 * arr[i][j]; // column major processing
Tales problemas, por lo general, son evitados por los compiladores almacenando en búfer la matriz o utilizando el número primo de elementos en la matriz.
La memoria compartida a la que se puede acceder en paralelo se divide en módulos (también llamados bancos). Si se producen dos ubicaciones (direcciones) de memoria en el mismo banco, se produce un conflicto bancario durante el cual el acceso se realiza en serie, perdiendo las ventajas del acceso paralelo.
Para nvidia (y amd para el caso) gpus, la memoria local está dividida en bancos de memoria. Cada banco solo puede abordar un conjunto de datos a la vez, de modo que si un medio 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 (32banks 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 0- 0 byte 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 |...
...
Por lo tanto, si cada subproceso en semirremolque 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 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 debe ser todos los subprocesos en semienlaces accediendo al La misma dirección, iirc fermi y AMD gpus pueden hacer esto para cualquier cantidad de subprocesos que accedan al mismo valor).
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 los detalles sobre el banco de memoria. pero es un poco diferente de 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