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 :)
Réponses
Trop de publicités?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).
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.
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.
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