118 votes

Qu'est-ce qu'un conflit bancaire? (Programmation Cuda / OpenCL)

J'ai lu le guide de programmation CUDA et OpenCL, et je ne peux pas comprendre ce qu'est une banque de conflit. Ils ont juste sorte de plongée dans la façon de résoudre le problème sans élaborer sur le sujet lui-même. J'ai essayé de googler pour la banque des conflits et de la banque conflit domaine de l'informatique mais je ne pouvais pas trouver beaucoup. Quelqu'un peut-il m'aider à comprendre ou m'indiquer un bon lien? Je n'ai pas de préférence si l'aide est dans le contexte de CUDA/OpenCL ou tout simplement de la banque des conflits en général en informatique, merci :)

134voto

Grizzly Points 11329

Pour nvidia (et amd) processeurs, la mémoire locale est divisée en memorybanks. Chaque banque ne s'adresse qu'à un même ensemble de données à un moment, donc si un halfwarp essaie de charger/sauvegarder des données à partir de/à la même banque, l'accès doit être sérialisé (c'est une banque de conflit). Pour gt200 gpu il y a 16 banques (32banks de fermi), 16 ou 32 banques pour les gpu AMD (57xx ou plus: 32, tout ci-dessous: 16)), qui sont entrelacés avec un granuity de 32 bits (donc octet de 0 à 3 sont dans la banque 1, 4-7, dans la banque 2, ..., 64-69 dans la banque 1 et ainsi de suite). Pour une meilleure visualisation fondamentalement, ça ressemble à ça:

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 halfwarp accède successives 32bit valeurs il n'y a pas de banque de conflits. Une exception à cette règle (chaque thread doit avoir accès à ses propres de la banque) sont des émissions: Si tous les threads accèdent à la même adresse, la valeur n'est lu qu'une seule fois et diffusé à tous les threads (pour GT200 il faut que tous les threads dans le halfwarp accès à la même adresse, autant que je me souvienne de fermi et les gpu AMD peut le faire pour n'importe quel nombre de threads accèdent à la même valeur).

19voto

belwood Points 797

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 trouvent dans la même banque, vous obtenez un conflit de banque au cours duquel l'accès est effectué en série, perdant ainsi les avantages de l'accès parallèle.

16voto

Nitin Kunal Points 134

En termes simples, la banque conflit est un cas quand tout accès à la mémoire de modèle ne parvient pas à distribuer IO à travers les banques disponibles dans la mémoire du système. Les exemples suivants élabore le concept:-

Supposons que nous ayons deux dimensions 512x512 tableau d'entiers et de notre DRAM ou de la mémoire système 512 banques. Par défaut, le tableau de données sera mise en page d'une manière qui 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 de la banque numéro de y. Maintenant un peu de code (voir ci-dessous) commencer à accéder aux données dans la colonne à la mode majeur ie. changement de x tout en conservant y constant, le résultat final sera que tous consécutives d'accès à la mémoire sera frappé de la même banque, et donc de la banque des conflits.

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, généralement, sont évités par les compilateurs par la mise en mémoire du tableau ou en utilisant le premier nombre d'éléments dans le tableau.

12voto

Prashant M. Points 11

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

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

1voto

city Points 435

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 sur la mémoire de la banque. mais c'est un peu différent de ce qui est dit par @Grizzly. dans cette page, la banque est comme ça

la banque 1 2 3

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

espérons que cela aiderait

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X