Für nvidia (und auch für amd) gpus ist der lokale Speicher in Speicherbänke unterteilt. Jede Bank kann jeweils nur einen Datensatz adressieren. Wenn also ein Halfwarp versucht, Daten von / zu derselben Bank zu laden / zu speichern, muss der Zugriff serialisiert werden (dies ist ein Bankkonflikt). Für gt200 gpus gibt es 16 Bänke (32 Bänke für Fermi), 16 oder 32 Bänke für AMD gpus (57xx oder höher: 32, alles unter: 16)), die mit einer Körnigkeit von 32 Bit verschachtelt sind (also Byte 0-3 sind in Bank 1, 4-7 in Bank 2, ..., 64-69 in Bank 1 usw.). Für eine bessere Visualisierung sieht es im Grunde so aus:
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 |...
...
Wenn also jeder Thread in einem Halfwarp auf aufeinanderfolgende 32-Bit-Werte zugreift, gibt es keine Bankkonflikte. Eine Ausnahme von dieser Regel (jeder Thread muss auf seine eigene Bank zugreifen) sind Broadcasts: Wenn alle Threads auf dieselbe Adresse zugreifen, wird der Wert nur einmal gelesen und an alle Threads gesendet (für GT200 müssen alle Threads im Halfwarp auf die zugreifen Dieselbe Adresse, iirc fermi und AMD gpus können dies für eine beliebige Anzahl von Threads tun, die auf denselben Wert zugreifen.
Der gemeinsam genutzte Speicher, auf den parallel zugegriffen werden kann, ist in Module (auch Banken genannt) unterteilt. Wenn zwei Speicherorte (Adressen) in derselben Bank auftreten, tritt ein Bankkonflikt auf, bei dem der Zugriff seriell erfolgt, wodurch die Vorteile des parallelen Zugriffs verloren gehen.
quelle
Mit einfachen Worten, ein Bankkonflikt ist ein Fall, in dem ein Speicherzugriffsmuster keine E / A auf die im Speichersystem verfügbaren Banken verteilt. Die folgenden Beispiele erläutern das Konzept:
Nehmen wir an, wir haben ein zweidimensionales 512x512-Array von Ganzzahlen und unser DRAM- oder Speichersystem enthält 512 Bänke. Standardmäßig werden die Array-Daten so angeordnet, dass arr [0] [0] zu Bank 0, arr [0] [1] zu Bank 1, arr [0] [2] zu Bank 2 geht .... arr [0] [511] geht zur Bank 511. Um zu verallgemeinern, besetzt arr [x] [y] die Banknummer y. Jetzt beginnt ein Code (wie unten gezeigt) mit dem Zugriff auf Daten in der Hauptform der Spalte, d. H. Wenn Sie x ändern, während Sie y konstant halten, führt dies dazu, dass alle aufeinander folgenden Speicherzugriffe dieselbe Bank treffen - daher ein Bankkonflikt.
Solche Probleme werden normalerweise von Compilern vermieden, indem das Array gepuffert wird oder eine Primzahl von Elementen im Array verwendet wird.
quelle
(CUDA Bank Conflict) Ich hoffe, das wird helfen. Dies ist eine sehr gute Erklärung.
http://www.youtube.com/watch?v=CZgM3DEBplE
quelle
http://en.wikipedia.org/wiki/Memory_bank
und http://mprc.pku.cn/mentors/training/ISCAreading/1989/p380-weiss/p380-weiss.pdf
Auf dieser Seite finden Sie Details zur Speicherbank. aber es ist ein wenig anders als das, was @Grizzly sagt. Auf dieser Seite ist die Bank so
Bank 1 2 3
Adresse | 0, 3, 6 ... | | 1, 4, 7 ... | | 2, 5,8 ... |
hoffe das würde helfen
quelle