Die Klingel.

Es gibt diejenigen, die diese Nachricht vor Ihnen gelesen haben.
Abonnieren Sie Artikel frisch.
Email
Name
Nachname
Wie willst du die Glocke lesen?
Ohne spam.

Saul. 9. September 2015 um 13:38 Uhr

Implementierung von Multi-Thread-Architektur gaming Engine.

  • Intel's Blog.
  • Spielentwicklung
  • Parallelprogrammierung.
  • Webseitenentwicklung
  • Transfer

Mit dem Aufkommen von Multi-Core-Prozessoren war es notwendig, eine Spielmaschine auf der Grundlage der parallelen Architektur zu erstellen. Die Verwendung aller Systemprozessoren - sowohl Grafik (GP) als auch der zentralen (CPU) - eröffnet wesentlich mehr Möglichkeiten im Vergleich zu einem Ein-Gewindemotor auf der Grundlage von nur GP. Wenn Sie beispielsweise mit mehr CPU-Kernen verwenden, können Sie beispielsweise visuelle Effekte verbessern, indem Sie die Anzahl der im Spiel verwendeten physischen Objekte erhöhen sowie ein realistisches Verhalten von Charakteren durch die Implementierung der fortschrittlichen künstlichen Intelligenz (AI) erreichen.
Berücksichtigen Sie die Merkmale der Implementierung der Multi-Thread-Architektur der Spielemotor.

1. Einleitung

1.1. Überblick

Mit der Multi-Thread-Architektur des Game-Motors können Sie die Funktionen aller Plattformprozessoren auf das Maximum nutzen. Es beinhaltet parallele, verschiedene Funktionsblöcke auf allen verfügbaren Prozessoren auszuführen. Es ist jedoch nicht so einfach, ein ähnliches Schema zu implementieren. Separate Elemente des Spielmotors interagieren oft miteinander, was zum Erscheinungsbild von Fehlern führen kann, während gleichzeitig ausgeführt werden. Zur Verarbeitung solcher Szenarien im Motor werden spezielle Datensynchronisationsmechanismen bereitgestellt, die ausschließen mögliche Blockierung. Es senkt auch Methoden zur gleichzeitigen Datensynchronisation, wodurch die Ausführungszeit minimiert werden kann.

Um die dargestellten Materialien zu verstehen, müssen Sie gut in modernen Methoden zur Erstellung von Computerspielen verstehen, das Multithreading für Spielmotoren unterstützt oder die Anwendungsleistung insgesamt verbessert.

2. Paralleler Ausführungsstatus

Der Zustand der parallelen Ausführung ist das Schlüsselkonzept von Multithreading. Nur durch Teilung der Spielmaschine auf einzelne Systeme, die jeweils in ihrem Modus laufen und praktisch nicht mit dem Rest des Motors nicht interagieren, kann man die größte Wirksamkeit der parallelen Rechenrechnung erreichen und die für die Synchronisierung erforderliche Zeit reduzieren. Einzelne Teile des Motors vollständig isolieren, um alle gängigen Ressourcen zu entfernen, ist nicht möglich. Für Operationen, wie beispielsweise Daten in der Position oder der Orientierung von Objekten, können einzelne Systeme lokale Datenkopien verwenden und nicht gemeinsam genutzte Ressourcen verwenden. Dadurch können Sie die Abhängigkeit der Daten in verschiedenen Teilen des Motors minimieren. Benachrichtigungen über Änderungen in den allgemeinen Daten, die von einem separaten System ausgeführt werden, werden an den staatlichen Manager übermittelt, der sie in die Warteschlange stellt. Dies wird als Messaging-Modus bezeichnet. In diesem Modus wird davon ausgegangen, dass das Motorsystem durch Abschluss der Taskausführung Benachrichtigungen über Änderungen empfängt und ihre internen Daten entsprechend aktualisieren. Ein solcher Mechanismus ermöglicht es, die Synchronisationszeit und die Abhängigkeit der Systeme voneinander erheblich zu reduzieren.

2.1 Leistungsstaaten

Damit der Execution State Manager effektiv funktioniert, wird empfohlen, die Vorgänge auf einem bestimmten Taktimpuls synchronisieren. Dadurch können alle Systeme gleichzeitig arbeiten. In diesem Fall sollte die Frequenz der Takte nicht notwendigerweise der Bildrate entsprechen. Ja, und die Dauer der Uhr hängt möglicherweise nicht von der Frequenz ab. Es kann so gewählt werden, dass eine Takt dem Zeitpunkt entspricht, der zum Übertragen eines Rahmens (unabhängig von seiner Größe) erforderlich ist. Mit anderen Worten, die Frequenz oder Dauer der Uhren bestimmt die spezifische Implementierung des staatlichen Managers. Abbildung 1 zeigt "frei" schritt-für-Schritt-Modus Arbeit, in der nicht erforderlich ist, dass alle Systeme die Ausführung der Operation für denselben Takt abgeschlossen haben. Der Modus, in dem alle Systeme die Ausführung von Vorgängen für eine Uhr abschließen, wird als "harter" Schritt-für-Schritt-Modus bezeichnet. Es ist schematisch in Abbildung 2 dargestellt.


Abbildung 1. Leistungsstatus im freien Schritt-für-Schritt-Modus

2.1.1. Kostenloser Schritt-für-Schritt-Modus
Im kostenlosen Schritt-für-Schritt-Modus arbeiten alle Systeme kontinuierlich für einen vorbestimmten Zeitraum, der erforderlich ist, um den nächsten Abschnitt der Berechnungen abzuschließen. Der Name "Free" sollte jedoch nicht buchstäblich verstanden werden: Die Systeme werden nicht mit einem willkürlichen Zeitpunkt synchronisiert, sie sind nur "frei", wenn sie nur die Anzahl der Uhren, die erforderlich sind, um die nächste Stufe erforderlich zu sein.
In der Regel reicht es in diesem Modus nicht aus, eine einfache Benachrichtigung der Statusänderung an den staatlichen Manager zu senden. Sie müssen auch die aktualisierten Daten übertragen. Dies ist darauf zurückzuführen, dass das System, das die allgemeinen Daten geändert hat, sich im Ausführungszustand befinden kann, während ein anderes System, das auf diese Daten wartet, bereits aktualisiert ist. In diesem Fall ist mehr Speicher erforderlich, da Sie mehr Daten erstellen müssen. Daher kann das "freie" Regime für alle Anlässe nicht als universelle Lösung angesehen werden.
2.1.2. HARD-Schritt-für-Schritt-Modus
In diesem Modus werden die Aufgaben aller Systeme in einer Uhr abgeschlossen. Ein solcher Mechanismus ist einfacher zu implementieren und erfordert nicht die Übertragung der aktualisierten Daten zusammen mit der Benachrichtigung. In der Tat kann ein System bei Bedarf einfach neue Werte in einem anderen System anfordern (natürlich am Ende des Ausführungszyklus).
Im schweren Modus können Sie einen Schritt-für-Schritt-Modus des Pseudo-Grades implementieren, der die Berechnung zwischen verschiedenen Schritten verteilt. Dies kann insbesondere für die Berechnungen des AI erforderlich sein, wobei der erste Takt durch das anfängliche "gemeinsame Ziel" berechnet wird, das in den folgenden Stufen schrittweise spezifiziert wird.


Abbildung 2. Leistungsstatus im harten Schritt-für-Schritt-Modus

2.2. Datensynchronisation.

Ändern der allgemeinen Daten durch mehrere Systeme können zu einem Änderungskonflikt führen. In diesem Fall ist es im Messaging-System erforderlich, einen Algorithmus zur Auswahl des richtigen Endwerts bereitzustellen. Es gibt zwei Hauptansätze, die auf den folgenden Kriterien basieren.
  • Zeit: Der Endwert wird zur letzten Änderung.
  • PRIORITÄT: Der Endwert wird zur Änderung des Systems mit größter Priorität. Wenn die Priorität der Systeme übereinstimmt, können Sie auch die Zeit der Änderungen berücksichtigen.
Alle veralteten Daten (gemäß einem der Kriterien) können einfach überschreiben oder von der Benachrichtigungswarteschlange ausgeschlossen sein.
Da der Endwert von dem Verfahren zur Änderung von Änderungen abhängen kann, können die relativen Werte der allgemeinen Daten sehr schwierig sein. In solchen Fällen sollten die absoluten Werte verwendet werden. Beim Aktualisieren lokaler Daten kann das System dann einfach die alten Werte ersetzen. Die optimale Lösung besteht darin, abhängig von der jeweiligen Situation absolute oder relative Werte zu wählen. Zum Beispiel müssen allgemeine Daten, wie Position und Orientierung, absolute Werte verfügen, da sie für das Verfahren zur Änderung wichtig sind. Relative Werte können beispielsweise für das Partikelerzeugungssystem verwendet werden, da alle Informationen über Partikel nur darin selbst gespeichert sind.

3. Motor.

Bei der Entwicklung eines Motors liegt der Fokus auf der Flexibilität, die erforderlich ist, um seine Funktionalität weiter auszubauen. Dadurch wird es zur Verwendung bei Bedingungen bestimmter Einschränkungen (zum Beispiel Speicher) optimiert.
Der Motor kann in zwei Teile unterteilt werden: Frameworks und Manager. Das Framework (siehe Abschnitt 3.1) enthält Teile des Spiels, die während des Ausführungsprozesses repliziert werden, dh in mehreren Kopien existieren. Es enthält auch Elemente, die an der Implementierung des Hauptspielzyklus beteiligt sind. Manager (siehe Abschnitt 3.2) sind Singleton-Objekte, die für die Durchführung der logischen Komponente des Spiels verantwortlich sind.
Unten ist ein Schema einer Spielmaschine.


Abbildung 3. Allgemeine Motorarchitektur

Bitte beachten Sie, dass funktionale Spielmodule oder -systeme nicht Teil des Motors sind. Der Motor kombiniert sie nur zwischen sich selbst, was als Bindemittel wirkt. Eine ähnliche modulare Organisation ermöglicht es, die Systeme nach Bedarf hochzuladen und zu entladen.

Die Wechselwirkung des Motors und der Systeme erfolgt mit Schnittstellen. Sie sind so umgesetzt, dass sie den Motorzugriff auf Systemfunktionen und Systeme - an Motormanager bereitstellen.
Detailliertes Motorschema wird in Anhang A, "Verschiebungsschema" dargestellt.

In der Tat sind alle Systeme unabhängig voneinander (siehe Abschnitt 2, der "Status der gleichzeitigen Ausführung"), dh sie können Aktionen parallel ausführen, ohne den Betrieb anderer Systeme zu beeinträchtigen. Jede Datenänderung beinhaltet jedoch bestimmte Schwierigkeiten, da die Systeme miteinander interagieren müssen. Der Informationsaustausch zwischen Systemen ist in den folgenden Fällen erforderlich:

  • um ein anderes System zum Ändern von gemeinsamen Daten zu informieren (z. B. Position oder Orientierung von Objekten);
  • um die Funktionen auszuführen, die für dieses System nicht verfügbar sind (zum Beispiel, bezieht sich das AI-System auf das System der Berechnung der geometrischen oder physikalischen Eigenschaften des Objekts, um einen Test für die Kreuzung der Strahlen auszuführen).
Im ersten Fall kann der im vorherige Abschnitt beschriebene Status-Manager zur Verwaltung von Informationen verwendet werden. (Weitere Informationen zum staatlichen Manager finden Sie in Abschnitt 3.2.2, "State Manager".)
Im zweiten Fall ist es erforderlich, einen speziellen Mechanismus umzusetzen, der die Dienste eines Systems ermöglicht, das andere zu verwenden. Gesamte Beschreibung Dieser Mechanismus ist in Abschnitt 3.2.3, "Service Manager" angegeben.

3.1. Freymvork.

Das Framework dient dazu, alle Elemente des Motors zusammenzuführen. Es initialisiert den Motor mit Ausnahme von Managern, deren Instanzen global erstellt werden. Es speichert auch die Informationen über die Szene. Um eine größere Flexibilität zu erreichen, wird die Szene als sogenannte Universalszene implementiert, die universelle Objekte enthält. Sie sind Behälter, die verschiedene Funktionsteile der Szene kombinieren. Einzelheiten finden Sie in Abschnitt 3.1.2.
Der Hauptspielzyklus ist auch im Rahmen umgesetzt. Es kann schematisch wie folgt eingereicht werden.


Abbildung 4. Hauptspielzyklus

Der Motor läuft in der Fensterumgebung, sodass Sie im ersten Schritt des Spielzyklus alle unvollendeten Fenster des Betriebssystems verarbeiten müssen. Wenn dies nicht der Fall ist, antwortet der Motor nicht auf OS-Nachrichten. Im zweiten Schritt weist der Planer Aufgaben mit dem Task-Manager zu. Dieser Prozess wird in Abschnitt 3.1.1 unten ausführlich beschrieben. Danach sendet der staatliche Manager (siehe Abschnitt 3.2.2) Informationen zu den von den Maschinensystemen vorgenommenen Änderungen, auf die es sich auswirken kann. Im letzten Schritt bestimmt das Framework abhängig vom Ausführungsstatus, ob der Betrieb des Motors beispielsweise zur nächsten Szene abgeschlossen oder fortgesetzt werden soll. Informationen zum Zustand des Motors werden im Medium Manager gespeichert. Einzelheiten finden Sie in Abschnitt 3.2.4.

3.1.1. Planer
Der Planer erzeugt ein Referenztaktsignal mit einer bestimmten Frequenz. Wenn der Referenztestmodus erforderlich ist, dass der nächste Vorgang unmittelbar nach Abschluss des vorherigen beginnt, ohne auf das Ende des Taktes zu warten, kann die Frequenz unbegrenzt sein.
Durch ein Taktsignal übersetzt der Scheduler mit dem Task-Manager das System in den Ausführungsmodus. Im kostenlosen Schritt-für-Schritt-Modus (Abschnitt 2.1.1) fragt der Planer das System, um zu bestimmen, wie viele Uhren es benötigt wird, um die Aufgabe abzuschließen. Nach den Ergebnissen der Umfrage bestimmt der Scheduler, welche Systeme zur Ausführung bereit sind und die Arbeit in einer bestimmten Uhr abgeschlossen werden. Der Scheduler kann die Anzahl der Uhren ändern, wenn ein System mehr Zeit zum Ausführen erfordert. Im ersten Schritt-für-Schritt-Modus (Abschnitt 2.1.2) beginnen alle Systeme die Ausführung derselben Uhr, sodass der Scheduler wartet, wenn alle Systeme abgeschlossen sind.
3.1.2. Universelles Szene und Gegenstände
Die universelle Szene und Objekte sind Behälter für Funktionalität, die in anderen Systemen implementiert sind. Sie sind ausschließlich zum Interagieren mit dem Motor gedacht und führen keine anderen Funktionen aus. Sie können jedoch erweitert werden, um Funktionen zu verwenden, die anderen Systemen zur Verfügung stehen. Dadurch können Sie schwache Verbundenheit erreichen. In der Tat können die universelle Szene und Objekte die Eigenschaften anderer Systeme verwenden, ohne an sie gebunden zu sein. Es ist diese Eigenschaft, die die Abhängigkeit der Systeme voneinander ausschließt und ihnen die Möglichkeit gibt, gleichzeitig zu arbeiten.
Das folgende Diagramm zeigt die Erweiterung einer universellen Szene und eines Objekts.


