web-dev-qa-db-fra.com

Qu'est-ce qu'un conflit bancaire? (Faire de la programmation Cuda / OpenCL)

J'ai lu le guide de programmation pour CUDA et OpenCL, et je ne peux pas comprendre ce qu'est un conflit bancaire. Ils plongent simplement dans la manière de résoudre le problème sans élaborer sur le sujet lui-même. Quelqu'un peut-il m'aider à le comprendre? Je n'ai aucune préférence si l'aide est dans le contexte de CUDA/OpenCL ou simplement des conflits bancaires en général en informatique.

91
smuggledPancakes

Pour les gpus nvidia (et AMD d'ailleurs), 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 un halfwarp essaie 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 bancaire). Pour gt200 gpus, il y a 16 banques (32 banques pour fermi), 16 ou 32 banques pour AMD gpus (57xx ou supérieur: 32, tout en dessous: 16)), qui sont entrelacées avec une granularité de 32 bits (donc l'octet 0-3 est en banque 1, 4-7 dans la banque 2, ..., 64-69 dans la banque 1 et ainsi de suite). Pour une meilleure visualisation, cela ressemble à 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 d'un halfwarp 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, tous les threads du demi-chaîne doivent accéder à la même adresse, iirc fermi et AMD gpus peuvent le faire pour n'importe quel nombre de threads accédant à la même valeur).

100
Grizzly

La mémoire partagée accessible en parallèle est divisée en modules (également appelés banques). Si deux emplacements de mémoire (adresses) se produisent dans la même banque, 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.

13
belwood

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

Supposons que nous ayons un tableau bidimensionnel 512x512 d'entiers et que notre DRAM ou système de mémoire possède 512 banques. Par défaut, les données du tableau seront mises en page de manière à ce que arr [0] [0] passe à la banque 0, arr [0] [1] passe à 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 de la manière principale de la colonne, c'est-à-dire. changer x tout en gardant y constant, le résultat final sera que tous les accès consécutifs à la mémoire atteindront 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

De tels problèmes sont généralement évités par les compilateurs en tamponnant le tableau ou en utilisant un nombre premier d'éléments dans le tableau.

7
Nitin Kunal

(Conflit bancaire CUDA) J'espère que cela vous aidera .. c'est une très bonne explication ...

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

6
Prashant M.

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

1
city