Frage

Ich habe das Lesen der Programmieranleitung für CUDA und OpenCL, und ich kann nicht herausfinden, was für ein Bankkonflikt ist. Sie einfach irgendwie tauchen Sie ein in, wie das Problem zu lösen, ohne sich zu diesem Thema auszuarbeiten. Kann jemand mir helfen es verstehen? Ich habe keine Präferenz, wenn die Hilfe im Zusammenhang mit CUDA / OpenCL oder Bankkonflikten im Allgemeinen in der Informatik ist.

War es hilfreich?

Lösung

Für nvidia (und amd was das betrifft) GPUs der lokale Speicher in memorybanks unterteilt. Jede Bank kann nur Adresse einen Datensatz zu einem Zeitpunkt, also wenn ein halfwarp versucht, Lade- / Speicher-Daten von / zu der gleichen Bank des Zugang serialisiert werden muss (dies ist ein Bankkonflikt). Für GT200-GPUs gibt es 16 Bänke (32banks für Fermi), 16 oder 32 Bänke für AMD-GPUs (57xx oder höher: 32, alles unter: 16)), die mit einem granuity von 32-Bit-verschachtelt sind (so Byte 0-3 ist in 1 Bank, 4-7 in Bank 2, ..., 64-69 in Bank 1 und so weiter). Zur besseren Visualisierung sieht es im Grunde wie folgt:

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

Also, wenn jeder Thread in einem halfwarp aufeinanderfolgende 32-Bit-Zugriffe Werte gibt es keine Bankkonflikte. Eine Ausnahme von dieser Regel (jeder Thread muss seine eigene Bank Zugriff) sind Sendungen: Wenn alle Threads die gleiche Adresse zugreifen, wird der Wert nur einmal gelesen und an alle Threads übertragen (für GT200 es alle Fäden in der halfwarp Zugriff auf die gleiche Adresse sein muss, iirc fermi und AMD-GPUs können dies tun, für eine beliebige Anzahl von Threads Zugriff der gleiche Wert).

Andere Tipps

Der gemeinsame Speicher, die parallel zugegriffen werden kann, ist in Module unterteilt (auch Banken). Wenn zwei Speicherplatz (Adressen) in der gleichen Bank auftreten, dann erhalten Sie einen Bankkonflikt , in dem der Zugriff seriell durchgeführt wird, die Vorteile des parallelen Zugriff zu verlieren.

In einfachen Worten, Bankkonflikt ist ein Fall, wenn ein Speicherzugriffsmuster IO über Bänke in dem Speichersystem zu verteilen, schlägt fehl. Die folgenden Beispiele erarbeitet das Konzept: -

Nehmen wir an, wir haben zweidimensionale 512x512 Array von ganzen Zahlen und unser DRAM oder Speichersystem verfügt über 512 Banken in ihm. Standardmässig werden die Array-Daten in einer Weise, dass das Layout arr [0] [0] geht auf Bank 0, arr [0] [1] geht zu Bank 1, arr [0] [2] zu Bank 2 .... arr [0] [511] geht an Bank 511. verallgemeinert arr [x] [y] Banknummer y einnimmt. Jetzt sind einige Code starten (siehe unten) die Daten in Spalte großen Mode dh Zugriff. Ändern x während y konstant gehalten wird, dann wird das Endergebnis sein, dass jeder Zugriff aufeinander folgenden Speicher die gleiche Bank getroffen -. daher Konflikt Bank

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

Solche Probleme, in der Regel werden von Compilern vermieden, indem das Array unter Verwendung von Pufferung oder prime Anzahl von Elementen in dem Array.

(CUDA Jordanland Konflikt) Ich hoffe, dass dies dazu beitragen wird .. das ist sehr gut explaination ...

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

http://en.wikipedia.org/wiki/Memory_bank
und http://mprc.pku.cn/mentors /training/ISCAreading/1989/p380-weiss/p380-weiss.pdf

auf dieser Seite können Sie die Details an Speicherbank finden. aber es ist ein wenig anders aus, was durch @Grizzly gesagt wird. Diese Seite ist die Bank wie diese

Bank 1 2 3

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

hoffen, dass dies dazu beitragen würde

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top