Abbildung 5. Erweiterung der universellen Szene und des Objekts

Betrachten Sie den Grundsatz des Betriebs der Erweiterungen im folgenden Beispiel. Angenommen, die Erweiterung der universellen universellen Szene der Szene wird auf die Verwendung grafischer, physischer und anderer Eigenschaften erweitert. In diesem Fall wird der "grafische" Teil der Erweiterung für die Initialisierung des Displays verantwortlich sein, und für die Umsetzung von physikalischen Gesetzen für Festkörper, wie beispielsweise der Schwerkraft, ist der "physische" Teil. Die Szenen enthalten Objekte, so dass die universelle Szene auch mehrere universelle Objekte enthält. Universalobjekte können auch erweitert werden, um die Verwendung von grafischen, physischen und anderen Eigenschaften zu verwenden. Beispielsweise wird die Objektzeichnung auf dem Bildschirm durch grafische Verlängerungsfunktionen implementiert, und die Berechnung der Wechselwirkung von Festkörpern ist physisch.

Das detaillierte Schema der Wechselwirkung des Motors und der Systeme ist in Anhang B, dem "Engine Interaction Schema" angegeben.
Es sei darauf hingewiesen, dass die universelle Szene und das Universalobjekt für die Registrierung aller seiner "Erweiterungen" im staatlichen Manager verantwortlich sind, sodass alle Erweiterungen Benachrichtigungen über Änderungen von anderen Erweiterungen (dh von anderen Systemen) erhalten können. Als Beispiel können Sie eine grafische Erweiterung zitieren, die registriert ist, um Benachrichtigungen über Änderungen in der Position und Orientierung, die von der physischen Expansion ausgeführt wird, zu erhalten.
Einzelheiten zu Systemkomponenten finden Sie in Abschnitt 5.2, "Systemkomponenten".

3.2. Manager.

Manager verwalten die Arbeit des Motors. Sie sind Singleton-Objekte, dh der Manager jedes Typs ist nur in einer Instanz verfügbar. Dies ist notwendig, da die Vervielfältigung von Ressourcen von Führungskräften zwangsläufig zu Redundanzen führen wird und die Leistung beeinträchtigt. Darüber hinaus sind Manager für die Implementierung von gemeinsamen Funktionen für alle Systeme verantwortlich.
3.2.1. Taskmanager
Der Task-Manager ist für die Verwaltung von Systemaufgaben im Flow Pool verantwortlich. Um eine optimale N-Multiple-Skalierung zu gewährleisten und unnötige Ströme zu verhindern, wodurch nicht rechtfertigte Kosten zum Umschalten der Aufgaben im Betriebssystem entfernt werden, erstellt der Flow Pool in jedem Prozessor einen Thread.

Der Scheduler sendet die Aufgabenliste an den Task-Manager zur Ausführung sowie Informationen zum Abschluss der, welche Aufgaben gewartet werden müssen. Er empfängt diese Daten aus verschiedenen Systemen. Jedes System erhält nur eine Aufgabe zur Ausführung. Diese Methode wird als funktionelle Zersetzung bezeichnet. Für die Datenverarbeitung kann jedoch jede solche Aufgabe in eine beliebige Menge an Unteraufgaben (Datenzersetzung) unterteilt werden.
Nachfolgend finden Sie ein Beispiel für die Aufgabenverteilung zwischen den Threads für das Quad-Core-System.


Abbildung 6. Beispiel des vom Task-Manager verwendeten Flow-Pools

Zusätzlich zur Verarbeitung der Scheduler-Anforderungen für den Zugriff auf die Hauptaufgaben kann der Task-Manager im Initialisierungsmodus arbeiten. Es fragt konsistent die Systeme aus jedem Thread, so dass sie lokale Datenlager initialisieren können, die für die Arbeit notwendig sind.
Tipps zum Implementieren des Task-Managers finden Sie in Anhang D, "Tipps zur Implementierung von Aufgaben".

3.2.2. Staatsmanager
Der Status-Manager ist Teil des Messaging-Mechanismus. Es verfolgt Änderungen und sendet Benachrichtigungen über sie an alle Systeme, die diese Änderungen beeinflussen können. Um nicht unnötige Benachrichtigungen zu senden, speichert der Status Manager Informationen, auf denen Systeme in einem bestimmten Fall benachrichtigt werden können. Dieser Mechanismus ist auf der Grundlage der Vorlage "Observer" (siehe Anhang C, "Observer (Design Template)") implementiert. Wenn Sie kurz sprechen, diese Vorlage Es nimmt die Verwendung des "Observer" an, der durch alle Änderungen des Subjekts überwacht wird, und die Medienrolle zwischen ihnen führt den Änderungsregler aus.

Der Mechanismus funktioniert wie folgt. 1. Der Beobachter meldet den Änderungscontroller (oder den staatlichen Manager), Änderungen an welchen Themen, an denen er verfolgen möchte. 2. Das Betreff informiert den Controller über alle ihre Änderungen. 3. Im Rahmensignal benachrichtigt der Controller den Beobachter über die Änderungen des Subjekts. 4. Der Observer sendet eine Anforderung, um aktualisierte Daten zu erhalten.

Im freien Schritt-für-Schritt-Ausführungsmodus (siehe Abschnitt 2.1.1) ist die Implementierung dieses Mechanismus etwas kompliziert. Zunächst müssen die aktualisierten Daten mit der Änderungsbenachrichtigung gesendet werden. In diesem Modus ist das Senden auf Anfrage nicht anwendbar. In der Tat, wenn zum Zeitpunkt des Empfangs der Anforderung das für Änderungen zuständige System nicht die Ausführung abschließt, kann er keine aktualisierten Daten bereitstellen. Zweitens, wenn ein System noch nicht bereit ist, Änderungen am Ende der Uhr vorzunehmen, muss der Status-Manager die modifizierten Daten halten, bis das gesamte System registriert ist, um sie zu erhalten, in den Bereitschaftszustand.

Im Rahmen gibt es zwei staatliche Manager dafür: Um Änderungen auf dem Szenenebene und auf der Objektebene zu handhaben. In der Regel sind Nachrichten, die sich auf Szenen und Objekte beziehen, unabhängig voneinander, so dass die Verwendung von zwei separaten Managern die Notwendigkeit beseitigt, unnötige Daten zu verarbeiten. Wenn jedoch in der Szene den Status eines Objekts berücksichtigt werden muss, kann es registriert werden, um den Empfang von Benachrichtigungen über seine Änderungen zu erhalten.

Um keine unnötige Synchronisierung durchzuführen, generiert der staatliche Manager eine Warteschlange von Änderungsbenachrichtigungen für jeden vom Task-Manager erstellten Strom. Beim Zugriff auf die Warteschlange ist daher keine Synchronisation erforderlich. Abschnitt 2.2 beschreibt ein Verfahren, mit dem die Warteschlangen nach der Ausführung kombiniert werden können.


Abbildung 7. Benachrichtigung über interne Änderungen des Universalobjekts

Änderungsbenachrichtigungen ändern sind nicht erforderlich, um sequentiell zu senden. Es gibt einen Weg ihres parallelen Mailings. Wenn Sie eine Aufgabe ausführen, arbeitet das System mit allen seinen Objekten zusammen. Wenn beispielsweise physische Objekte miteinander interagieren, steuert das physische System sie zum Bewegen, Berechnen der neuen Kräfte usw. Beim Empfang von Benachrichtigungen interagiert das Systemobjekt nicht mit anderen Objekten seines Systems. Es interagiert mit den damit verbundenen Erweiterungen. Dies bedeutet, dass universelle Objekte nun unabhängig voneinander sind und gleichzeitig aktualisiert werden können. Dieser Ansatz schließt extreme Fälle nicht aus, die während des Synchronisationsprozesses berücksichtigt werden sollten. Es ermöglicht jedoch die Verwendung des parallelen Ausführungsmodus, wenn er schien, dass es nur in Serien möglich war.

3.2.3. Dienstleistungsmanager
Der Service Manager bietet Systeme Zugriff auf die Funktionen anderer Systeme, die ansonsten nicht verfügbar sein könnten. Es ist wichtig zu verstehen, dass der Zugriff auf Funktionen mit Schnittstellen und nicht direkt durchgeführt wird. Informationen zu Systemschnittstellen werden auch im Service-Manager aufbewahrt.
Um die Abhängigkeiten der Systeme voneinander zu beseitigen, hat jeder von ihnen nur kleines Set Dienstleistungen. Darüber hinaus wird die Möglichkeit der Verwendung eines Dienstes nicht vom System selbst bestimmt, sondern der Manager der Dienste.


Abbildung 8. Beispiel-Services-Manager

Der Service Manager hat ein anderes Feature. Es bietet Systeme Zugriff auf die Eigenschaften anderer Systeme. Eigenschaften werden als spezifische Werte spezifischer Systeme bezeichnet, die nicht im Messaging-System übertragen werden. Dies kann eine Erweiterungsbildschirmauflösung im Grafiksystem oder den Wert der Schwerkraft in physischer Bedeutung sein. Der Services Manager öffnet den Zugriff auf solche Daten, erlaubt es ihnen jedoch nicht, sie direkt zu kontrollieren. Es stellt Änderungen in Eigenschaften in einer besonderen Kurve und veröffentlicht sie erst nach konstanter Ausführung. Bitte beachten Sie, dass der Zugriff auf die Eigenschaften eines anderen Systems selten genug ist und nicht missbraucht werden sollte. Beispielsweise kann es erforderlich sein, den Frame-Mesh-Modus in dem Grafiksystem des Konsolenfensters zu aktivieren und zu trennen, oder um die Bildschirmauflösung auf Anforderung des Players von der Benutzeroberfläche zu ändern. Diese Funktion wird hauptsächlich verwendet, um Parameter einzustellen, die sich nicht von Frame to Frame ändern.

3.2.4. Umweltmanager
  • Der Medium Manager gewährleistet den Betrieb der Motorabwicklungsumgebung. Seine Funktionen können in die folgenden Gruppen unterteilt werden.
  • Variablen: Namen und Werte der gemeinsamen Variablen, die von allen Teilen des Motors verwendet werden. Typischerweise sind variable Werte definiert, wenn die Szene geladen oder bestimmte benutzerdefinierte Einstellungen enthält. Der Motor und verschiedene Systeme können auf sie zugreifen, indem Sie die entsprechende Anfrage senden.
  • Ausführung: Ausführungsdaten, z. B. Abschluss der Ausführung der Szene oder des Programms. Diese Parameter können sowohl die Systeme als auch den Motor anfordern und anfragen.
3.2.5. Platform Manager
Der Platform Manager implementiert die Abstraktion für die Herausforderungen des Betriebssystems und bietet zusätzlich zur einfachen Abstraktion zusätzliche Funktionalität. Der Vorteil dieses Ansatzes ist die Einkapselung mehrerer typischer Funktionen innerhalb eines einzelnen Anrufs. Das heißt, sie müssen nicht separat für jedes verursachte Element implementiert werden, um seine Details zu OS-Anrufen überlastet.
Betrachten Sie als Beispiel den Platform-Manager, um die dynamische Systembibliothek herunterzuladen. Es lädt das System nicht nur, sondern empfängt auch die Einstiegspunkte der Funktion und verursacht die Bibliotheksinitialisierungsfunktion. Der Manager speichert auch den Bibliotheksdeskriptor und entlädt sie nach Abschluss der Operation.

Der Platform Manager ist auch dafür verantwortlich, Informationen zu einem Prozessor bereitzustellen, z. B. von SIMD-Anweisungen unterstützt und eine bestimmte Betriebsart von Prozessen initialisiert. Es können keine anderen Funktionen zur Bildung von Systemanfragen nicht verwendet werden.

4. Schnittstellen

Schnittstellen sind Mittel zur Interaktion zwischen Rahmen, Managern und Systemen. Framing und Manager sind Teil des Motors, so dass sie direkt miteinander interagieren können. Systeme zum Motor gehören nicht. Darüber hinaus führen sie alle unterschiedliche Funktionen aus, was dazu führt, dass sie eine einzige Wechselwirkungsmethode mit ihnen erstellen müssen. Da Systeme nicht direkt mit Managern interagieren können, ist es erforderlich, eine andere Zugriffsmethode für sie bereitzustellen. In diesem Fall müssen nicht alle Funktionen der Manager für Systeme offen sein. Einige von ihnen sind nur verfügbare Rahmenbedingungen.

Schnittstellen definieren eine Reihe von Funktionen, die zur Verwendung erforderlich sind standardmethode Zugriff. Es beseitigt den Rahmen von der Notwendigkeit, die Details der Implementierung bestimmter Systeme kennenzulernen, da er nur mit einem bestimmten Satz von Anrufen mit ihnen interagieren kann.

4.1. Schnittstellen Subjekt und Beobachter

Der Hauptzweck der Themen- und Beobachter-Schnittstellen ist die Registrierung, in der Beobachter die Benachrichtigungen der Themen ändern sowie solche Benachrichtigungen senden. Registrierung und Bruch der Kommunikation mit einem Beobachter sind Standardfunktionen für alle in der Implementierung ihrer Schnittstelle enthaltenen Fächer.

4.2. Schnittstellenmanager.

Manager sind trotz der Tatsache, dass sie Singleton-Objekte sind, direkt nur für den Rahmen verfügbar. Andere Systeme können nur über Schnittstellen auf Manager zugreifen, die nur einen Teil ihrer Gesamtfunktionalität darstellen. Nach der Initialisierung wird die Schnittstelle an ein System übermittelt, das es verwendet, um mit bestimmten Manager-Funktionen zu arbeiten.
Es gibt keine einzige Schnittstelle für alle Manager. Jeder von ihnen hat eine eigene separate Schnittstelle.

