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

95

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 façon 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.

Crêpes de contrebande
la source

Réponses:

105

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

Grizzly
la source
3
Doux merci pour le visuel et l'explication. Je ne connaissais pas les diffusions et cela semble être une information importante :) Comment procéder pour vérifier que mes charges et mes magasins ne provoquent pas de conflits bancaires en mémoire partagée? Dois-je accéder au code d'assemblage d'une manière ou d'une autre?
Crêpes de contrebande du
3
puisque l'occurrence d'un conflit de banque est quelque chose qui sera déterminé à l'exécution (ce qui signifie que le compilateur ne le sait pas, après que toutes les adresses sont générées à l'exécution), obtenir la version compilée n'aiderait pas beaucoup. Je fais généralement cela à l'ancienne, en menant de prendre un stylo et du papier et de commencer à penser à ce que mon code stocke où. Après tout, les règles régissant la survenance des conflits bancaires ne sont pas si complexes. Sinon, vous pouvez utiliser le profileur nvidia OpenCL (devrait être fourni avec le sdk, iirc). Je pense qu'il a un compteur pour les sérialisations de warp.
Grizzly
1
Merci d'avoir signalé les sérialisations de warp. L'un des fichiers texte Lisez-moi fourni avec le profileur de calcul a déclaré ceci:
smuggledPancakes
1
Ack, excusez le commentaire ci-dessus, pour une raison quelconque, je ne peux pas le rééditer. Quoi qu'il en soit, j'ai trouvé cela dans le fichier readme du profileur de calcul, "warp_serialize: Nombre de déformations de threads qui sérialisent sur les conflits d'adresses en mémoire partagée ou constante." C'est génial que je puisse facilement voir s'il y a des conflits simplement en regardant la sortie du profileur. Comment savoir s'il y a des conflits bancaires sur papier et papier. Avez-vous appris des exemples ou des tutoriels?
smuggledPancakes
1
Comme je l'ai dit, le mappage des adresses aux banques est relativement simple, il n'est donc pas si difficile de déterminer quels accès vont à quelle banque et donc s'il y a des conflits bancaires. Le papier est seulement pour plus de modèles d'accès aux conflits, où je ne peux pas m'en passer.
Grizzly
13

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.

Belwood
la source
Alors, est-ce lié au moment où une demi-déformation veut stocker ou charger de la mémoire? 16 threads vont essayer de faire une transaction mémoire et donc accéder à la même banque avec plus d'un thread provoque un traitement sérialisé? Aussi, comment s'assurer que vous ne stockez / ne chargez pas de données dans la même banque?
smuggledPancakes
10

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.

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 mettant en mémoire tampon le tableau ou en utilisant un nombre premier d'éléments dans le tableau.

Nitin Kunal
la source
7

(CUDA Bank Conflict) J'espère que cela aidera ... c'est une très bonne explication ...

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

Prashant M.
la source
1
Notez que les réponses par lien uniquement sont déconseillées, les réponses SO devraient être le point final d'une recherche de solution (par rapport à une autre étape de références, qui ont tendance à devenir obsolètes avec le temps). Veuillez envisager d'ajouter un synopsis autonome ici, en gardant le lien comme référence.
kleopatra
Veuillez donner plus de détails sur le lien afin de mieux aider le PO.
Peter Foti
1
Cette vidéo est vraiment utile! Et je ne sais pas pourquoi le vote négatif! C'est une très bonne entrée! +1
Gabriel