Pour nvidia (et amd d'ailleurs) gpus, la mémoire locale est divisée en banques de mémoire. Chaque banque ne peut adresser qu'un seul ensemble de données à la fois, donc si une demi-déformation tente de charger / stocker des données depuis / vers la même banque, l'accès doit être sérialisé (il s'agit d'un conflit de banque). Pour les gpus gt200, il y a 16 banques (32 banques pour fermi), 16 ou 32 banques pour les gpus AMD (57xx ou supérieur: 32, tout en dessous: 16)), qui sont entrelacées avec une granuité de 32 bits (donc l'octet 0-3 est dans banque 1, 4-7 dans la banque 2, ..., 64-69 dans la banque 1 et ainsi de suite). Pour une meilleure visualisation, cela ressemble essentiellement à ceci:
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 |...
...
Ainsi, si chaque thread d'une demi-déformation accède à des valeurs 32 bits successives, il n'y a pas de conflits bancaires. Une exception à cette règle (chaque thread doit accéder à sa propre banque) sont les diffusions: si tous les threads accèdent à la même adresse, la valeur n'est lue qu'une seule fois et diffusée à tous les threads (pour GT200, il doit s'agir de tous les threads du halfwarp accédant au même adresse, iirc fermi et AMD gpus peuvent le faire pour n'importe quel nombre de threads accédant à la même valeur).
La mémoire partagée accessible en parallèle est divisée en modules (également appelés bancs). Si deux emplacements mémoire (adresses) se produisent dans la même banque, alors vous obtenez un conflit de banque pendant lequel l'accès se fait en série, perdant les avantages de l'accès parallèle.
la source
En termes simples, un conflit de banque est un cas où un modèle d'accès à la mémoire ne parvient pas à distribuer les E / S entre les banques disponibles dans le système de mémoire. Les exemples suivants élaborent le concept: -
Supposons que nous ayons un tableau d'entiers bidimensionnel de 512x512 et que notre DRAM ou système de mémoire ait 512 banques. Par défaut, les données du tableau seront disposées de telle sorte que arr [0] [0] va à la banque 0, arr [0] [1] va à la banque 1, arr [0] [2] à la banque 2 .... arr [0] [511] va à la banque 511. Pour généraliser arr [x] [y] occupe le numéro de banque y. Maintenant, un certain code (comme indiqué ci-dessous) commence à accéder aux données dans la principale colonne, c'est-à-dire. en changeant x tout en gardant y constant, le résultat final sera que tous les accès mémoire consécutifs toucheront la même banque - d'où un conflit de banque.
De tels problèmes sont généralement évités par les compilateurs en mettant en mémoire tampon le tableau ou en utilisant un nombre premier d'éléments dans le tableau.
la source
(CUDA Bank Conflict) J'espère que cela aidera ... c'est une très bonne explication ...
http://www.youtube.com/watch?v=CZgM3DEBplE
la source
http://en.wikipedia.org/wiki/Memory_bank
et http://mprc.pku.cn/mentors/training/ISCAreading/1989/p380-weiss/p380-weiss.pdf
à partir de cette page, vous pouvez trouver le détail de la banque de mémoire. mais c'est un peu différent de ce que dit @Grizzly. dans cette page, la banque est comme ça
banque 1 2 3
adresse | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, 5,8 ... |
j'espère que cela aiderait
la source