4.3. Systemschnittstellen

Um den Rahmen für den Zugriff auf die Systemkomponenten zu gestalten, benötigt er Schnittstellen. Ohne sie unterstützen neues System Der Motor müsste separat umgesetzt werden.
Jedes System enthält vier Komponenten, daher müssen Schnittstellen vier sein. Nämlich: System, Szene, Objekt und Aufgabe. Detaillierte Beschreibung Siehe Abschnitt 5, "Systeme". Schnittstellen sind Werkzeuge, um Zugriff auf Komponenten zu erhalten. Systemschnittstellen ermöglichen es Ihnen, Szenen zu erstellen und zu löschen. Mit den Szenenschnittstellen können Sie wiederum Objekte erstellen und zerstören sowie Informationen über die Hauptaufgabe des Systems anfordern. Die Task-Schnittstelle wird hauptsächlich vom Task-Manager verwendet, wenn Sie Aufgaben im Flow-Pool einstellen.
Da die Szene und das Objekt als Teil des Systems miteinander interagieren müssen, müssen ihre Schnittstellen auch anhand von Subjekt- und Beobachter-Schnittstellen miteinander miteinander interagieren und mit einer universellen Szene und dem Objekt, an das sie gebunden sind.

4.4. Schnittstellen ändern sich

Diese Schnittstellen dienen zur Übertragung von Daten zwischen Systemen. Alle Systeme, die Änderungen an einem bestimmten Typ vornehmen, müssen eine solche Schnittstelle implementieren. Als Beispiel können Sie Geometrie mitbringen. Die Geometrieschnittstelle enthält Verfahren zum Bestimmen der Position, des Orientierungs- und Skalenelements. Jedes System, das Änderungen an der Geometrie vornimmt, muss eine solche Schnittstelle implementieren, sodass keine anderen Systeme auf den Zugriff auf die geänderten Daten auftreten.

5. Systeme

Systeme sind Teil des Motors, der für die Implementierung der Gaming-Funktionalität verantwortlich ist. Sie führen alle wichtigen Aufgaben aus, ohne die der Motor nicht sinnvoll ist. Die Wechselwirkung zwischen Motor und Systeme erfolgt mit Schnittstellen (siehe Abschnitt 4.3, "Systemschnittstellen"). Es ist notwendig, die Motorinformationen nicht überlastet verschiedene Typen Systeme. Dank der Schnittstellen wird der Prozess des Hinzufügens eines neuen Systems viel einfacher, da der Motor nicht alle Details der Implementierung berücksichtigen muss.

5.1. Arten

Die Motorsysteme können in mehrere vorbestimmte Kategorien unterteilt werden, die den Standardkomponenten des Spiels entsprechen. Zum Beispiel: Geometrie, Grafiken, Physik (Kollision von Festkörper), Sound, Eingabeverarbeitung, AI und Animation.
Systeme mit Nicht-Standard-Funktionen beziehen sich auf eine separate Kategorie. Es ist wichtig zu verstehen, dass jedes System, das die spezifischen Kategoriendaten ändert, die Schnittstelle dieser Kategorie aufmerksam sein sollte, da der Motor solche Informationen nicht bereitstellt.

5.2. Systemkomponenten

Für jedes System müssen Sie mehrere Komponenten umsetzen. Hier sind einige von ihnen: System, Szene, Objekt und Aufgabe. Alle diese Komponenten dienen dazu, mit verschiedenen Teilen des Motors zu interagieren.
Das folgende Schema zeigt Wechselwirkungen zwischen verschiedenen Komponenten.


Abbildung 9. Systemkomponenten

Eine detaillierte Schaltung der Verbindungen zwischen den Motorsystemen ist in Anhang B, dem "Motorinteraktionsschema und -systeme" angegeben.

5.2.1. System
Die Komponente "System" oder einfach das System ist für die Initialisierung von Systemressourcen verantwortlich, die sich während des Betriebs des Motors praktisch nicht ändern. Beispielsweise analysiert ein grafisches System Ressourcenadressen, um den Standort und die Beschleunigung des Downloads bei Verwendung der Ressource zu ermitteln. Es setzt auch die Bildschirmauflösung ein.
Das System ist der Haupteingabepunkt für den Rahmen. Es bietet Informationen über sich selbst (z. B. Systemtyp) sowie Methoden zum Erstellen und Entfernen von Szenen.
5.2.2. Szene
Die Komponente "Szene" oder die Systemszene ist für die Verwaltung von Ressourcen verantwortlich, die sich auf die aktuelle Szene beziehen. Die Universal-Szene verwendet Systemszenen, um die Funktionalität durch die Verwendung ihrer Funktionen auszubauen. Als Beispiel kann eine physische Szene gebracht werden, die beim Erstellen einer neuen Gaming-Welt verwendet wird und bei der Initialisierung der Szene die Schwerkraftkräfte darin bestimmt.
Die Szenen sorgen für Methoden zum Erstellen und Zerstören von Objekten sowie der Komponente "Task" zum Verarbeiten der Szene und der Zugriffsmethode darauf.
5.2.3. Ein Objekt
Die Komponente "Objekt" oder das Systemobjekt gehört zur Bühne und ist normalerweise mit der Tatsache verbunden, dass der Benutzer auf dem Bildschirm sieht. Das Universal-Objekt verwendet ein Systemobjekt, um die Funktionalität zu erweitern, wodurch seine Eigenschaften als eigene Eigenschaften bereitgestellt werden.
Ein Beispiel kann als geometrische, grafische und physikalische Verlängerung eines universellen Objekts dienen, um einen Holzstrahl auf dem Bildschirm anzuzeigen. Geometrische Eigenschaften umfassen die Position, die Orientierung und den Maßstab des Objekts. Um es anzuzeigen, verwendet das Grafiksystem ein spezielles Gitter. Und das physikalische System wird ihm die Eigenschaften eines Feststoffs zur Berechnung von Wechselwirkungen mit anderen Körpern und den Strom der Schwerkraft ergeben.

In bestimmten Fällen ist es in dem Systemobjekt erforderlich, Änderungen des Universalobjekts oder eines seiner Erweiterungen zu berücksichtigen. Zu diesem Zweck können Sie eine spezielle Verbindung erstellen, mit der Sie die vorgenommenen Änderungen verfolgen können.

5.2.4. Eine Aufgabe
Die Komponente "Task" oder die Systemaufgabe wird zur Bearbeitung der Szene verwendet. Die Aufgabe empfängt einen Befehl, um die Szene über den Task-Manager zu aktualisieren. Dies ist ein Startsignal. systemfunktionen An den Objekten der Szene.
Die Aufgabe ist auf Unteraufgaben ausgeführt, die sie auch mit dem Task-Manager an eine noch größere Anzahl von Streams verwenden. Dies ist eine bequeme Möglichkeit, den Motor in mehrere Prozessoren zu skalieren. Diese Methode wird als Datenzerlegung bezeichnet.
Informationen zum Ändern von Objekten im Aktualisieren der Szenenaufgaben werden an den staatlichen Manager übermittelt. Einzelheiten zum staatlichen Manager finden Sie in Abschnitt 3.2.2.

6. Kombination aller Komponenten

Alle oben beschriebenen Elemente sind miteinander verbunden und sind Teil eines Ganzen. Die Motorarbeit kann in mehrere Schritte unterteilt werden, die in den folgenden Abschnitten beschrieben sind.

6.1. Bühneninitialisierung.

Die Motorarbeit beginnt mit der Initialisierung von Managern und Rahmenbedingungen.
  • Das Framework ruft den Szenenlader auf.
  • Durch das Definieren, welche Szenensysteme verwendet werden, ruft der Downloader den Platform-Manager auf, um die entsprechenden Module herunterzuladen.
  • Der Platform Manager lädt die entsprechenden Module und überträgt sie an den Schnittstellenmanager und ruft sie an, um ein neues System zu erstellen.
  • Das Modul gibt den Ladezeiger auf eine Instanz des Systems zurück, die die Systemschnittstelle implementiert.
  • Der Service Manager registriert alle Dienste, die das Systemmodul bereitstellt.


Abbildung 10. Initialisierung von Managern und Motorsystemen

6.2. Bühnen-Download-Szene.

Die Steuerung wird vom Lader zurückgegeben, der die Szene lädt.
  • Der Bootloader erstellt eine universelle Szene. Um Instanzen von Systemszenen zu erstellen, verursacht er Systemschnittstellen, die die Funktionalität einer universellen Szene erweitern.
  • Die universelle Szene ermittelt, welche Daten jede Systemszene ändern können, und die Warnungen darüber, welche Änderungen sie empfangen sollen.
  • Vergleichen der Szenen, die bestimmte Änderungen ausführen und Benachrichtigungen über sie erhalten möchten, übermittelt die universelle Szene diese Informationen an den staatlichen Manager.
  • Für jedes Szenenobjekt erstellt der Bootloader ein universelles Objekt, bestimmt dann, welche Systeme das Universalobjekt erweitern. Die Korrespondenz zwischen Systemobjekten wird durch das gleiche Schema bestimmt, das für Szenen verwendet wird. Es wird auch an den staatlichen Manager übertragen.
  • Mit den erhaltenen Szenenschnittstellen erstellt der Bootloader Instanzen von Systemobjekten und verwendet sie, um universelle Objekte zu erweitern.
  • Der Scheduler fordert Daten aus den Szenenschnittstellen über ihre Hauptaufgaben, sodass diese Informationen an den Task-Manager ausgeführt werden.


Abbildung 11. Initialisierung der universellen Szene und des Objekts

6.3. Bühnenzyklusspiele.

  • Der Platform Manager dient zum Verarbeiten von Windows und anderen Elementen, die für die aktuelle Plattform erforderlich sind.
  • Dann passiert die Steuerung den Planer, der auf das Ende der Uhr wartet, um die Arbeit fortzusetzen.
  • Am Ende des Takts im kostenlosen Schritt-für-Schritt-Modus prüft der Planer, welche Aufgaben abgeschlossen wurden. Alle abgeschlossenen Aufgaben (dh die Ausführung bereit) werden an den Task-Manager übermittelt.
  • Der Scheduler bestimmt, welche Aufgaben für den aktuellen Takt abgeschlossen sind, und wartet darauf.
  • Im Ausführungsmodus für Schritt-für-Schritt-Schritt werden diese Vorgänge jeder Uhr wiederholt. Der Planer sendet alle Aufgaben an den Manager und erwartet, dass sie durchführen.
6.3.1. Aufgabenausführung
Die Steuerung geht an den Task-Manager.
  • Es bildet eine Warteschlange aller empfangenen Aufgaben, da kostenlose Streams angezeigt werden, erscheint er ihre Ausführung. (Der Task-Ausführungsprozess variiert in Abhängigkeit von den Systemen. Systeme können nur mit einer Aufgabe arbeiten oder mehrere Aufgaben aus der Warteschlange gleichzeitig verarbeiten, wodurch die parallele Ausführung implementiert wird.)
  • Bei der Durchführung der Aufgabe kann die Aufgabe mit der gesamten Szene oder nur mit bestimmten Objekten zusammenarbeiten und ihre internen Daten ändern.
  • Systeme sollten Benachrichtigungen über Änderungen in allgemeinen Daten erhalten (z. B. Position oder Orientierung). Wenn Sie bei der Durchführung einer Task eine Systemszene oder ein Objekt einen Beobachter darüber informieren, informieren Sie einen Beobachter über alle Änderungen. In diesem Fall fungiert der Beobachter tatsächlich als Controller der Änderung, der Teil des staatlichen Managers ist.
  • Der Änderungscontroller erzeugt eine Warteschlange von Änderungsbenachrichtigungen zur späteren Verarbeitung. Es ignoriert die Änderungen, die diesen Beobachter nicht betreffen.
  • Um bestimmte Dienste zu verwenden, bezieht sich die Aufgabe auf den Service-Manager. Mit dem Services-Manager können Sie auch die Eigenschaften anderer Systeme ändern, die für die Übertragung im Messaging-Mechanismus nicht erreichbar sind (z. B. das Dateneingabesystem ändert die Bildschirmerweiterung - die Grafiksystemeigenschaft).
  • Aufgaben können auch auf den Medium Manager zugreifen, um Umgebungsvariablen zu erhalten und den Ausführungszustand zu ändern (Aussetzung, Übergang, Übergang zur nächsten Szene usw.).


Abbildung 12. Task-Manager und Aufgaben

6.3.2. Datenaktualisierung
Nachdem Sie alle Aufgaben der aktuellen Uhr durchgeführt haben, bezieht sich der Hauptspielzyklus auf den staatlichen Manager, um den Datenaktualisierungsschritt zu starten.
  • Der Status-Manager bewirkt abwechselnd alle Controller, um kumulierte Benachrichtigungen zu senden. Der Controller prüft, welche Beobachter die Benachrichtigungen über Änderungen für jede der Probanden senden.
  • Dann ruft er den gewünschten Beobachter an und erzählt ihm mit der Änderung (die Benachrichtigung auch einen Zeiger auf die Subjektoberfläche). Im Modus der freien Schritt-für-Schritt-Ausführung empfängt der Beobachter geänderte Daten von der Änderungssteuerung, jedoch im Hard-Schritt-Ausführungsmodus sollte sie sie vom Subjekt selbst anfordern.
  • In der Regel interessieren sich Beobachter, die an den Empfangen von Benachrichtigungen über die Änderungen des Systemobjekts interessiert sind, andere Systemobjekte, die demselben universellen Objekt zugeordnet sind. Auf diese Weise können Sie den Prozess, um Änderungen an mehreren Aufgaben zu teilen, die parallel ausgeführt werden können. Um den Synchronisationsprozess zu vereinfachen, können alle zugehörigen Erweiterungen des Universalobjekts in einer Aufgabe kombiniert werden.
6.3.3. Leistung prüfen und beenden
Die Endphase des Spielzyklus ist eine Validierung des Zustands der Laufzeit. Es gibt mehrere solche Zustände: Arbeit, Pause, nächste Szene usw. Wenn der Status "Arbeit" ausgewählt ist, wird die folgende Iteration des Zyklus gestartet. Der Zustand "Ausgang" bedeutet den Abschluss des Zyklus, die Freigabe von Ressourcen und der Ausgabe von der Anwendung. Andere Zustände können umgesetzt werden, zum Beispiel "Pause", "nächste Szene" usw.

