Pregunta

He estado leyendo la guía de programación de CUDA y OpenCL, y no puedo entender por qué es un conflicto banco. Ellos sólo una especie de inmersión en la forma de resolver el problema sin dar más detalles sobre el tema en sí. ¿Puede alguien me ayuda entenderlo? No tengo ninguna preferencia si la ayuda es en el contexto de CUDA / OpenCL o conflictos bancarias sólo en general en la informática.

¿Fue útil?

Solución

Para nvidia (y AMD para el caso) las GPU de la memoria local se divide en memorybanks. Cada banco puede sólo afectan a un conjunto de datos a la vez, por lo que si un halfwarp trata de datos de carga / almacenamiento desde / hasta el mismo banco el acceso tiene que ser serializado (esto es un conflicto banco). Para GT200 GPU hay 16 bancos (32banks de Fermi), 16 o 32 bancos para las GPU de AMD (57XX o superior: 32, todo a continuación: 16)), que se intercalan con un granuity de 32 bits (byte por lo que están en 0-3 el banco 1, 4-7 en el banco 2, ..., 64-69 en el banco 1 y así sucesivamente). Para una mejor visualización que básicamente es el siguiente:

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

Así que si cada hilo en un halfwarp accede a 32 bits sucesivos valores no existen conflictos de banco. Una excepción a esta regla (cada hilo debe tener acceso a su propio banco) son emisiones: Si todos los subprocesos tienen acceso a la misma dirección, el valor sólo se lee una vez y transmitido a todas las roscas (por GT200 tiene que ser todos los hilos en la halfwarp con el acceso a la misma dirección, IIRC GPU Fermi y AMD pueden hacer esto para cualquier número de hilos para acceder el mismo valor).

Otros consejos

La memoria compartida que se puede acceder de forma paralela se divide en módulos (también llamados bancos). Si dos posiciones de memoria (direcciones) se producen en el mismo banco, entonces se obtiene un conflicto bancaria durante el cual se realiza el acceso en serie, perdiendo las ventajas del acceso paralelo.

En palabras sencillas, el conflicto banco es un caso en el que cualquier patrón de acceso a memoria no asigna IO a través de los bancos disponibles en el sistema de memoria. Los siguientes ejemplos elabora el concepto: -

Supongamos que tenemos dos dimensiones 512x512 matriz de enteros y nuestra memoria DRAM o sistema de memoria tiene 512 bancos en ella. Por defecto, los datos de la matriz serán disposición de una manera que arr [0] [0] va al banco 0, arr [0] [1] va al banco 1, arr [0] [2] para el banco 2 .... arr [0] [511] va al banco 511. para generalizar arr [x] [y] ocupa número de banco y. Ahora algo de código (como se muestra a continuación) empezar a acceder a los datos en la columna importante de la manera es decir. cambiando x mientras se mantiene constante y, a continuación, el resultado final será que todos los accesos de memoria consecutivas golpeará el mismo banco -. por lo tanto, el conflicto bancaria

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, se evitan por los compiladores tamponando la matriz o el uso de número primo de elementos en el array.

(CUDA Banco de conflictos) Espero que esto sea de ayuda.. esto es muy buena explicación ...

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

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, usted puede encontrar los detalles sobre el banco de memoria. pero es un poco diferente de lo que se dice por @Grizzly. en esta página, el banco es como esto

banco 1 2 3

Dirección | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, 5,8 ... |

espero que esto ayudaría

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top