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

J’ai lu le guide de programmation pour CUDA et OpenCL, et je n’arrive pas à comprendre ce qu’est un conflit bancaire. Ils se penchent simplement sur 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.

Pour 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 jeu de données à la fois. Si un halfwarp tente de charger / stocker des données depuis / vers la même banque, l’access doit être sérialisé (il s’agit d’un conflit bancaire). Pour gt200 gpus, il y a 16 banques (32banks pour fermi), 16 ou 32 banques pour les gpus AMD (57xx ou plus haut: 32, tout en dessous de: 16)). 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 dans un halfwarp accède à des valeurs 32 bits successives, il n’y a pas de conflit de banque. 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 est seulement lue une seule fois et diffusée à tous les threads (pour le GT200 Même adresse, iirc fermi et AMD gpus peuvent le faire pour n’importe quel nombre de threads accédant à 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) apparaissent dans la même banque, vous obtenez un conflit de banque au cours duquel l’access est effectué en série, perdant les avantages de l’access parallèle.

En termes simples, un conflit de banque est un cas où un modèle d’access à la mémoire ne parvient pas à dissortingbuer les E / S entre les banques disponibles dans le système de mémoire. Les exemples suivants développent le concept: –

Supposons que nous ayons un tableau à deux dimensions 512×512 d’entiers et que notre système DRAM ou mémoire comporte 512 banques. Par défaut, les données du tableau seront mises en forme de manière à ce que [0] [0] passe à la banque 0, arr [0] [1] passe à la banque 1, arr [0] [2] à la banque 2 …. arr [0] [511] passe à la banque 511. Généraliser arr [x] [y] occupe le numéro de banque y. Maintenant, certains codes (comme indiqué ci-dessous) commencent à accéder aux données en mode majeur de la colonne, à savoir. changer x tout en gardant y constant, le résultat final sera que tous les access mémoire consécutifs 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 mettant en mémoire tampon le tableau ou en utilisant un nombre premier d'éléments dans le tableau.

(Conflit Banque CUDA) J’espère que cela aidera .. c’est une très bonne explication …

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 le détail 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 … |

espère que cela aiderait