7. Fazit

Die Grundidee dieses Artikels ist in Abschnitt 2, dem "Zustand der parallelen Ausführung", dargelegt. Dank der funktionalen Zersetzung und der Zersetzung von Daten ist es möglich, nicht nur den Multithreading-Motor, sondern auch seine Skalierbarkeit gegenüber einer noch größeren Anzahl von Kernen in der Zukunft umzusetzen. Um die Synchronisationskosten auszuschließen, verwenden Sie weitere Daten auf dem neuesten Stand, verwenden Sie die Statusmanager zusätzlich zum Messaging-Mechanismus.

Das Muster "Observer" ist die Funktion des Messaging-Mechanismus. Es ist wichtig, das Prinzip seiner Arbeit zu verstehen, um die optimale Methode seiner Implementierung für den Motor auszuwählen. Tatsächlich ist dies der Mechanismus der Wechselwirkung zwischen verschiedenen Systemen, der die Synchronisation gemeinsamer Daten bietet.

Eine wichtige Rolle bei der Verteilung der Lasten wird von der Verwaltung von Aufgaben gespielt. Anhang D Beratet zur Erstellung eines effektiven Task-Managers für die Game Engine.

Wie Sie sehen, kann das Multithreading des Game-Motors dank eines klar definierten Struktur- und Mitteilungsmechanismus implementiert werden. Damit ist es möglich, die Produktivität moderner und zukünftiger Prozessoren erheblich zu erhöhen.

Anhang A. Motorschema

Die Startverarbeitung erfolgt aus dem Hauptspielzyklus (siehe Abb. 4, "Hauptspielzyklus").


Anhang B. Motorinteraktionsschema und -systeme


Anhang C. Beobachter (Design-Vorlage)

Die Vorlage "Observer" wird im Buch "Akzeptanzorientiertes Design ausführlich beschrieben. Design-Muster », E. Gamma, R. Helm, R. Johnson, J. Wlissides (" Design-Muster: Elemente der wiederverwendbaren objektorientierten Software ", Gamma E., Helm R., Johnson R., Vlissides J.). In Englisch wurde sie erstmals 1995 von Addison-Wesley Publishing House veröffentlicht.

Die Hauptidee dieses Modells lautet wie folgt: Wenn einige Elemente Benachrichtigungen über Änderungen in anderen Elementen empfangen müssen, müssen sie nicht, um die Liste aller möglichen Änderungen anzuzeigen, und versuchen, die erforderlichen Daten darin zu finden. Das Modell beinhaltet das Vorhandensein eines Subjekts und eines Beobachters, mit dem Benachrichtigungen über Änderungen gesendet werden. Der Beobachter überwacht alle Änderungen am Thema. Der Änderungscontroller fungiert als Vermittler zwischen den beiden Datenkomponenten. Das folgende Schema zeigt diese Verbindung.


Abbildung 13. Vorlage "Observer"

Im Folgenden wird der Prozess der Verwendung dieses Modells beschrieben.

  1. Der Änderungscontroller registriert den Beobachter und den Subjekt, deren Benachrichtigungen, deren er erhalten möchte.
  2. Der Änderungscontroller ist eigentlich ein Beobachter. Anstelle eines Beobachters, zusammen mit dem Thema, registriert er sich. Der Änderungscontroller speichert auch eine eigene Liste von Beobachtern und registriert mit ihnen.
  3. Das Thema trägt einen Beobachter (dh den Controller der Änderung) mit seiner Liste von Beobachtern bei, die Benachrichtigungen über seine Änderungen erhalten möchten. Geben Sie manchmal zusätzlich die Art der Änderung an, die bestimmt, welche Änderungen, an denen der Betrachter interessiert ist, an den der Betrachter interessiert ist. Auf diese Weise können Sie den Prozess zum Senden von Benachrichtigungen über Änderungen optimieren.
  4. Ändern von Daten oder Status, das Betreff informiert den Beobachter über den Rückrufmechanismus und überträgt Informationen zu den modifizierten Typen.
  5. Der Änderungscontroller erzeugt eine Warteschlange von Änderungsbenachrichtigungen und wartet auf ein Signal, um sie auf Objekten und Systemen zu verteilen.
  6. Während der Verteilung spricht der Änderungsregler echte Beobachter an.
  7. Beobachter fordern Informationen zu den modifizierten Daten oder einem Betreff des Subjekts an (oder erhalten Sie sie zusammen mit Benachrichtigungen).
  8. Bevor Sie einen Beobachter entfernen oder wenn er nicht mehr Benachrichtigungen über das Thema empfangen muss, löscht er ein Abonnement auf diesen Betreff in der Änderungssteuerung.
Es gibt viele auf veschiedenen Wegen Die Verteilung der Aufgaben umsetzen. Es ist jedoch am besten, die Anzahl der Workflows aufrechtzuerhalten, die der Anzahl der verfügbaren logischen Plattformprozessoren entsprechen. Versuchen Sie, Aufgaben nicht an einen bestimmten Stream zu binden. Die Aufgabenzeiten verschiedener Systeme überfallen nicht immer. Dies kann zu einer ungleichmäßigen Lastverteilung zwischen den Arbeitsabläufen führen und die Wirksamkeit beeinflussen. Verwenden Sie zum Vereinfachung dieses Prozesses Task-Management-Bibliotheken, wie z.

Wenn Sie mit der Theorie von Multithreading verstanden haben, berücksichtigen Sie das praktische Beispiel - Pentium 4. In der Bühne der Entwicklung dieses Prozessors haben Intel-Ingenieure weiterhin daran gearbeitet, seine Leistung zu verbessern, ohne Änderungen an der Programmoberfläche vorzunehmen. Die fünf einfachen Wege wurden in Betracht gezogen:

Taktfrequenz erhöhen;

Platzierung auf einem Chip mit zwei Prozessoren;

Einführung neuer Funktionsblöcke;

Verlängerung des Förderers;

Mit Multithreading.

Der offensichtlichste Weg, um die Geschwindigkeit zu verbessern, besteht darin, die Taktfrequenz zu erhöhen, ohne andere Parameter zu ändern. In der Regel hat jedes nachfolgende Prozessormodell eine etwas höhere Taktfrequenz als der vorherige. Leider sind Entwickler mit einem unkomplizierten Anstieg der Taktfrequenz mit zwei Problemen konfrontiert: eine Erhöhung des Stromverbrauchs (das relevant ist laptop-Computer und andere Rechengeräte, die auf Batterien laufen) und Überhitzung (was erfordert, was effizientere Wärmesenken erzeugt).

Das zweite Verfahren ist die Platzierung auf dem Chip mit zwei Prozessoren - relativ einfach, aber es ist mit der Verdoppelung des von der Mikroschaltung belegten Fläche verbunden. Wenn jeder Prozessor mit einem eigenen Cache-Speicher geliefert wird, ist die Anzahl der Mikroschüsse auf der Platte an der Haluzierung, es bedeutet jedoch auch, die Produktionskosten zu verdoppeln. Wenn für beide Prozessoren ein gemeinsamer Cache-Speicher vorliegt, kann eine signifikante Erhöhung des besetzten Bereichs vermieden werden, aber in diesem Fall erfolgt ein weiteres Problem - die Menge des Cache-Speichers in Bezug auf jeden Prozessor ist halbiert, und dies ist zwangsläufig von der Leistung beeinträchtigt . Wenn außerdem professionelle Serveranwendungen die Ressourcen mehrerer Prozessoren vollständig nutzen können, wird in herkömmlichen Desktop-Programmen eine interne Parallelität in einem viel geringeren Umfang entwickelt.

Die Einführung neuer Funktionsblöcke ist auch nicht schwierig, aber es ist wichtig, das Gleichgewicht zu halten. Was ist die Bedeutung der Top-Ten-Blöcke von ALU, wenn der Chip keine Befehle an den Förderer mit einer Geschwindigkeit ausgeben kann, mit der Sie alle diese Blöcke herunterladen können?

Der Förderer mit einer erhöhten Anzahl von Schritten, die in der Lage sind, die Aufgaben in kleinere Segmente zu trennen und in kurzen Zeiträumen zu verarbeiten, zunimmt die Leistung andererseits, erhöht die negativen Folgen der falschen Prognose von Übergängen, Cachern, Interrupts und andere Ereignisse, die die normalen Kursverarbeitungsbefehle im Prozessor verletzen. Um die Möglichkeiten eines erweiterten Förderers vollständig umzusetzen, ist es außerdem erforderlich, die Taktfrequenz zu erhöhen, und dies führt, wie wir wissen, zu einem erhöhten Energieverbrauch und Wärmeübertragung führt.

Schließlich ist es möglich, Multithreading umzusetzen. Der Vorteil dieser Technologie besteht darin, einen zusätzlichen Software-Stream einzuführen, mit dem Sie diese Hardwarerressourcen in Kraft treten können, die sonst einfach gewesen wären. Nach den Ergebnissen der Experimentierstudien fanden die Intel-Entwickler, dass der Anstieg der Mikroschaltung um 5% bei der Implementierung von Multithreading für viele Anwendungen um 25% erhöht. Der erste Intel-Prozessor mit Unterstützung für Multithreading war HEON 2002. Anschließend wurde Multithreading ausgehend von der Frequenz von 3,06 GHz in den Pentium 4 eingeführt. Intel Lineal ruft die Implementierung von Multithreading in Pentium 4-Hypermatochness (Hyperthreading) auf.

  • Lernprogramm

In diesem Artikel werde ich versuchen, die Terminologie zu beschreiben, die zur Beschreibung von Systemen verwendet wird, die mehrere Programme parallel ausführen können, dh mehrkern, Multiprozessor, Multi-Thread. Verschiedene Arten der Parallelität in der IA-32-CPU erschienen zu unterschiedlichen Zeiten und leicht inkonsistent. In all dem ist es ziemlich einfach, verwirrt zu werden, insbesondere wenn man bedenkt, dass die Betriebssysteme Teile von nicht zu anspruchsvollen Anwendungsprogrammen sorgfältig verbergen.

Der Zweck des Artikels ist darin zu zeigen, dass mit aller Vielfalt möglicher Konfigurationen von Multiprozessor, Multi-Core- und Multi-Thread-Systemen für Programme, die dabei ausgeführt werden, sowohl für die Abstraktion (Ignorierende Unterschiede) erstellt werden (Unterschiede ignorieren) und zur Rechnung (Die Fähigkeit zur Programmierung der Konfiguration).

Warnung vor Signs ®, ™, im Artikel

Mein erklärt, warum Mitarbeiter von Unternehmen Urheberrechtsmarken in der öffentlichen Kommunikation verwenden sollten. In diesem Artikel mussten sie oft verwendet werden.

Zentralprozessor

Natürlich ist der am häufigsten benutzte und mehrdeutige Begriff der älteste, am häufigsten verwendete und mehrdeutige Begriff ein "Prozessor".

In der modernen Welt ist der Prozessor dann (Paket), dass wir in einem schönen Einzelhandelskasten oder nicht sehr schöner OEM-Tasche kaufen. Ein unteilbares Essenz in den Anschluss (Buchse) an hauptplatine. Auch wenn es keinen Stecker gibt, und es ist unmöglich, es zu entfernen, das heißt, wenn er fest verlötet ist, ist dies ein Chip.

Mobile Systeme (Telefone, Tablets, Laptops) und die meisten Desktops haben einen Prozessor. Workstations und Server bieten manchmal zwei oder mehr Prozessoren auf einem Motherboard.

Die Unterstützung mehrerer zentraler Prozessoren in einem System erfordert zahlreiche Änderungen in seinem Design. Zumindest müssen sie ihnen zur Verfügung stellen physische Verbindung (Stellen Sie mehrere Steckdosen auf dem Motherboard an), lösen Sie die Probleme der Prozessoridentifikationsprobleme (siehe später in diesem Artikel sowie meine Notiz), den Zugriff auf den Speicher und die Zustellung von Interrupts koordinieren (Interrupt-Controller muss in der Lage sein, Interrupts in mehrere Prozessoren zu leiten ) Und natürlich unterstützen das Betriebssystem. Ich konnte leider keinen Dokumentarfilm erwähnen, der den Moment des Erstellens des ersten Multiprozessorsystems auf Intel-Prozessoren, aber Wikipedia behauptet, dass die sequenten Computersysteme sie bereits 1987 mit Intel 80386-Prozessoren bereitgestellt haben. Die weit verbreitete Unterstützung für mehrere Chips in einem System wird weit verbreitet Verfügbar angehend mit Intel® Pentium.

Wenn es mehrere Prozessoren gibt, hat jeder von ihnen einen eigenen Anschluss an der Tafel. Jeder von ihnen verfügt über vollständige unabhängige Kopien aller Ressourcen, wie Registern, Ausführung von Geräten, Caches. Sie teilen den gesamten Speicher - RAM. Der Speicher kann mit verschiedenen und eher nicht trivialen Wegen mit ihnen verbunden werden, aber dies ist eine gesonderte Geschichte, die über diesen Artikel hinausgeht. Es ist wichtig, dass bei jedem Szenario für ausführbare Programme die Illusion des homogenen Gesamtspeichers erstellt werden soll, was von allen im System enthaltenen Prozessoren erreichbar ist.


Um fertig! Intel® Desktop-Board D5400XS

Ader

Historisch erschien Multi-Core in Intel IA-32 später Intel® Hyperthreading, aber in einer logischen Hierarchie geht es als nächstes.

Es scheint, dass, wenn es mehr Prozessoren im System gibt, dann seine Leistung (auf Aufgaben, die alle Ressourcen verwenden können). Wenn jedoch die Kommunikationskosten zwischen ihnen zu groß sind, wird der gesamte Gewinn der Parallelität von langen Verzögerungen bei der Übertragung allgemeiner Daten getötet. Dies ist das, was in Multiprozessor-Systemen beobachtet wird - sowohl physisch als auch logisch, sind sie sehr weit voneinander entfernt. Für eine wirksame Kommunikation bei solchen Bedingungen müssen Sie spezialisierte Reifen erfassen, z. B. Intel® Quickpath-Verbindungen. Der Energieverbrauch, die Größen und der Preis der endgültigen Entscheidung nehmen natürlich nicht von all dem ab. Eine hohe Integration der Bauteilschemata, die Teile des Parallelprogramms ausführen, sollte zur Rettung kommen, es ist notwendig, einander anzuheben, vorzugsweise auf einem Kristall. Mit anderen Worten, mehrere Prozessoren sollten mehrere organisieren kernel, in allen identisch miteinander, aber unabhängig arbeiten.

