Question

Je suis en train de lire le guide de programmation CUDA et OpenCL, et je ne peux pas comprendre ce qu'est un conflit bancaire est. Ils juste une sorte de plonger dans la façon de résoudre le problème sans plus de précisions sur le sujet lui-même. aider quelqu'un peut me comprendre? J'ai pas de préférence si l'aide est dans le contexte de CUDA / OpenCL ou seulement les conflits bancaires en général dans la science informatique.

Était-ce utile?

La solution

nvidia (et amd pour cette matière) GPU la mémoire locale est divisée en memorybanks. Chaque banque ne peut répondre à un ensemble de données à la fois, donc si un halfwarp tente de données de chargement / stockage de / à la même banque l'accès doit être publié en feuilleton (ce qui est un conflit bancaire). Pour GT200 GPUs il y a 16 banques (32banks pour fermi), 16 ou 32 banques pour AMD (GPUs 57xx ou plus: 32, tout ci-dessous: 16)), qui sont intercalés avec un granuity de 32 bits (si l'octet 0-3 sont en banque 1, 4-7 dans la banque 2, ..., 64-69 dans la banque 1 et ainsi de suite). Pour une meilleure visualisation, il ressemble fondamentalement à 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 |...
...

Donc, si chaque thread dans un accès halfwarp valeurs 32bit successives, il n'y a pas de conflits bancaires. Une exception à cette règle (chaque thread doit accéder à sa propre banque) sont des émissions: Si tous les threads accèdent à la même adresse, la valeur est uniquement une fois lu et diffusé à toutes les discussions (pour GT200 il doit être tous les threads du halfwarp accédant à la même adresse, IIRC GPUs fermi et AMD peuvent le faire pour un certain nombre de threads accès la même valeur).

Autres conseils

La mémoire partagée qui est accessible en parallèle est divisé en modules (banques) également appelés. Si deux emplacements de mémoire (adresses) se produisent dans la même banque, alors vous obtenez un conflit bancaire au cours de laquelle l'accès se fait en série, perdre les avantages de l'accès parallèle.

En termes simples, le conflit bancaire est un cas lorsqu'une séquence d'accès mémoire ne parvient pas à distribuer IO entre les banques disponibles dans le système de mémoire. Les exemples suivants le concept élabore: -

Supposons que nous avons ensemble à deux dimensions 512x512 d'entiers et de notre mémoire DRAM ou de mémoire système a 512 banques en elle. Par défaut, les données du tableau seront mise en page d'une manière 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. généraliser arr [x] [y] occupe numéro de banque y. Maintenant, un peu de code (comme indiqué ci-dessous) commencent l'accès aux données dans la colonne mode importante à savoir. changer x tout en gardant constant y, alors le résultat final sera que tous les accès à la mémoire consécutive frappera la même banque -. d'où un conflit bancaire

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

Ces problèmes, en général, sont évités par les compilateurs en tamponnant le tableau ou en utilisant des nombres premiers éléments du tableau.

(Banque CUDA conflit) J'espère que cela aide .. ce qui est très bon ... explaination

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

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 les détails au sujet de la banque de mémoire. mais il est un peu différent de ce qui est dit par @Grizzly. dans cette page, la banque est comme ceci

banque 1 2 3

adresse | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, ... 5,8 |

espère que cela contribuerait à

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top