¿Qué es un conflicto bancario? (Haciendo programación Cuda / OpenCL)

95

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 cómo resolver el problema sin profundizar en el tema en sí. ¿Alguien puede ayudarme a entenderlo? No tengo preferencia si la ayuda está en el contexto de CUDA / OpenCL o simplemente conflictos bancarios en general en informática.

panqueques de contrabando
fuente

Respuestas:

105

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).

Oso pardo
fuente
3
Dulces gracias por la visual y la explicación. No sabía acerca de las transmisiones y eso parece una información importante :) ¿Cómo podría verificar que mis cargas y tiendas no causen conflictos bancarios en la memoria compartida? ¿Tengo que acceder al código ensamblador de alguna manera o hay otras formas?
smuggledPancakes
3
Dado que la aparición de un conflicto bancario es algo que se determinará en tiempo de ejecución (lo que significa que el compilador no lo sabe, después de que la mayoría de las direcciones se generen en tiempo de ejecución), obtener la versión compilada no ayudaría mucho. Normalmente hago esto a la antigua usanza, amenazando que tomo un lápiz y papel y empiezo a pensar en dónde se almacena mi código. Después de todo, las reglas que rigen la aparición de conflictos bancarios no son tan complejas. De lo contrario, puede usar el generador de perfiles nvidia OpenCL (debe estar incluido con el sdk, iirc). Creo que tiene un contador de serializaciones warp.
Grizzly
1
Gracias por señalar warp serializa. Uno de los archivos de texto Léame que viene con el generador de perfiles informáticos decía esto
smuggledPancakes
1
Ack, disculpe el comentario anterior, por alguna razón no puedo volver a editarlo. De todos modos, encontré esto en el archivo Léame del generador de perfiles informáticos, "warp_serialize: Número de deformaciones de subprocesos que se serializan en conflictos de direcciones en la memoria compartida o constante". Es genial que pueda ver fácilmente si hay conflictos con solo mirar la salida del generador de perfiles. ¿Cómo se puede saber si hay conflictos bancarios en papel y lápiz? ¿Aprendiste de algunos ejemplos o tutoriales?
SmuggledPancakes
1
Como dije, el mapeo de direcciones a bancos es relativamente simple, por lo que no es tan difícil averiguar qué accesos van a qué banco y, por lo tanto, si hay conflictos bancarios. El documento es solo para más patrones de acceso a conflictos, donde no puedo hacerlo sin él.
Grizzly
13

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.

Belwood
fuente
Entonces, ¿esto está relacionado con cuando un medio warp quiere almacenar o cargar memoria? ¿16 subprocesos intentarán realizar una transacción de memoria y, por lo tanto, acceder al mismo banco con más de un subproceso provoca un procesamiento serializado? Además, ¿cómo se asegura uno de que no está almacenando / cargando datos en el mismo banco?
smuggledPancakes
10

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.

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

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.

Nitin Kunal
fuente
7

(Conflicto del Banco CUDA) Espero que esto ayude ... esta es una muy buena explicación ...

http://www.youtube.com/watch?v=CZgM3DEBplE

Prashant M.
fuente
1
Tenga en cuenta que se desaconsejan las respuestas de solo enlace , las respuestas SO deben ser el punto final de la búsqueda de una solución (frente a otra escala de referencias, que tienden a volverse obsoletas con el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia.
Cleopatra
Amplíe el enlace en un esfuerzo por ayudar mejor al OP.
Peter Foti
1
¡Este video es realmente útil! ¡Y no sé por qué el voto negativo! ¡Es una muy buena entrada! +1
Gabriel