Die ersten Multi-Core-IA-32-Prozessoren von Intel wurden 2005 präsentiert. Seitdem wächst die durchschnittliche Anzahl an Kernen in Server, Desktop und jetzt und mobilen Plattformen stetig.

Im Gegensatz zu zwei Single-Core-Prozessoren in einem System können zwei Kerne nur ein Trennen von nur einem Speicher auftreten, zweikerne können auch gemeinsame Caches und andere Ressourcen aufweisen, die für das Interaktion mit dem Gedächtnis verantwortlich sind. Am häufigsten bleiben die ersten Stufen-Caches privat (jeder Kernel), während der zweite und der dritte Niveau sowohl allgemein als auch getrennt sein können. Eine solche Organisation des Systems reduziert Verzögerungen bei der Lieferung von Daten zwischen benachbarten Kernen, insbesondere wenn sie an einer gemeinsamen Aufgabe arbeiten.


Mikroinks des Vierkern-Intel-Prozessors mit dem NEALEM-Codenamen. Separate Kernel sind hervorgehoben, der gesamte Cache von dritter Ebene sowie die QPI-Links zu anderen Prozessoren und dem Gesamtspeichercontroller.

Hyperpot

Bis etwa 2002 war der einzige Weg, um das IA-32-System, das zwei oder mehr Programme parallel ausführen kann, um Multiprozessorsysteme zu verwenden. In der Intel® Pentium® 4 sowie der Xeon-Linie mit dem Foster-Code-Namen (NetBurst) wird eine neue Technologie dargestellt - Hyperthrons oder Hyperpotions - Intel® Hyperthreading (nachstehend HT).

Es gibt nichts Neues unter der Sonne. HT ist ein Sonderfall, der in der Literatur als simultanes Multithreading (simultanes Multithreading, SMT) bezeichnet wird. Im Gegensatz zu den "echten" Kernen, die vollständige und unabhängige Kopien sind, wird im Falle von HT in einem Prozessor nur ein Teil der internen Knoten dupliziert, vor allem für die Speicherung von architektonischen Statusregistern verantwortlich. Die für die Organisation und Verarbeitung von Daten verantwortlichen Exekutivknoten bleiben im Singular, und jederzeit verwenden sie ein Maximum eines der Streams. Wie der Kernel sind Hyperpotions durch Caches geteilt, aber aus welchem \u200b\u200bLevel abhängig davon abhängig von dem jeweiligen System.

Ich werde nicht versuchen, alle Vor- und Nachteile von Designs mit SMT im Allgemeinen und insbesondere von HT zu erklären. Ein wunderbarer Leser kann in vielen Quellen eine ziemlich detaillierte Diskussion von Technologie finden und natürlich in Wikipedia. Ich werde jedoch Folgendes beachten wichtiger MomentErläutern Sie die aktuellen Einschränkungen der Anzahl der Hyperpotions in echten Produkten.

Stream-Einschränkungen
Wann sind die Anwesenheit von "unehrlichsten" Multi-Core in Form von HT gerechtfertigt? Wenn ein Anwendungsstrom nicht in der Lage ist, alle ausführenden Knoten innerhalb des Kernels zu laden, können sie in einen anderen Bach "geliehen" werden. Es ist typischerweise für Anwendungen mit " engpass»Nicht in Berechnungen, aber beim Zugriff auf Daten generieren Sie oft Cache-Raketen und gezwungen, Daten zu erwarten, dass Daten Daten aus dem Speicher liefern. Zu diesem Zeitpunkt wird der Kernel ohne HT zum Leerlauf gezwungen. Mit dem Vorhandensein von HT können Sie schnell freie Ausführung von Knoten in einen anderen architektonischen Zustand (da es nur dupliziert ist) umschalten und seine Anweisungen ausführen. Dies ist ein besonderer Annahmefall, der als Latenzverkleidung namens Latenzzeit versteckt, wenn ein langer Betrieb, in dem nützliche Ressourcen im Leerlauf sind, durch Parallel mit der Durchführung anderer Aufgaben maskiert ist. Wenn der Antrag bereits ein hohes Maß an Recycling der Kernel-Ressourcen hat, erlaubt das Vorhandensein von Hyperpotionen nicht, die Beschleunigung zu erhalten - hier benötigen Sie "ehrliche" Kerne.

Typische Arbeitsszenarien für Desktop- und Serveranwendungen für Maschinenarchitekturen allgemeiner Zweck, haben die Parallelitätspotenzial mit HT implementiert. Dieses Potenzial ist jedoch schnell "ausgegeben". Vielleicht ist aus diesem Grund fast alle IA-32-Prozessoren, die Anzahl der Hardware-Hyperpolts nicht zwei. Bei typischen Skripten wäre der Gewinn von der Verwendung von drei und mehr Hyperpotionen klein, aber der Verlust der Kristallgröße ist jedoch von Bedeutung, der Stromverbrauch und der Wert ist von Bedeutung.

Eine andere Situation wird auf typischen Aufgaben beobachtet, die an Video-Screenwriter durchgeführt werden. Daher zeichnen sich diese Architekturen durch die Verwendung von SMT-Technologie mit einer größeren Anzahl von Threads aus. Da Intel® Xeon Phi-Koprozes (im Jahr 2010 präsentiert) ideologisch und genaulogisch nahe an Videokarten sind, können sie sein vier. Hypertonie auf jedem Kernel ist eindeutig für die IA-32-Konfiguration.

Logischer Prozessor

Von den drei "Levels" der Parallelität (Prozessoren, Kernel, Hyperpotts) können in einem bestimmten System einige oder sogar alles fehlen. Das ist beeinflusst bIOS-Einstellungen (Multi-Core und Multithreading werden unabhängig voneinander getrennt), MicroArchitecture-Funktionen (z. B. in Intel® Core ™ Duo), wurde jedoch mit der Freigabe von NEALEM zurückgegeben) und Ereignisse während des Systembetriebs (Multiprozessor-Server können die abgelehnten Prozessoren ausschalten Im Falle von Fehlfunktionen und weiterhin "Fliegen" auf der verbleibenden). Wie wird dieser mehrstufige Parallelitätszoo vom Betriebssystem und letztendlich angelegte Anwendungen angezeigt?

Als nächstes bezeichnen wir die Anzahl der Prozessoren, Kernel und Bäche in einem Drei-Wege-System ( x., y., z.), wo x. - Dies ist die Anzahl der Prozessoren, y. - Anzahl der Kerne in jedem Prozessor und z. - Die Anzahl der Hyperpolts in jedem Kernel. Als nächstes werde ich dieses Triple anrufen topologie - etablierter Term, wenig mit einem Teil der Mathematik. Komposition p. = xYZ. bestimmt die Anzahl der genannten Entitäten logische Prozessoren. Systeme. Es bestimmt die Gesamtzahl unabhängiger Kontexte von anliegenden Prozessen im System mit einem parallelen gemeinsam genutzten Speicher, der operationssystem Gezwungen zu berücksichtigen. Ich sage "erzwungen", weil es das Verfahren nicht für die Ausführung von zwei Prozessen auf verschiedenen logischen Prozessoren verwalten kann. Dies gilt auch für Hyperpolien: Obwohl sie auf einem Kern "konsequent" arbeiten, wird die spezifische Reihenfolge von Geräten diktiert und steht nicht zur Überwachung oder Verwaltung von Programmen zur Verfügung.

Am häufigsten versteckt das Betriebssystem von Endanwendungen. Merkmale der physikalischen Topologie des Systems, auf dem er läuft. Zum Beispiel werden drei folgende Topologien: (2, 1, 1), (1, 2, 1), (1, 2, 1) und (1, 1, 2) - OS werden als zwei logische Prozessoren dargestellt, obwohl der erste von ihnen zwei Prozessoren hat, die Zweiter - zwei Kerne, und der dritte ist nur zwei Bäche.


Windows Task Manager zeigt 8 logische Prozessoren an. Aber wie viel kostet es in Prozessoren, Kernel und Hyperpots?


Linux-Top zeigt 4 logische Prozessoren an.

Es ist ziemlich praktisch für die Schöpfer von angewandten Anwendungen - sie müssen sich nicht mit oft unwesentlicher Funktionen von Ausrüstung umgehen.

Softwaredefinition der Topologie

Selbstverständlich schafft die Abstraktion der Topologie in eine einzige Anzahl logischer Prozessoren in einigen Fällen den Grund für Verwirrung und Missverständnisse (in heißen Internet-Streitigkeiten). Rechenanwendungen, die aus eisernem Maximalleistung herauspressen möchten, erfordern detaillierte Kontrolle darüber, wo ihre Streams platziert werden: näher aneinander auf benachbarten Hyperpots oder umgekehrt, auf verschiedenen Prozessoren entfernt. Die Kommunikationsgeschwindigkeit zwischen logischen Prozessoren in der Zusammensetzung eines Kernel- oder Prozessors ist deutlich höher als die Datenübertragungsrate zwischen den Prozessoren. Die Möglichkeit der Inhomogenität in der Organisation arbeitsspeicher Kompliziert auch das Bild.

Informationen zur Topologie des gesamten Systems sowie die Position jedes logischen Prozessors in IA-32 können mit der CPUID-Anweisung zur Verfügung stehen. Da das Erscheinungsbild der ersten Multiprozessor-Systeme das Identifizierungsschema der logischen Prozessoren mehrmals erweitert. Bislang ist sein Teil in den Blättern 1, 4 und 11 CPUID enthalten. Welche der Blätter sollte angezeigt werden, Sie können aus dem folgenden Blockdiagramm ermitteln, das aus dem Artikel entnommen wurde:

Ich werde nicht alle Details der einzelnen Teile dieses Algorithmus erlassen. Wenn Sie interessiert sind, kann dies dem nächsten Teil dieses Artikels gewidmet werden. Ich werde den Leser des Lesers verlassen, in dem diese Frage so detailliert wie möglich verständlich ist. Hier werde ich zuerst kurz beschreiben, was APIC ist und wie es mit der Topologie verbunden ist. Betrachten Sie dann die Arbeit mit einem 0xb-Blatt (elf in Dezimalzahlen), das derzeit das letzte Wort in der "Spike Construction" ist.

Apic-ID.
Lokales APIC (Advanced Programmable Interrupt Controller) ist ein Gerät (jetzt in den Prozessor enthalten), der für das Arbeiten mit Interrupts verantwortlich ist, das zu einem bestimmten logischen Prozessor kommt. Jeder logische Prozessor hat einen eigenen APIC. Und jeder von ihnen im System sollte haben einzigartige Bedeutung APIC-ID. Diese Nummer wird von Interrupt-Controllern verwendet, um bei der Bereitstellung von Nachrichten zu adressieren, und alle anderen (z. B. das Betriebssystem) - um logische Prozessoren zu identifizieren. Die Spezifikation für diesen Interrupt-Controller entwickelte sich, was vom Intel 8259-PIC-Chip über das Dual-PIC, APIC und XAPIC auf X2APIC übergeht.

Derzeit erreichte die Breite der in der APIC-ID gespeicherten Anzahl ein voller 32 Bit, obwohl es in der Vergangenheit auf 16 begrenzt war, und sogar früher - nur 8 Bits. Heute sind die Überreste der alten Zeiten in der gesamten CPUID verstreut, aber alle 32 Bit-APIC-ID werden an cpuid.0xb.edx zurückgegeben. In jedem logischen Prozessor wird unabhängig voneinander den CPUID-Anweisung ausführen, kehrt zum Wert auf seinen Wert.

Verwandte Verbindungen filmen
Die Apic-ID selbst spricht nichts über die Topologie. Um herauszufinden, welche zwei logischen Prozessoren in derselben physischen (d. H. "Brüder" mit Hyperthms) sind, was zwei in einem einzigen Prozessor sind, und die auch in verschiedenen Prozessoren sind, müssen Sie ihre APIC-ID-Werte vergleichen. Je nach Verwaltungsgrad werden einige ihrer Bits übereinstimmen. Diese Informationen sind in der Konsole von cpuid.0xb enthalten, die mit dem Operand in ECX codiert sind. Jeder von ihnen beschreibt die Position des Bitfelds eines der Topologiestufen in EAX (genauer gesagt, die Anzahl der Bits, die in die APIC-ID nach rechts verschoben werden müssen, um die niedrigeren Topologiestufen zu entfernen) sowie die Typ dieser Ebene - Hyperpotions, ein Kern- oder Prozessor, in ECX.

Logische Prozessoren, die sich in einem einzigen Nukleus befinden, stimmen alle APIC-ID-Bits mit Ausnahme des SMT-Felds überein. Für logische Prozessoren in einem Prozessor befinden sich alle Bits mit Ausnahme von Kern- und SMT-Feldern. Da die Anzahl der Sublitters in CPUID.0xb wachsen kann, ermöglicht Ihnen dieses System, eine Beschreibung von Topologien und mit mehr ebenen Ebenen aufrechtzuerhalten, wenn in der Zukunft erforderlich ist. Darüber hinaus ist es möglich, Zwischenstufen zwischen vorhandenen einzuführen.

Eine wichtige Folge der Organisation dieses Schemas ist, dass im Satz aller APIC-IDs aller logischen Prozessoren des Systems "Löcher" sein können, d. H. Sie werden nicht sequentiell gehen. In einem Multi-Core-Prozessor mit der AUS-HT können beispielsweise alle APIC-IDs bekannt sein, da das jüngere Bit, das für die Kodierung der Hyperpottop-Nummer verantwortlich ist, immer Null ist.

Ich beobachte, dass cpuid.0xb nicht ist die einzige Quelle von Informationen zu logischen Prozessoren, die dem Betriebssystem zur Verfügung stehen. Die Liste aller darauf zugänglichen Prozessoren, zusammen mit ihren APC-ID-Werten, wird in der MADT-ACPI-Tabelle codiert.

Betriebssysteme und Topologie

Betriebssysteme bieten Informationen zur Topologie der logischen Prozessoren an Anwendungen mit ihren eigenen Schnittstellen.

In Linux sind Topologieinformationen in Pseudo-Datei / proc / cpuinfo sowie in der Ausgabe des DMIDEcode-Befehls enthalten. In dem nachstehenden Beispiel filtere ich den Inhalt von CPUINFO auf einem vierkernigen System ohne HT, wodurch nur Einträge mit der Topologie verbunden sind:

Versteckter Text

[E-Mail geschützt]: ~ $ Cat / proc / cpuinfo | Grep "Prosesor \\ | Physical \\ ID \\ | Geschwister \\ | Core \\ | Cores \\ | APICID" Prozessor: 0 physische ID: 0 Geschwister: 4 Kern-ID: 0 CPU-Kerne: 2 APICID: 0 Erste APICID: 0 Prozessor: 1 physische ID: 0 Geschwister: 4 Kern-ID: 0 CPU-Kerne: 2 APICID: 1 Anfangs-APICID: 1 Prozessor: 2 physische ID: 0 Geschwister: 4 Kern-ID: 1 CPU-Kerne: 2 APICID: 2 anfängliche APICID: 2 Prozessor: 3 physische ID: 0 Geschwister: 4 Kern-ID: 1 CPU-Kerne: 2 APICID: 3 Anfang Apicide: 3

Die FreeBSD-Topologie wird über den Systl-Mechanismus in der KERN.Sched.topology_spec-Variablen in Form von XML gemeldet:

Versteckter Text

[E-Mail geschützt]: ~ $ sysctl Kern.Sched.topologie_spec Kern.Sched.topology_spec: 0, 1, 2, 3, 4, 5, 6, 7 0, 1, 2, 3, 4, 5, 6, 7 0, 1 Thread-Gruppe.SMT-Gruppe. 2, 3 Thread-Gruppe.SMT-Gruppe. 4, 5 Thread-Gruppe.SMT-Gruppe. 6, 7 Thread-Gruppe.SMT-Gruppe.

In MS Windows 8 finden Sie in Task Manager-Task-Manager.

Zum informationsbranche. Der Beginn des XXI-Jahrhunderts fiel mit den Schichten zusammen, die als "tektonisch" bezeichnet werden können. Anzeichen einer neuen Ära sollten die Verwendung von serviceorientierten Architekturen (serviceorientierte Architektur, SOA), Clusterkonfigurationen und viele andere, einschließlich Multi-Core-Prozessoren einschließen. Natürlich ist die grundlegende Ursache für das, was passiert, die Entwicklung der Halbleiterphysik, deren Folge, deren Erhöhung der Anzahl der logischen Elemente pro Flächeneinheit, das das Gesetz von Gordon Moore stürzt, zu einer Erhöhung des Gesetzes wurde. Die Anzahl der Transistoren auf dem Kristall wird bereits von Hunderten von Millionen berechnet und werden bald die Billionsth-Grenze überwinden, wodurch das bekannte Dialektikgesetz unweigerlich mit dem Zusammenhang mit quantitativen und qualitativen Änderungen manifestiert. Bei den veränderten Bedingungen kommt eine neue Kategorie in den Vordergrund komplexitätund die Systeme werden komplex und auf dem Micro-Level (Prozessoren) und auf dem Makroebene (Unternehmensinformationssysteme).

Bis zu einem gewissen Grad, was in der modernen Computerwelt passiert, kann mit dem evolutionären Übergang verglichen werden, der vor Millionen von Jahren aufgetreten ist, wenn mehrzellige Organismen auftauchten. Zu der Zeit, als die Komplexität einer Zelle eine bestimmte Grenze erreichte, und die anschließende Evolution ging entlang des Weges der Entwicklung der Infrastrukturkomplexität entlang. Dasselbe passiert mit computersysteme: Die Komplexität eines Kerns des Prozessors sowie der monolithischen Unternehmensarchitektur informationssysteme Ein bestimmtes Maximum erreicht. Nun ist der Makroebene über den Übergang von monolithischen Systemen zur Komponente (oder bestehend aus Dienstleistungen), und die Aufmerksamkeit des Entwicklers konzentriert sich auf die Infrastruktursoftware der Zwischenschicht, und neue Prozessorarchitekturen erscheinen auf dem Mikrospiegel.

Wörtlich zuletzt begann die Idee der Komplexität den gesunden Menschenverstand, sich in einen unabhängigen Faktor zu verlieren. In dieser Hinsicht ist die Komplexität noch nicht vollständig verstanden, und die Einstellung zu ihm ist nicht vollständig definiert, obwohl sie seltsamerweise seit fast 50 Jahren eine separate wissenschaftliche Disziplin gibt, die auch als "Theorie komplexer Systeme" genannt wird. (Erinnern an, dass in der Theorie des "Komplexes" das System genannt wird, deren einzelne Komponenten mit einem nichtlinearen Verfahren kombiniert sind; Ein solches System ist nicht nur die Summe der Komponenten, da es in linearen Systemen geschieht.) Man kann nur sein Überrascht, dass die THEORIE der Systeme noch nicht von diesen Spezialisten und Unternehmen wahrgenommen wird, deren Tätigkeit sie zur Erstellung dieser komplexen Systeme mittels Informationstechnologie führt.

"Flaschenförmige Architektur von Neymanan

Auf dem Micro-Niveau kann ein Analogon des Übergangs von einzelzellorganischen Organismen bis zum multizellulären Übergang von Single-Core-Prozessoren zu Multi-Core (Chip-Multiprozessionen, CMP) sein. CMP gibt einer der Möglichkeiten, die angeborene Schwäche moderner Prozessoren zu überwinden - der "Flaschenhals" der Architektur von Neymanan.

Dies ist, was John Bacik in der Präsentationszeremonie des Tyuringov-Preises 1977 gesagt hat: "Was ist ein Computer auf Nimanan-Hintergrund? Als vor 30 Jahren vor 30 Jahren ihre ursprüngliche Architektur angeboten, schien die Idee elegant, praktisch und ermöglichte es, die Lösung einer Reihe von Engineering- und Programmieraufgaben zu vereinfachen. Und obwohl in der vergangenen Zeit die zu Zeit seiner Veröffentlichung existierenden Bedingungen radikal geändert wurden, identifizieren wir unsere Ideen von Computern mit diesen alten Konzepten. In der einfachsten Präsentation besteht der nimanische Computer aus drei Teilen: Dies ist ein zentraler Prozessor (CPU oder CPU), Speicher und Anschluss ihres Kanals, der dazu dient, Daten zwischen CPU und Speicher und kleine Portionen (nur von einem Wort) auszutauschen. Ich schlage vor, diesen Kanal anzurufen "Flaschenflasche Flaschenflasche Hintergrund Neymanan." Sicher muss es weniger primitive Lösung geben, als eine riesige Datenmenge durch einen "schmalen Flaschenhals" zu pumpen. Ein solcher Kanal erzeugt nicht nur ein Problem für den Verkehr, sondern ist auch eine "intelligente Flasche Hals", die den Programmierern "Salat" auferlegt, und zwar nicht in höheren konzeptionellen Kategorien zu argumentieren. "

Der größte Ruhm von Bakusa brachte die Kreation in den Mitte der 50er Jahre der Fortran-Sprache, die seit einigen Jahrzehnten die beliebtesten Mittel zur Erstellung von Abrechnungsprogrammen war. Aber später war der Bakus anscheinend zutiefst auf seine Schwächen bewusst und erkannte, dass er die "Hintergrundneiranovsky-Sprache" aus allen High-Level-Sprachen entwickelte. Daher stand das Hauptpatrnus seiner Kritik vor allem auf unvollkommene Programmiermethoden gegenüber.

Ab dem Moment der ausdrücklichen Sprache des Bacus in der Programmierung trat spezielle Verschiebungen auf, funktionale und objektorientierte Technologien, und mit ihrer Hilfe gelang es, zu überwinden, was der Bakus den "intelligenten Hintergrund-Nimanovsky-Flaschenhals" nannte. Die architektonische Wurzelursache dieses Phänomens, die angeborene Erkrankung des Kanals zwischen Speicher und Prozessor - seinen begrenzten Durchsatz - verschwand jedoch nicht, obwohl der Fortschritt auf dem Technischen Bereich in den letzten 30 Jahren. Im Laufe der Jahre ist dieses Problem ständig verschlimmert, da die Erinnerungsgeschwindigkeit viel langsamer wächst als die Leistung von Prozessoren, und die Lücke zwischen ihnen wird immer mehr.

Der Hintergrund der Nimanovsk-Architektur des Computers ist nicht nur das einzige möglich. Aus Sicht der Organisation von Austauschbefehlen zwischen dem Prozessor und dem Speicher können alle Computer in vier Klassen unterteilt werden:

  • SISD (einzelne Anweisungen einzelne Daten) - "ein Befehlsstrom, ein Datenstrom" ";
  • SIMD (einzelne Anweisungen multipliziert Daten) - ein Befehlsfluss, viele Datenströme;
  • MISD (mehrere Anweisungen einzelne Daten) - viele Befehlsströme, ein Datenstrom;
  • MIMD (mehrere Anweisungen mehrere Daten) - Viele Befehlsströme, viele Datenströme.

Aus dieser Klassifizierung ist zu sehen, dass die Nimanovskaya-Maschine ein Sonderfall ist, der in die Kategorie SISD fällt. Mögliche Verbesserungen im Rahmen der SISD-Architektur sind auf die On-Line-Förderer und andere zusätzliche Funktionsknoten sowie die Verwendung verschiedener Caching-Methoden beschränkt. In mehreren Projekten wurden zwei weitere Kategorien von Architekturen (SIMD, einschließlich MISD-Fördererarchitekturen), jedoch in mehreren Projekten umgesetzt, jedoch nicht massiv. Wenn Sie in dieser Klassifizierung bleiben, bleibt die einzige Möglichkeit, die Einschränkungen des "Flaschenförms" zu überwinden, die Entwicklung der MIMD-Klasse-Architekturen. In ihrem Rahmen werden viele Ansätze gefunden: Es können verschiedene Parallel- und Clusterarchitekturen und mehrstädtische Prozessoren sein.

Vor einigen Jahren wurden aufgrund technologischer Einschränkungen alle Multi-Thread-Prozessoren anhand eines Kerns aufgebaut, und solche Multi-Dimensionen wurden "gleichzeitig" genannt - Gleichzeitiges Multithreading (SMT). Und mit dem Aufkommen von Multi-Core-Prozessoren erschien eine alternative Art von Multi-Dimensionalness - Chip-Multiprozessoren (CMP).

Merkmale von Multi-Thread-Prozessoren

Der Übergang von einfachen Einzelgewindeprozessoren zu einem logisch komplexeren Multi-Flow-Konjugat mit überwindspezifischer, noch nicht schwerer Schwierigkeit. Die Funktionsweise des Geräts, in dem der Ausführungsvorgang in Agenten oder Threads (Threads) unterteilt ist, verfügt über zwei Merkmale:

  • nichtbestimmungsprinzip (Bestimmungsprinzip). In einer Mehrfachgewindeanwendung ist der Prozess ohne vorab vereinbarte Gewissheit in interagierende Stroms-Agenten unterteilt;
  • unschärferelation. Die Art und Weise, wie die Ressourcen zwischen den Streams-Agenten verteilt werden, ist ebenfalls im Voraus unbekannt.

Aufgrund dieser Merkmale unterscheidet sich die Arbeit von Multi-Thread-Prozessoren grundsätzlich von deterministischen Berechnungen auf dem Nimanov-Schema. In diesem Fall kann der Stromzustand des Prozesses nicht als lineare Funktion des vorherigen Zustands definiert und an dem Eingang der Daten empfangen werden, obwohl jeder der Prozesse als NiManan-Micromestyle angesehen werden kann. (In der Anwendung auf das Verhalten von Flüssen können Sie sogar den in der Quantenphysik verwendeten Begriff "Seltsamkeit" verwenden.) Die Anwesenheit dieser Funktionen bringt den Multi-Thread-Prozessor auf die Ideen über komplexes SystemMit reiner praktischer Sicht ist jedoch klar, dass auf dem Niveau der Implementierung von Prozessen, keine Nicht-Deterministik oder Unsicherheit, und sogar mehr um die Seltsamkeit und Sprache nicht. Das richtig ausgeführte Programm kann nicht seltsam sein.

In der allgemeinsten Form besteht ein Multi-Thread-Prozessor aus zwei Arten von Primitiven. Der erste Typ ist eine Ressource, die den Fluss eines Baches unterstützt, der als Mutex (von der gegenseitigen Ausgrenzung - "gegenseitiger Ausnahme") und den zweiten Ereignissen bezeichnet wird. Die Art und Weise, die physisch von einem oder einem anderen Mutex implementiert ist, hängt vom ausgewählten Schema - SMT oder CMP ab. In jedem Fall wird der Prozess auf die Tatsache reduziert, dass der nächste Stream Mutex während seiner Ausführung erfasst und dann sie freigibt. Wenn Mutex in einem Bach beschäftigt ist, kann der zweite Strom es nicht bekommen. Das spezifische Verfahren zur Übertragung von Befugnissen zum Besitz von Mutex von einem Bach zum anderen kann zufällig sein; Es hängt von der Implementierung des Managements ab, beispielsweise in einem bestimmten Betriebssystem. In jedem Fall muss das Management so gebaut werden, dass die aus Mutex bestehenden Ressourcen korrekt verteilt sind und der Unsicherheitseffekt unterdrückt wurde.

Ereignisse sind Objekte (Ereignis) und signalisieren über die Änderung der externen Umgebung. Sie können sich vor einem anderen Ereignis in den Standby-Modus übersetzen oder ihren Zustand an ein anderes Ereignis melden. Auf diese Weise können Ereignisse miteinander interagieren, und die Kontinuität der Daten zwischen Ereignissen sollte sichergestellt werden. Warteausführung Ein Agent muss die Bereitschaft der Daten darüber informieren. Und wie bei der Mutex-Verteilung sollte der Effekt der Unsicherheit unterdrückt werden, so dass beim Arbeiten mit Ereignissen durch den unbekannten Effekt unterdrückt werden sollte. Zum ersten Mal wurde das SMT-Schema in Compaq Alpha 21464-Prozessoren sowie in Intel Xeon MP und Itanium implementiert.

Logischerweise ist CMP einfacher: Hier wird der Parallelismus dadurch sichergestellt, dass jeder der Fäden von seinem eigenen Kern verarbeitet werden. Wenn jedoch die Anwendung nicht in Ströme unterteilt werden kann, wird es (in Abwesenheit von besonderen Maßnahmen) von einem Kern verarbeitet, und in diesem Fall ist die Gesamtleistung des Prozessors auf die Geschwindigkeit eines Kerns beschränkt. Auf den ersten Blick ist der gemäß SMT-Schema gebaute Prozessor flexibler, und daher ist dieses Schema bevorzugt. Eine solche Behauptung trifft jedoch nur bei geringer Transistordichte zu. Wenn die Frequenz von Megaunters gemessen wird, und die Anzahl der Transistoren in einem Kristall nähert sich die Milliarde, und die Verzögerungen bei Sendungssignalen werden groß als die Schaltzeit, die Vorteile empfängt die CMP-Mikroarchitektur, in der die zugehörigen Rechenelemente lokalisiert sind.

