"Zusammenführen" kann sich auch auf das Zusammenführen von Speicherzugriffsmustern beziehen . Bei dieser Verwendung wird unter Koaleszenz verstanden, dass sichergestellt wird, dass Threads gleichzeitig ausgeführt werden, und versucht wird, auf den Speicher in der Nähe zuzugreifen. Dies liegt normalerweise an:
- Der Speicher wird normalerweise in großen Blöcken aus dem RAM abgerufen.
- Einige Prozessoreinheiten versuchen, zukünftige Speicherzugriffe vorherzusagen und im Voraus zu zwischenspeichern, während ältere Teile des Speichers verarbeitet werden.
- Der Speicher wird in einer Hierarchie von Caches gespeichert, die nacheinander größer, aber langsamer sind.
Daher ist es wichtig, Programme zu erstellen, die vorhersagbare Speichermuster verwenden können. Noch wichtiger ist es bei einem Thread-Programm, damit die Speicheranforderungen nicht von vorne beginnen. Andernfalls wartet die Verarbeitungseinheit auf die Erfüllung von Speicheranforderungen.
Von der Einführung in die parallele Programmierung inspirierte Diagramme : Lektion 2 GPU-Hardware und parallele Kommunikationsmuster :
Unten: Vier Threads mit einheitlichem Speicherzugriff. Das schwarz gestrichelte Rechteck repräsentiert eine einzelne 4-Wort-Speicheranforderung.
Die Speicherzugriffe sind kurz und können in einem Durchgang / Block (oder der geringsten Anzahl von Anforderungen) abgerufen werden.
Wenn wir jedoch den " Schritt " des Zugriffs zwischen den Threads erhöhen , sind viel mehr Speicherzugriffe erforderlich. Unten: vier weitere Fäden mit zwei Schritten.
Hier sehen Sie, dass diese 4 Threads 2 Speicherblockanforderungen erfordern. Je kleiner der Schritt, desto besser. Je breiter der Schritt, desto mehr Anforderungen sind möglicherweise erforderlich.
Schlimmer als ein großer Speicherschritt ist natürlich ein zufälliges Speicherzugriffsmuster. Es wird nahezu unmöglich sein, diese zu pipelinen, zwischenzuspeichern oder vorherzusagen.
TikZ-Quellen: