Latenztoleranz

Die Geschwindigkeit von Mikroprozessoren hat sich pro Jahrzehnt um mehr als den Faktor zehn erhöht, aber die Geschwindigkeit von Warenspeichern (DRAMs) hat sich nur verdoppelt, dh die Zugriffszeit wird halbiert. Daher wächst die Latenz des Speicherzugriffs in Bezug auf Prozessortaktzyklen in 10 Jahren um den Faktor sechs. Multiprozessoren verschärften das Problem.

In busbasierten Systemen erhöht die Einrichtung eines Busses mit hoher Bandbreite zwischen dem Prozessor und dem Speicher tendenziell die Latenz beim Abrufen der Daten aus dem Speicher. Wenn der Speicher physisch verteilt ist, wird die Latenz des Netzwerks und der Netzwerkschnittstelle zu der des Zugriffs auf den lokalen Speicher auf dem Knoten addiert.

Die Latenz wächst normalerweise mit der Größe der Maschine, da mehr Knoten mehr Kommunikation im Vergleich zur Berechnung, mehr Sprung im Netzwerk für die allgemeine Kommunikation und wahrscheinlich mehr Konflikte bedeuten. Das Hauptziel des Hardware-Designs besteht darin, die Latenz des Datenzugriffs zu reduzieren und gleichzeitig eine hohe, skalierbare Bandbreite beizubehalten.

Übersicht über die Latenztoleranz

Wie mit Latenztoleranz umgegangen wird, lässt sich am besten anhand der Ressourcen in der Maschine und ihrer Verwendung verstehen. Aus Prozessorsicht kann die Kommunikationsarchitektur von einem Knoten zum anderen als Pipeline betrachtet werden. Die Phasen der Pipeline umfassen Netzwerkschnittstellen an der Quelle und am Ziel sowie in den Netzwerkverbindungen und Switches auf dem Weg. Abhängig davon, wie die Architektur die Kommunikation verwaltet, gibt es auch Stufen in der Kommunikationsunterstützung, im lokalen Speicher- / Cache-System und im Hauptprozessor.

Das Nutzungsproblem in der Basiskommunikationsstruktur besteht darin, dass entweder der Prozessor oder die Kommunikationsarchitektur zu einem bestimmten Zeitpunkt ausgelastet ist, und in der Kommunikationspipeline ist jeweils nur eine Stufe besetzt, da das einzelne übertragene Wort seinen Weg von der Quelle zum Ziel findet. Ziel der Latenztoleranz ist es, die Nutzung dieser Ressourcen so weit wie möglich zu überlappen.

Latenztoleranz bei der expliziten Nachrichtenübermittlung

Die eigentliche Datenübertragung bei der Nachrichtenübermittlung erfolgt normalerweise vom Absender mithilfe einer Sendeoperation. Eine Empfangsoperation an sich motiviert nicht zur Kommunikation von Daten, sondern kopiert Daten aus einem eingehenden Puffer in den Adressraum der Anwendung. Die vom Empfänger initiierte Kommunikation erfolgt durch Ausgeben einer Anforderungsnachricht an den Prozess, der die Datenquelle darstellt. Der Prozess sendet die Daten dann über einen anderen Sendevorgang zurück.

Eine synchrone Sendeoperation hat eine Kommunikationslatenz, die der Zeit entspricht, die benötigt wird, um alle Daten in der Nachricht an das Ziel zu kommunizieren, der Zeit für die Empfangsverarbeitung und der Zeit für die Rückgabe einer Bestätigung. Die Latenz einer synchronen Empfangsoperation ist ihr Verarbeitungsaufwand; Dazu gehören das Kopieren der Daten in die Anwendung und die zusätzliche Latenz, wenn die Daten noch nicht eingetroffen sind. Wir möchten diese Latenzen, einschließlich Overheads, wenn möglich an beiden Enden verbergen.

Latenztoleranz in einem gemeinsam genutzten Adressraum

Die Basiskommunikation erfolgt durch Lesen und Schreiben in einem gemeinsam genutzten Adressraum. Der Einfachheit halber wird es als Lese- / Schreibkommunikation bezeichnet. Die vom Empfänger initiierte Kommunikation erfolgt mit Lesevorgängen, die dazu führen, dass auf Daten aus dem Speicher oder Cache eines anderen Prozessors zugegriffen wird. Wenn keine gemeinsamen Daten zwischengespeichert werden, kann die vom Absender initiierte Kommunikation durch Schreiben in Daten erfolgen, die in Remote-Speichern zugewiesen sind.

Bei der Cache-Kohärenz ist der Effekt von Schreibvorgängen komplexer: Entweder führt das Schreiben zu einer vom Sender oder vom Empfänger initiierten Kommunikation, abhängig vom Cache-Kohärenzprotokoll. Entweder vom Empfänger initiiert oder vom Sender initiiert, ist die Kommunikation in einem hardwaregestützten gemeinsam genutzten Lese- und Schreibadressraum von Natur aus feinkörnig, was die Toleranzlatenz sehr wichtig macht.

Blockieren Sie die Datenübertragung in einem gemeinsam genutzten Adressraum

In einem gemeinsam genutzten Adressraum kann entweder durch Hardware oder Software das Zusammenführen von Daten und das Initiieren von Blockübertragungen explizit im Benutzerprogramm oder transparent durch das System erfolgen. Explizite Blockübertragungen werden durch Ausführen eines Befehls initiiert, der einem Senden im Benutzerprogramm ähnelt. Der Sendebefehl wird durch den Kommunikationsassistenten erklärt, der die Daten in einer Pipeline vom Quellknoten zum Ziel überträgt. Am Ziel zieht der Kommunikationsassistent die Datenwörter von der Netzwerkschnittstelle ab und speichert sie an den angegebenen Orten.

Es gibt zwei Hauptunterschiede beim Weiterleiten von Sende- und Empfangsnachrichten, die sich beide aus der Tatsache ergeben, dass der Sendevorgang direkt die Programmdatenstrukturen angeben kann, in denen die Daten am Ziel platziert werden sollen, da sich diese Speicherorte im gemeinsam genutzten Adressraum befinden .

Weitergehen von Ereignissen mit langer Latenz in einem gemeinsam genutzten Adressraum

Wenn die Speicheroperation nicht blockierend ist, kann ein Prozessor nach einer Speicheroperation zu anderen Anweisungen übergehen. Bei Schreibvorgängen ist dies normalerweise recht einfach zu implementieren, wenn der Schreibvorgang in einen Schreibpuffer gestellt wird und der Prozessor fortfährt, während der Puffer sich darum kümmert, den Schreibvorgang an das Speichersystem auszugeben und seinen Abschluss nach Bedarf zu verfolgen. Der Unterschied besteht darin, dass im Gegensatz zu einem Schreibvorgang auf einen Lesevorgang im Allgemeinen sehr bald eine Anweisung folgt, die den vom Lesevorgang zurückgegebenen Wert benötigt.

Vorkommunikation in einem gemeinsam genutzten Adressraum

Die Vorkommunikation ist eine Technik, die in kommerziellen Mikroprozessoren bereits weit verbreitet ist und deren Bedeutung in Zukunft wahrscheinlich zunehmen wird. Ein Prefetch-Befehl ersetzt nicht das tatsächliche Lesen des Datenelements, und der Prefetch-Befehl selbst muss nicht blockierend sein, um sein Ziel zu erreichen, die Latenz durch Überlappung zu verbergen.

In diesem Fall werden die vorabgerufenen Daten in eine spezielle Hardwarestruktur gebracht, die als Vorabrufpuffer bezeichnet wird, da gemeinsam genutzte Daten nicht zwischengespeichert werden. Wenn das Wort in der nächsten Iteration tatsächlich in ein Register eingelesen wird, wird es eher aus dem Kopf des Vorabrufpuffers als aus dem Speicher gelesen. Wenn die Latenz zum Ausblenden viel größer wäre als die Zeit zum Berechnen der Einzelschleifeniteration, würden wir mehrere Iterationen vorab abrufen, und es wären möglicherweise mehrere Wörter gleichzeitig im Vorabrufpuffer vorhanden.

Multithreading in einem gemeinsam genutzten Adressraum

In Bezug auf das Ausblenden verschiedener Arten von Latenz ist hardwareunterstütztes Multithreading möglicherweise die vielseitige Technik. Es hat die folgenden konzeptionellen Vorteile gegenüber anderen Ansätzen -

  • Es erfordert keine spezielle Softwareanalyse oder Unterstützung.

  • Da es dynamisch aufgerufen wird, kann es unvorhersehbare Situationen wie Cache-Konflikte usw. ebenso wie vorhersehbare behandeln.

  • Wie beim Prefetching wird das Speicherkonsistenzmodell nicht geändert, da die Zugriffe innerhalb eines Threads nicht neu angeordnet werden.

  • Während die vorherigen Techniken darauf abzielen, die Speicherzugriffslatenz zu verbergen, kann Multithreading möglicherweise die Latenz eines Ereignisses mit langer Latenz genauso einfach verbergen, solange das Ereignis zur Laufzeit erkannt werden kann. Dies umfasst auch die Synchronisation und die Befehlslatenz.

Dieser Trend kann sich in Zukunft ändern, da die Latenzen im Vergleich zur Prozessorgeschwindigkeit immer länger werden. Auch mit komplexeren Mikroprozessoren, die bereits Methoden bereitstellen, die für Multithreading erweitert werden können, und mit der Entwicklung neuer Multithreading-Techniken, um Multithreading mit Parallelität auf Befehlsebene zu kombinieren, scheint sich dieser Trend in Zukunft sicherlich zu ändern.