Die physikalische Parallelisierung führt jedoch dazu, dass der CMP mit aufeinanderfolgenden Berechnungen nicht zu wirksam ist. Um diesen Nachteil zu überwinden, wird der Ansatz verwendet, der als "spekulative Multi-Dimension" (spekulatives Multithreading) bezeichnet wird. In Russisch hat das Wort "spekulativ" einen negativen semantischen Schirm, sodass wir eine solche Multi-Dimensionalität des "bedingten" nennen. Dieser Ansatz schlägt Hardware- oder Softwareunterstützung vor, um eine serielle Anwendung für bedingte Streams zu befassen, die ihrer Implementierung und Integration von Ergebnissen in den Speicher entspricht.

Evolution CMP.

Die ersten Massen-CMP-Prozessoren waren für den Server-Markt vorgesehen. Unabhängig vom Anbieter waren sie im Wesentlichen zwei unabhängige Superkalarprozessoren auf einem Substrat. Die Hauptmotivation der Erzeugung solcher Strukturen besteht darin, das Volumen zu reduzieren, so dass in einem konstruktiven Prozessoren mehr Prozessoren "Verpackung" sein kann, was die spezifische Leistung pro Volumeneinheit erhöht (was für moderne Rechenzentren kritisch ist). Auf der allgemeinen Systemebene erzielen einige zusätzliche Einsparungen, da die Prozessoren auf einem Kristallsystem allgemeine Systemressourcen wie Highspeed-Kommunikation verwenden. Typischerweise gibt es nur eine gemeinsame Systemschnittstelle zwischen benachbarten Prozessoren ( feige. einer, b).

Apologen zur Verwendung von CMP-Prozessoren rechtfertigen weitere (über zwei) Erhöhung der Anzahl der Kerne mit den Merkmalen der Serverlast, die diese Art von Computern von eingebettet oder für massive Rechensysteme auszeichnen. Eine große Gesamtleistung ist vom Server erforderlich, aber die Verzögerung des Systems ist jedoch nicht so kritisch. Kleines Beispiel: Der Benutzer kann eine Millisekundenverzögerung im Erscheinungsbild einer aktualisierten Webseite einfach nicht bemerken, reagiert jedoch sehr schmerzhaft auf die Serverüberlastung, was die Wartungsunterbrechung verursachen kann.

Die Spezifität der Last gibt CMP-Prozessoren einen weiteren spürbaren Vorteil. Nehmen wir an, dass Sie denselben-Core-Dual-Core-Prozessor ersetzen, können Sie die Taktfrequenz mit derselben Leistung verdoppeln. Gleichzeitig kann der theoretisch die Bearbeitungszeit einer separaten Anforderung zweimal ansteigen, da die physikalische Trennung von Strömungen jedoch die Einschränkung des "Flaschenförms" der NYMANANOVSK-Architektur verringert, ist die Gesamtverzögerung deutlich weniger als doppelt. Bei niedrigerer Häufigkeit und Komplexität eines Nukleus wird der Energieverbrauch erheblich reduziert, und mit zunehmender Anzahl von Kernen werden die aufgelisteten Argumente zugunsten von CMP nur verbessert. Daher besteht der nächste logisch freigegebene Schritt darin, mehrere Kerne zu sammeln und sie mit einem gemeinsamen Cache-Speicher zu kombinieren, beispielsweise wie im Hydra-Projekt (Abbildung 1, B). Und dann können Sie den Kernel komplizieren und machen sie mehrfacher, was im Niagara-Projekt umgesetzt wurde (Abb. 1, D).

Die Komplexität der Prozessoren hat eine weitere wichtige Manifestation. Die Gestaltung des Produkts mit Milliarden von Bauteilen wird zu einer zunehmend mühsamen Aufgabe - trotz der Verwendung von Automatisierungswerkzeugen. Es ist erheblich, dass wir mehr als ein Jahrzehnt erleben, "Bringen Sie es in Sachen", Architektur IA-64. Das Design des CMP-Prozessors ist wesentlich einfacher: Wenn ein entwickelter Kernel vorhanden ist, kann er in den erforderlichen Mengen repliziert werden, und das Design ist durch die Erstellung der internen Kristallinfrastruktur begrenzt. Darüber hinaus vereinfacht die Kerne Einfachheit das Design system-Plastps.Welches zur Skalierung kommt, und letztendlich werden die Indikatoren der E / A-Subsysteme geändert.

Trotz der obigen Argumente gibt es keine vernünftigen Gründe für eine eindeutige Aussage über die Vorteile von CMP im Vergleich zum SMT. Die Erfahrung der Erstellung von Prozessoren, die SMT implementieren, ist viel mehr: Von den Mitte der 80er Jahre wurden mehrere dutzend experimentelle Produkte und mehrere serielle Prozessoren erstellt. Die Geschichte der CPM-Entwicklung ist immer noch kurz: Wenn Sie die Familie der spezialisierten Texas-Instrumente TMS 320C8X-Signalisierungsprozessoren nicht berücksichtigen, wurde das erste erfolgreiche Projekt Hydra, die in der Standford University gemacht wurde. Unter den Hochschulprojekten, die auf das Gebäude von CMP-Prozessoren abzielen, sind auch drei weitere mehr - Wisconsin Multiscalar, Carnegie-Mellon Stampede und mit MIT MIT MIT MUX bekannt.

Mikroprozessor-Hydra.

Der Hydra-Kristall besteht aus vier Prozessorkern basierend auf der MIPS-RISC-Architektur. Jeder Kernel verfügt über einen Befehls-Cache- und Datencache, und alle Kerne werden zu einem zweiten Cache der zweiten Ebene kombiniert. Prozessoren führen einen normalen Satz von MIPS-Befehlen plus bedingten Speicherbefehle (Conditional oder SC) aus, die zur Implementierung von Synchronisations-Primitiven ausgelegt sind. Die Prozessoren und der zweite Cache-Speicher der zweiten Ebene werden mit Lese- / Schreibreifen kombiniert, und zusätzlich gibt es Hilfsadressen- und Steuerungsreifen. Alle diese Reifen sind virtuell, das heißt logisch durch verdrahtete Reifen dargestellt und sind physikalisch in eine Vielzahl von Segmenten unterteilt, unter Verwendung von Repedern und Puffern, die es ermöglichen, die Geschwindigkeit der Kerne zu erhöhen.

Der Lese- / Record-Reifen spielt die Rolle des Systems. Aufgrund seiner Lage im Kristall hat es ausreichend durchsatz Um einen Austausch mit dem Cache für einen Zyklus bereitzustellen. Erreichen Sie solche Leistungsleistungsindikatoren auch in den teuersten traditionellen Multiprozessorarchitekturen, die aufgrund physischer Einschränkungen auf der Zahl schwierig sind externe Kontakte Prozessoren. Effektiver Exchange-Bus mit Cache-Speicher verhindern das Problem der Entstehung des "Flaschenförms" zwischen Kernen und Speicher.

Hydra-Tests mit Lasten mit ausdrücklich ausgeprägter Parallelität auf typischen Web- und Serveranwendungen zeigten, dass die Leistung der vier Kerne im Vergleich zu einem Kern um 3-3,8-mal erhöht wird, das praktisch linear ist. Dies gibt Grund zu der Annahme, dass Prozessoren dieses Typs in diesen Anwendungen ziemlich erfolgreich "passen", in denen Server mit SMP-Architektur verwendet werden. Es ist jedoch klar, dass der Prozessor recht effektiv mit konsistenten Anwendungen funktionieren sollte, sodass eine der wichtigsten Aufgaben darin besteht, eine bedingte Multi-Dimensionalität umzusetzen. In Hydra ist es auf Hardware-Ebene implementiert, und die Wahl dieses Ansatzes ist von der Tatsache gerechtfertigt, dass es keine zusätzlichen Kosten für die Programmierung paralleler Anwendungen erfordern.

Die bedingte Multi-Dimension basiert auf der Partition der Programmbefehlsreihenfolge in Strömungen, die parallel ausgeführt werden können. Natürlich kann es eine logische Interdependenz zwischen solchen Strömen geben, und der spezielle Synchronisationsmechanismus ist in ihren Prozessor eingebettet. Die Essenz seiner Arbeit wird auf die Tatsache reduziert, dass, wenn ein gewisser Thread Daten von einem Parallelstrom erfordert, und sie sind noch nicht bereit, dann wird die Ausführung eines solchen Strömungsstroms suspendiert. Tatsächlich gibt es Elemente der Nichtbestimmung, die oben diskutiert wurde. Der Synchronisationsprozess ist ziemlich kompliziert, da es notwendig ist, alle möglichen Abhängigkeiten zwischen den Threads und den Synchronisationsbedingungen zu ermitteln. Die bedingte Synchronisation ermöglicht es Ihnen, die Programme ohne vorherige Kenntnis ihrer Eigenschaften parallel zu bringen. Es ist wichtig, dass der Synchronisationsmechanismus dynamisch ist, es funktioniert ohne den Eingriff eines Programmiergeräts oder des Compilers, der nur für die statische Abteilung von Anwendungen in der Lage ist, Flüsse zu fließen. Tests des Modells, das auf verschiedenen Tests basiert, haben gezeigt, dass die Mittel der bedingten Multi-Dimensionen es Ihnen ermöglichen, die Leistung des Prozessors mehrmals zu erhöhen, und der offensichtliche Parallelität ist durch einen Test gekennzeichnet, desto weniger ist ein solcher Wert charakterisiert.

Im Jahr 2000 wurde Afara in der Situation strikter Geheimhaltung geschaffen. Ihre Gründer wurden Professor Kunle Olukotun von der Stanford University und dem bekannten Entwickler der Prozessorprozessoren Kon, der Erfahrung in Intel- und Sun-Mikrosystemen hatte. Kon war einer der Autoren der Prozessoren I860- und I960-RISC-Prozessoren in der ersten dieser Unternehmen und Ultrasparc-I in der zweiten. Unter seiner Führung wurde Hydra unter den Prozessorkernen basierend auf dem Sparc-Prozessor recycelt. Im Jahr 2002 wurde Afara von Sun Microsystems erworben, und dies beendete die Geschichte des Hydra-Projekts und die Geschichte von Niagara begann.

Niagara - "Legierung" Majc und Hydra

Am UltraSPARC T1-Prozessor, mehr als Niagara, zwei Hauptvorgänger - Hydra und Majc bekannt.

In der Mitte der 90er Jahre, auf einer Welle von Hobby, spezialisierte Java-Prozessoren, versuchte die Sun Microsystems, einen "mit einem sehr langen Wort" -Prozessor zu erstellen - sehr lange Anweisungswort (VLIW). Diese Initiative wurde als Majc (Mikroprozessorarchitektur für Java Computing) genannt. Wie in anderen Projekten, die zu diesem Zeitpunkt begannen (Intel IA-64 Itanium), gab es in diesem Fall eine Aufgabe, einige der schwierigsten Operationen zu übertragen, um den Compiler zu halten. Die freigegebene Transistorlogik kann verwendet werden, um produktive Funktionsknoten (Funktionseinheiten) zu erstellen, um den produktiven Austausch von Befehlen und Daten zwischen CPUs, Cache-Speicher und Grundspeicher bereitzustellen. So wurde der Hintergrund-Nimanovsky "Flaschenförmig" überwunden.

Majc unterscheidet sich von den meisten Prozessoren in Abwesenheit von spezialisierten Coprozessoren (Unterprozessoren), die allgemein als Funktionsgeräte bezeichnet werden, die zur Durchführung von Vorgängen mit Ganzzahlen, Floating-Punktnummern und Multimedia-Daten bestimmt sind. Drin alles funktionsgeräte waren dieselben, die irgendwelche Operationen ausführen können, die zum einen die Wirksamkeit einzelner Operationen reduzierten, aber auf der anderen Seite die Nutzungsrate des gesamten Prozessors erhöhten.

Niagara verkörpert die besten von zwei alternativen Ansätzen zur Implementierung von Multi-Dimensionen - SMT und CMP. Auf den ersten Blick ist es sehr ähnlich wie Hydra, sondern kann eher Hydra als "Layout" Niagara bezeichnet werden. Zusätzlich zu der Tatsache, dass in letzteren - doppelt so viele Kerne, die jeder von ihnen vier Bächen verarbeiten kann.

Der Niagara-Prozessor bietet Hardwareunterstützung für die Durchführung von 32 Threads, die in acht Gruppen unterteilt sind (jeweils vier Threads). Um jede Gruppe auszuführen, dient der SPARC Pipeline-Verarbeitungskanal ( abb.2.). Es ist ein Prozessorkern, der gemäß der Architektur von SPARC V9 erstellt wurde. Jede SPARC-Pipeline enthält einen Cache für erstklassige Cache für Befehle und Daten. Zusammen zusammen verwenden 32 Streams einen Cache-Speicher mit zweiter Ebene mit einer Kapazität von 3 MB, unterteilt in vier Banken. Der Schalter verbindet acht Kerne, Cache-Banken der zweiten Ebene und andere verteilte CPU-Ressourcen und unterstützt den Wechselkurs von 200 GB / s. Darüber hinaus enthält der Schalter einen Anschluss für E / A-Systeme und Kanäle zum DDR2-DRAM-Speicher, der den Wechselkurs von 20 GB / s bereitstellt; Die maximale Speicherkapazität beträgt bis zu 128 GB.

Das Niagara-Projekt konzentriert sich auf das Solaris-Betriebssystem, sodass alle Anwendungen, die Solaris ausführen, ohne Änderungen an einem neuen Prozessor durchgeführt werden können. Die Anwendungssoftware nimmt Niagara als 32 diskretes Prozessor auf.

Zellprojekt

Eigener Ansatz zur Erstellung von Multi-Core-Prozessoren wurde die IBM Corporation angeboten, deren Zellprojekt "Heterogener Chip-Multiprozessor" genannt wurde. Die Zellarchitektur bezieht sich auch auf die Zellbreitband-Motorarchitektur (CBEA). Der Zell-Multiprozessor besteht aus dem IBM 64-Bit-Power Architecture-Kernel und acht spezialisierten Coprozessoren, die den "One-Befehl viel Daten" implementieren. In IBM heißt diese Architektur synergistische Prozessoreinheit (SPU). Es kann bei Bedarf erfolgreich eingesetzt werden, um große Datenströme, beispielsweise in der Kryptographie, in verschiedenen Multimedia- und wissenschaftlichen Anwendungen, wie beispielsweise Fast Fourier-Transformation oder Matrixoperationen, zu verarbeiten. Die Zellarchitektur wurde von den IBM-Forschern in Verbindung mit Kollegen der IBM Systems Technology Group, Sony und Toshiba erstellt, und der erste Antrag sollte Multimedia-Geräte sein, die große Berechnungen erfordern.

Die Basis der synergistischen Prozessoreinheit ist eine Reihe von Anweisungsset-Architektur (ISA). Befehle haben eine Länge von 32 Bit und werden an drei Operanden adressiert, die in dem Registerpool angeordnet sind, was in jedem aus 128 Bit-Registern besteht.

In Zukunft wird die Verwendung von Zelle nicht begrenzt gaming-Systeme.. Auf der Warteschlange - Fernsehen hochauflösend, Home-Server und sogar Supercomputer.

Literatur
  1. Leonid Chernyak. Die Prüfung des Primats - das Ende der Stagnation? // offene Systeme. - 2003, №5.
  2. Mikhail Kuzminsky. Multiline-Mikroprozessor-Architektur // Open-Systeme. - 2002, №1.
  3. Rajat ein Dua, Bhushan LokHande. Eine vergleichende Studie von SMT- und CMP-Multiprozessoren. -

Wenn Sie mit der Theorie von Multithreading verstanden haben, berücksichtigen Sie das praktische Beispiel - Pentium 4. In der Bühne der Entwicklung dieses Prozessors haben Intel-Ingenieure weiterhin daran gearbeitet, seine Leistung zu verbessern, ohne Änderungen an der Programmoberfläche vorzunehmen. Die fünf einfachen Wege wurden in Betracht gezogen:
1. Taktfrequenz anheben.
2. Platzierung auf einem Chip mit zwei Prozessoren.
3. Einführung neuer Funktionsblöcke.
1. Erweiterung des Förderers.
2. Verwenden von Multithreading.
Der offensichtlichste Weg, um die Geschwindigkeit zu verbessern, besteht darin, die Taktfrequenz zu erhöhen, ohne andere Parameter zu ändern. In der Regel hat jedes nachfolgende Prozessormodell eine etwas höhere Taktfrequenz als der vorherige. Leider sind Entwickler mit einer einfachen Erhöhung der Taktfrequenz mit zwei Problemen konfrontiert: Eine Erhöhung des Stromverbrauchs (der für Laptop-Computer und andere Rechengeräte relevant ist, die Batterien laufen) und Überhitzung (das erfordert, dass er effizientere Wärmesenken erzeugt werden müssen).
Das zweite Verfahren ist die Platzierung auf dem Chip mit zwei Prozessoren - relativ einfach, aber es ist mit der Verdoppelung des von der Mikroschaltung belegten Fläche verbunden. Wenn jeder Prozessor mit einem eigenen Cache-Speicher geliefert wird, ist die Anzahl der Mikroschüsse auf der Platte an der Haluzierung, es bedeutet jedoch auch, die Produktionskosten zu verdoppeln. Wenn für beide Prozessoren ein gemeinsamer Cache-Speicher vorliegt, kann eine signifikante Erhöhung des besetzten Bereichs vermieden werden, aber in diesem Fall erfolgt ein weiteres Problem - die Menge des Cache-Speichers in Bezug auf jeden Prozessor ist halbiert, und dies ist zwangsläufig von der Leistung beeinträchtigt . Wenn außerdem professionelle Serveranwendungen die Ressourcen mehrerer Prozessoren vollständig nutzen können, wird in herkömmlichen Desktop-Programmen eine interne Parallelität in einem viel geringeren Umfang entwickelt.
Die Einführung neuer Funktionsblöcke ist auch nicht schwierig, aber es ist wichtig, das Gleichgewicht zu halten. Was ist die Bedeutung der Top-Ten-Blöcke von ALU, wenn der Chip keine Befehle an den Förderer mit einer Geschwindigkeit ausgeben kann, mit der Sie alle diese Blöcke herunterladen können?
Der Förderer mit einer erhöhten Anzahl von Schritten, die in der Lage sind, die Aufgaben in kleinere Segmente zu trennen und in kurzen Zeiträumen zu verarbeiten, zunimmt die Leistung andererseits, erhöht die negativen Folgen der falschen Prognose von Übergängen, Cachern, Interrupts und andere Ereignisse, die die normalen Kursverarbeitungsbefehle im Prozessor verletzen. Um die Möglichkeiten eines erweiterten Förderers vollständig umzusetzen, ist es außerdem erforderlich, die Taktfrequenz zu erhöhen, und dies führt, wie wir wissen, zu einem erhöhten Energieverbrauch und Wärmeübertragung führt.
Schließlich ist es möglich, Multithreading umzusetzen. Der Vorteil dieser Technologie besteht darin, einen zusätzlichen Software-Stream einzuführen, mit dem Sie diese Hardwarerressourcen in Kraft treten können, die sonst einfach gewesen wären. Nach den Ergebnissen der Experimentierstudien fanden die Intel-Entwickler, dass der Anstieg der Mikroschaltung um 5% bei der Implementierung von Multithreading für viele Anwendungen um 25% erhöht. Xeon 2002 wurde der erste Intel-Prozessor mit Unterstützung für Multithreading. Anschließend wurde Multithreading ausgehend von der Frequenz von 3,06 GHz in den Pentium 4 eingeführt. Intel Lineal ruft die Implementierung von Multithreading in Pentium 4-Hypermatochness (Hyperthreading) auf.
Das Hauptprinzip der Hyperpotimität ist die gleichzeitige Ausführung von zwei Softwareströmen (oder Prozessen - der Prozessor unterscheidet die Prozesse nicht von Software-Streams). Das Betriebssystem berücksichtigt den Pentium 4-Hypervision-Prozessor als Zweiprozessorkomplex mit gemeinsamer Caches und einem grundlegenden Speicher. Die Planung des Betriebssystems führt für jeden Softwarestrom separat aus. Somit können zwei Anwendungen gleichzeitig ausgeführt werden. Das E-Mail-Programm kann beispielsweise Nachrichten an senden oder empfangen hintergrundmodusBis der Benutzer mit der interaktiven Anwendung interagiert, dh der Daemon und das Benutzerprogramm werden gleichzeitig durchgeführt, als ob zwei Prozessoren dem System verfügbar sind.
Anwendungsprogramme, an denen die Möglichkeit der Ausführung in Form von mehreren Softwarestreben beteiligt ist, können sowohl "virtuelle Prozessoren" verwenden. Zum Beispiel können Videopanditing-Programme normalerweise Benutzer an alle Frames anwenden. Solche Filter passen die Helligkeit, den Kontrast, die Farbbilanz und andere Eigenschaften von Frames an. In einer solchen Situation kann das Programm einen virtuellen Prozessor zuweisen, um auch Frames zu verarbeiten, und der andere, um ungerade zu verarbeiten. Gleichzeitig funktionieren zwei Prozessoren völlig unabhängig voneinander.
Da Software-Streams auf dieselben Hardwareressourcen wenden, ist diese Thread-Koordination erforderlich. Im Rahmen der Hypertonie identifizierten die Intel-Entwickler vier nützliche Ressourcenmanagement-Strategien: Vervielfältigung von Ressourcen sowie starre, Schwellenwert und vollständiger Ressourcenabscheidung. Betrachten Sie diese Strategien.
Beginnen wir mit der Ressourcenverdopplung (Ressourcenverdopplung). Wie Sie wissen, werden einige Ressourcen zum Zwecke der Organisation von Software-Streams dupliziert. Da beispielsweise jeder Software-Stream individuelle Steuerung erfordert, benötigen Sie einen zweiten Befehlszähler. Darüber hinaus müssen Sie die zweite Tabelle der Anzeige von Architekturregistern (EAH, EU usw.) an die physischen Register eingeben. In ähnlicher Weise ist der Interrupt-Controller dupliziert, da die Verarbeitung von Interrupts für jeden Strom einzeln ausgeführt wird.
Als nächstes folgt die Partitionierte Ressourcenhilfsmethode zwischen den Softwareströmen. Wenn der Prozessor beispielsweise eine Warteschlange zwischen den beiden funktionalen Stufen des Förderers bereitstellt, kann die Hälfte der Schlitze einen Durchfluss 1 gegeben werden, der andere Halbstrom 2. Die Trennung von Ressourcen ist leicht umzusetzen, führt nicht zum Ungleichgewicht und bietet vollständige Unabhängigkeit der Softwareströme voneinander. Mit vollständiger Abteilung aller Ressourcen dreht sich ein Prozessor tatsächlich in zwei. Andererseits kann eine solche Situation vorhanden sein, bei der ein Programmfaden die Ressourcen nicht nutzt, die für den zweiten Bach nützlich sein könnten, aber in Bezug auf die er keine Zugangsbehörde hat. Infolgedessen sind die Ressourcen, die in einer anderen Situation beteiligt sein könnten, im Leerlauf.
Das Gegenteil von starrer Trennung ist eine vollständige Ressourcenabscheidung (vollständiger Ressourcenteilung). In diesem Schema kann jeder Software-Stream auf die gewünschten Ressourcen zugreifen, und sie werden in der Reihenfolge für Zugriffsanfragen gewartet. Betrachten Sie eine Situation, in der ein schneller Strom, der hauptsächlich aus Zusatz- und Subtraktionsvorgängen besteht, mit einem langsamen Fluss, der mit einem langsamen Durchfluss besteht, der Multiplikations- und Divisionsvorgänge implementiert. Wenn die Befehle schneller aufgerufen werden als schneller als Multiplikations- und Divisionsvorgänge, werden die Anzahl der Befehle, die im Rahmen des langsamen Fließens und der Warteschlange auf dem Förderer entstehen, allmählich. Letztendlich füllen diese Befehle die Warteschlange aus, dadurch wird der schnelle Strömungsfluss aufgrund des Mangelsmangels anhalten. Die vollständige Ressourcentrennung löst das Problem der nicht optimalen Ausgaben von gemeinsam genutzten Ressourcen, erzeugt jedoch ein Ungleichgewicht ihres Verbrauchs - ein Faden kann den anderen verlangsamen oder stoppen.
Das Zwischenschema wird innerhalb der Ressourcenschwelle (Schwellenwert-Ressourcenteilung) implementiert. Gemäß diesem Schema kann jeder Softwarestrom ein bestimmtes (limitiertes) Ressourcenvolumen dynamisch empfangen. In Bezug auf replizierte Ressourcen bietet dieser Ansatz Flexibilität ohne Bedrohung für einen der Softwareströme aufgrund der Unmöglichkeit, Ressourcen zu erhalten. Wenn zum Beispiel jeder der Streams verbietet, mehr als 3/4 der Befehlswarteschlangen zu besetzen, wird der erhöhte Ressourcenverbrauch mit einem langsamen Durchfluss die Ausführung des Schnelligkeit nicht verhindern.
Pentium 4 HyperPlow-Modell kombiniert unterschiedliche Ressourcen-Trennstrategien. Somit wird ein Versuch unternommen, alle mit jeder Strategie verbundenen Probleme zu lösen. Die Vervielfältigung ist in Bezug auf Ressourcen umgesetzt, der Zugriff, auf den beide Softwareströme (insbesondere in Bezug auf den Befehlszähler, den Anzeigetabellen und Interrupt-Controllern) ständig erforderlich ist. Die Vervielfältigung dieser Ressourcen erhöht den Mikroschaltung um nur 5% - Sie stimmen einverstanden, eine angemessene Gebühr für Multithreading. Ressourcen, die in einem solchen Volumen verfügbar sind, das durch die Wahrscheinlichkeit, dass sie mit einem Stream (z. B. Cache-Zeilen) praktisch eliminiert wird, dynamisch verteilt. Der Zugang zu Ressourcen, die die Arbeit des Förderers (insbesondere seine zahlreichen Warteschlangen) steuern, ist auf jeden Programmflow geteilt - die Hälfte der Schlitze. Der Hauptförderer der in Pentium 4 implementierten NetBurst-Architektur ist in Fig. 2 dargestellt. 8.7; Weiß I. graue Bereiche Diese Abbildung zeigt den Ressourcenzuteilungsmechanismus zwischen weißen und grauen Softwareströmen an.
Wie Sie sehen, sind alle Warteschlangen auf dieser Illustration unterteilt - jeder Softwarestrom wird bei der Hälfte der Slots hervorgehoben. Keiner der Software-Streams kann den Betrieb eines anderen einschränken. Die Verteilereinheit und die Substitution werden ebenfalls getrennt. Die Planerressourcen sind dynamisch unterteilt, aber basierend auf einem bestimmten Schwellenwert - somit kann keiner der Threads alle Schichten der Warteschlange annehmen. Für alle anderen Stufen des Förderers gibt es eine vollständige Trennung.
Mit Multithreading ist nicht alles so einfach. Sogar eine solche progressive Technik hat Mängel. Die starre Ressourcentrennung ist nicht mit schwerwiegenden Kosten verbunden, sondern die dynamische Trennung, insbesondere unter Berücksichtigung der Schwellenwerte, erfordert den Verfolgung des Ressourcenverbrauchs in der Ausführungsphase. In einigen Fällen funktionieren die Programme in einigen Fällen ohne Multithreads deutlich besser als damit. Angenommen, zum Beispiel in Anwesenheit von zwei Softwareströmen für die normale Funktionsweise erfordert jeder von ihnen einen 3/4-Cache. Wenn sie abwechselnd ausgeführt wurden, würde jeweils eine ausreichende Effizienz mit einer geringen Menge an Cache-Fehlern aufweisen (wie bekannt, um mit zusätzlichen Kosten zusammenhängen). Bei der parallelen Ausführung von Cache-Misses wäre jeder viel größer, und das Endergebnis wäre schlimmer als ohne Multithreading.
Weitere Informationen zum Mechanismus des Multithreading-Wiederholens 4 können Sie lernen.

Die Klingel.

Es gibt diejenigen, die diese Nachricht vor Ihnen gelesen haben.
Abonnieren Sie Artikel frisch.
Email
Name
Nachname
Wie willst du die Glocke lesen?
Ohne spam.