Frage

Eine Sache, ich habe nicht herausgefunden und Google hilft mir nicht, deshalb ist es möglich, Bank Konflikte mit Shared Memory zu haben, aber nicht in der globalen Speicher? Kann es Bank Konflikte mit Registern sein?

UPDATE Wow ich wirklich schätzen die beiden Antworten von Tibbit und Grizzly. Es scheint, dass ich nur wenn ein grünes Häkchen auf eine Antwort geben kann. Ich bin ziemlich neu Stack-Überlauf. Ich denke, ich habe als die beste Antwort zu holen. Kann ich etwas tun, danke zu sagen an die Antwort, die ich auf keinen grünen Haken geben?

War es hilfreich?

Lösung

Kurze Antwort:. Es sind keine Bank Konflikte in jedem globalen Speicher oder in den Registern

Erklärung:

Der Schlüssel zum Verständnis, warum ist die Granularität der Operationen zu erreichen. Ein einzelner Faden greift nicht auf den globalen Speicher. Globale Speicherzugriffe „verschmolzen“. Da die globale Speicher soo langsam ist, sind jeder Zugriff durch die Fäden innerhalb eines Blocks zusammengefasst als einige Anforderungen an den globalen Speicher wie möglich zu machen.

Gemeinsam genutzter Speicher gleichzeitig durch Threads zugegriffen werden. Wenn zwei Threads versuchen, eine Adresse innerhalb der gleichen Bank zuzugreifen, dies führt zu einem Bankkonflikt.

Die Register können von jedem Thread mit Ausnahme des einen zugegriffen werden, denen sie zugeordnet ist. Da Sie nicht auf meine Register lesen oder schreiben können, können Sie sperren mich nicht von ihnen Zugriff auf - daher gibt es keine Bank Konflikte

.

Wer & Schreib den globalen Speicher lesen kann?

Only blocks. Ein einzelner Thread kann einen Zugang zu machen, aber die Transaktion wird auf Blockebene verarbeitet werden (tatsächlich die Kette / Halb warp Ebene, aber ich versuche, nicht kompliziert sein). Wenn zwei Blöcke die gleichen Speicher zugreifen, ich glaube nicht, wird es länger dauern, und es kann durch die L1-Cache in den neuesten Geräten beschleunigt happen -. Obwohl dies nicht transparent ist evident

Wer & Schreiben auf gemeinsam genutzten Speicher lesen kann?

Any thread within a given block. Wenn Sie nur 1 Thread pro Block kann kein Bankkonflikt haben, aber Sie werden nicht angemessene Leistung haben. Bank Konflikte auftreten, da ein Block mit mehreren zugeordnet ist, sagen 512 Threads und sie sind alle wetteifern um verschiedene Adressen innerhalb der gleichen Bank (nicht ganz die gleiche Adresse). Es gibt einige ausgezeichnete Bilder dieser Konflikte am Ende des CUDA C Programming Guide - Abbildung G2, auf Seite 167 (eigentlich Seite 177 des pdf). Link zu Version 3.2

Wer & Schreiben in Register lesen kann?

Only the specific thread to which it is allocated. daher nur ein Thread es auf einmal zugreift.

Andere Tipps

Ob es auf eine bestimmte Art von Speicherbank Konflikte ist offensichtlich abhängig von der Struktur des Speichers und damit seinen Zweck erfüllt.

Warum also geteilt Speicher in einer Weise, die für die Bank Konflikte erlaubt?

Das ist relativ einfach, es ist nicht leicht, einen Speicher-Controller zu entwerfen, die gleichzeitig unabhängige Zugriffe auf den gleichen Speicher verarbeiten kann (durch die Tatsache bewiesen, dass die meisten nicht können). Also, um jeden Thread in einem halfwarp um den Zugang zu ermöglichen, ein individualy Wort adressierte der Speicher überhöht ist, mit einem unabhängigen Controller für jede Bank (zumindest das ist, wie man darüber nachdenkt, nicht sicher über die tatsächliche Hardware). Diese Banken sind verschachtelt, um sequentielle Threads machen den Zugriff auf sequentielle Speicher schnell. So wird jede dieser Banken im Idealfall eine Anfrage zu einem Zeitpunkt verarbeiten kann im halfwarp für parallele Ausführung aller Anfragen erlaubt (natürlich dieses Modell theoretisch eine höhere Bandbreite aufgrund der Unabhängigkeit dieser Banken aufrechterhalten kann, die auch ein Plus).

Was Register?

Die Register sind als Operanden für ALU-Befehle zugegriffen werden, das heißt, sie haben mit sehr geringer Latenz abgerufen werden. Deshalb bekommen sie mehr Transistoren / Bit das möglich zu machen. Ich bin nicht sicher, wie genau Register in modernen Prozessoren zugegriffen werden (nicht die Art von Informationen, die Sie brauchen oft und nicht so einfach zu erfahren). Aber es ist offensichtlich sehr unpraktisch wäre Register in Banken zu organisieren (für einfachere Architekturen finden Sie in der Regel alle Register auf einem großen Multiplexer hängen). Also nein, es wird keine Bank Konflikte für die Register sein.

Globale Speicher

Vor allem globalen Speicher arbeitet auf einem anderen granuality dann gemeinsam genutzten Speicher. Speicher zugegriffen wird in 32, 64 oder 128 Byte-Blöcke (für GT200 atleast, für fermi es 128B ist immer, aber im Cache gespeichert, AMD ist ein bisschen anders), wo jedes Mal wenn Sie etwas von einem Block der gesamte Block wollen zugegriffen / übertragen. Deshalb sollten Sie verschmolzenen Zugriffe müssen, denn wenn jeder Thread-Speicher von einem anderen Block zugreift, Sie haben alle Blöcke zu übertragen.

Aber wer sagt, es gibt keine Bankkonflikte? Ich bin mir nicht ganz sicher darüber, denn ich habe keine tatsächlichen Quellen fand diese für NVIDIA-Hardware zu unterstützen, aber es scheint logisch: Der globale Speicher ist in der Regel auf mehrere RAM-Chips verteilt (die sich leicht, indem man auf einem graphicscard prüft werden kann). Es wäre sinnvoll, wenn jeder dieser Chips wie eine Bank des lokalen Speichers ist, so würden Sie Bank Konflikte, wenn es mehrere gleichzeitige Anfragen auf derselben Bank sind. Allerdings würden die Auswirkungen weniger werden viel für eine Sache ausgesprochen (da die meisten der durch den Speicher verbraucht Zeitzugriffe ist die Latenzzeit, die Daten von A nach B sowieso zu bekommen), und es wird kein Effekt noticible „inside“ von einer Arbeitsgruppe sein (da nur ein halfwarp ausführt zu einem Zeitpunkt, und wenn das halfwarp Probleme mehr als eine Anfrage haben Sie einen uncoalesced Speicherzugriff, so dass Sie bereits einen Hit nehmen macht es schwer, die Auswirkungen dieses Konflikts zu messen. damit Sie nur Konflikte bekommen würde, wenn mehr Arbeitsgruppen versuchen, die gleiche Bank zugreifen. in der typischen Situation für GPGPU Sie eine große Datenmenge haben in sequentiellen Speichern liegt, so dass die Effekte nicht wirklich noticible sein sollten, da es genügend andere Arbeitsgruppen accessinng die anderen Bänke zur gleichen Zeit, aber es sollte möglich sein, Situationen zu konstruieren, wo die Datenmenge auf nur wenigen Banken zentriert ist, die für einen Hit auf Bandbreite (da die maximale Bandbreite kommen würde, würde von equaly Verteilung von Zugang auf alle Banken, so dass jede Bank würde o nly haben einen Bruchteil dieser Bandbreite). Ich habe wieder nichts lesen Sie diese Theorie für nvidia Hardware zu beweisen (meist alles konzentriert sich auf Koaleszenz, was natürlich noch wichtiger ist, da es sich hierbei um ein nonproblem für natürliche Datensätze macht). Jedoch nach dem ATI Stream gu Rechenide dies ist die Situation für Radeon-Karten (für 5xxx: Banken sind 2kb auseinander und Sie wollen sicherstellen, dass Sie Ihre Zugriffe (dh von allen worgroups Simultane aktiv) equaly über alle Banken verteilen), so dass ich, dass NVidia-Karten verhalten sich identisch wie sich vorstellen würde .

Natürlich für die meist scenarious die Möglichkeit der Bank Konflikte auf dem globalen Speicher ist kein Thema, so in der Praxis kann man sagen:

  • Uhr für koaleszierende beim Zugriff auf den globalen Speicher
  • Uhr für Bankkonflikte, wenn die lokalen Speicher zugreifen
  • Keine Probleme mit den Registern
  • Zugriff

mehrere Threads die gleiche Bank Zugriff bedeutet nicht unbedingt, es gibt einen Bankkonflikt. Es gibt einen Konflikt, wenn Threads zur gleichen Zeit aus einer anderen Zeile innerhalb derselben Bank lesen mögen.

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