Stream -Verarbeitung

Im Informatik, Stream -Verarbeitung (auch bekannt als Ereignisstromverarbeitung, Datenstromverarbeitung, oder Verteilte Stream -Verarbeitung) ist ein Programmierparadigma welche Ansichten Datenströmeoder Sequenzen von Ereignissen rechtzeitig, wie die zentralen Eingangs- und Ausgabeobjekte von Berechnung. Die Stream -Verarbeitung umfasst Datenflow -Programmierung, reaktive Programmierung, und verteilt Datenverarbeitung.[1] Stream -Verarbeitungssysteme zielen darauf ab, freizulegen Parallelverarbeitung für Datenströme und verlassen sich auf Streaming -Algorithmen für eine effiziente Implementierung. Das Software -Stack Für diese Systeme umfasst Komponenten wie z. Programmiermodelle und Abfragesprachenzum Ausdrücken der Berechnung; Stream -Management -Systemefür die Verteilung und Planung; und Hardwarekomponenten für Beschleunigung einschließlich schwimmende Punkteinheiten, Grafikverarbeitungseinheiten, und Feldprogrammierbare Gate-Arrays.[2]

Das Stream Processing Paradigma vereinfacht die parallele Software und Hardware durch die Einschränkung der durchgeführten parallele Berechnung. Bei einer Folge von Daten (a Strom), eine Reihe von Operationen (Kernelfunktionen) wird auf jedes Element im Stream angewendet. Kernelfunktionen sind normalerweise Pipelineund eine optimale lokale Wiederverwendung von On-Chip-Speicher wird versucht, den Verlust der Bandbreite zu minimieren, die mit der Interaktion mit externen Speichern verbunden ist. Einheitliches Streaming, wo eine Kernelfunktion auf alle Elemente im Strom angewendet wird, ist typisch. Da die Kernel- und Stream-Abstraktionen Datenabhängigkeiten enthüllen, können Compiler-Tools die Aufgaben des On-Chip-Managements vollständig automatisieren und optimieren. Stream -Verarbeitungshardware kann verwendet werden Anzeigetafelzum Beispiel um a zu initiieren a direkter Speicherzugriff (DMA) Wenn Abhängigkeiten bekannt werden. Die Eliminierung des manuellen DMA -Managements reduziert die Komplexität der Software und eine zugeordnete Beseitigung für Hardware -zwischengestrichene E/A. reduziert die Expanse des Datenbereichs, die durch spezielle Recheneinheiten wie z. B. mit dem Dienst beteiligt sein muss Arithmetische Logikeinheiten.

In den 1980er Jahren wurde die Stream -Verarbeitung innerhalb der Inneren untersucht Datenflow -Programmierung. Ein Beispiel ist die Sprache Sisal (Streams und Iteration in einer einzelnen Zuweisungssprache).

Anwendungen

Die Stream-Verarbeitung ist im Wesentlichen ein Kompromiss, das von einem datenzentrierten Modell gesteuert wird, das für herkömmliche DSP- oder GPU-Anwendungen sehr gut funktioniert (wie Bild, Video und digitale Signalverarbeitung) Aber weniger zur allgemeinen Verarbeitung mit randomisierter Datenzugriff (z. B. Datenbanken). Durch die Opfer eines gewissen Flexibilität im Modell ermöglichen die Auswirkungen eine einfachere, schnellere und effizientere Ausführung. Abhängig vom Kontext, Prozessor Das Design kann auf maximale Effizienz oder einen Kompromiss gegen Flexibilität abgestimmt werden.

Die Stream -Verarbeitung eignet sich besonders für Anwendungen, die drei Anwendungsmerkmale aufweisen:

  • Berechnungsintensität, die Anzahl der arithmetischen Operationen pro I/A oder globaler Speicherreferenz. In vielen Signalverarbeitungsanwendungen ist es heute weit über 50: 1 und nimmt mit algorithmischer Komplexität zu.
  • Datenparallelität existiert in einem Kernel, wenn dieselbe Funktion auf alle Datensätze eines Eingabestreams angewendet wird und eine Reihe von Datensätzen gleichzeitig verarbeitet werden kann, ohne auf Ergebnisse aus früheren Datensätzen zu warten.
  • Datenlokalität ist eine bestimmte Art von zeitlicher Lokalität, die in Signal- und Medienverarbeitungsanwendungen üblich ist, bei denen einmal Daten erstellt werden, ein- oder zweimal später in der Anwendung gelesen und nie wieder gelesen werden. Zwischen den Kernel- und Zwischendaten innerhalb von Kernelfunktionen können diese Lokalität mithilfe des Programmiermodells mit Stream -Verarbeitung direkt erfassen.

Beispiele für Datensätze in Streams sind:

  • In Grafiken kann jeder Datensatz der Scheitelpunkt-, Normal- und Farbinformationen für ein Dreieck sein.
  • Bei der Bildverarbeitung kann jeder Datensatz ein einzelnes Pixel aus einem Bild sein.
  • In einem Video -Encoder kann jeder Datensatz 256 Pixel bestehen, die ein Datenmakroblock bilden. oder
  • Bei der drahtlosen Signalverarbeitung kann jeder Datensatz eine Abfolge von Proben sein, die von einer Antenne erhalten wurden.

Für jeden Datensatz können wir nur aus der Eingabe lesen, Vorgänge darauf ausführen und in die Ausgabe schreiben. Es ist zulässig, mehrere Eingänge und mehrere Ausgänge zu haben, aber niemals ein Gedächtnis, das sowohl lesbar als auch beschreibbar ist.

Beispiele

Durch die Illustration zeigen die folgenden Codefragmente die Erkennung von Mustern in Ereignisströmen. Das erste ist ein Beispiel für die Verarbeitung eines Datenstroms mithilfe eines kontinuierlichen Sql Abfrage (eine Abfrage, die für die für die Zeit von Zeitstempeln und Fensterdauer ankommende Daten für die Verarbeitung von Forever -Verarbeitung ausgeführt wird). Dieses Code -Fragment veranschaulicht eine Verbindung von zwei Datenströmen, einen für Aktienbestellungen und einen für die resultierenden Aktienhandel. Die Abfrage gibt einen Stream aller Bestellungen aus, die innerhalb einer Sekunde des aufgebenen Reihenfolge mit einem Handel übereinstimmen. Der Ausgangsstrom wird nach dem Zeitstempel sortiert, in diesem Fall der Zeitstempel aus dem Ordnungsstrom.

AUSWÄHLEN Datenstrom  Aufträge.Zeitstempel, Aufträge.Auftragsnummer, Aufträge.Ticker,  Aufträge.Menge, Handeln.Menge AUS Aufträge BEITRETEN Geschäfte ÜBER (ANGEBOT INTERVALL '1' ZWEITE Folgen) AN Aufträge.Auftragsnummer = Geschäfte.Auftragsnummer; 

Ein weiteres Probencode -Fragment -Fragment erkennt Hochzeiten unter einem Fluss externer "Ereignisse" wie kirchlichen Glocken, das das Aussehen eines Mannes in einem Smoking oder Morgenanzug, eine Frau in einem fließenden weißen Kleid und Reis durch die Luft fliegt. Ein "komplexes" oder "zusammengesetzter" Ereignis ist das, was man aus den einzelnen einfachen Ereignissen findet: Eine Hochzeit findet statt.

WENN Person.Geschlecht Gleich "Mann" UND Person.Kleidung Gleich "Smoking" GEFOLGT-DURCH  Person.Kleidung Gleich "Kleid" UND  (Kirchenglocke ODER Rice_flying) INNERHALB 2 Std. AKTION Hochzeit 

Vergleich zu früheren parallele Paradigmen

Grundlegende Computer wurden mit einem sequentiellen Ausführungsparadigma gestartet. Traditionell CPUs sind Sisd basiert, was bedeutet, dass sie konzeptionell nur eine Operation gleichzeitig ausführen. Während sich die Berechnungsbedürfnisse der Welt entwickelte, nahm die Datenmenge sehr schnell zu. Es war offensichtlich, dass das sequentielle Programmiermodell nicht mit dem erhöhten Bedarf an Verarbeitungsleistung fertig werden konnte. Es wurden verschiedene Anstrengungen unternommen, um alternative Wege zu finden, um massive Berechnungen durchzuführen, aber die einzige Lösung bestand darin, ein gewisses Maß an paralleler Ausführung auszunutzen. Das Ergebnis dieser Bemühungen war Simd, ein Programmierparadigma, mit dem eine Anweisung auf mehrere Instanzen von (verschiedenen) Daten angewendet wurde. Meistens wurde Simd in a verwendet SWAR Umgebung. Durch die Verwendung komplizierterer Strukturen könnte man auch haben Mimd Parallelität.

Obwohl diese beiden Paradigmen effizient waren, waren reale Implementierungen von Einschränkungen von Problemen mit Gedächtnisausrichtungen bis hin zu Synchronisationsproblemen und einer begrenzten Parallelität geplagt. Nur wenige SIMD-Prozessoren überlebten als eigenständige Komponenten; Die meisten waren in Standard -CPUs eingebettet.

Betrachten Sie ein einfaches Programm, das zwei Arrays mit 100 4-Komponenten addiert, Vektoren (d. h. insgesamt 400 Zahlen).

Konventionelles, sequentielles Paradigma

zum (int i = 0; i < 400; i++)   Ergebnis[i] = Quelle0[i] + Quelle1[i]; 

Dies ist das aufeinanderfolgende Paradigma, das am bekanntesten am bekanntesten ist. Es gibt Variationen (z. B. innere Schleifen, Strukturen und dergleichen), aber sie sind letztendlich auf dieses Konstrukt hinunterfahren.

Parallel SIMD -Paradigma, gepackte Register (SWAR)

zum (int El = 0; El < 100; El++) // für jeden Vektor   Vektorsumme(Ergebnis[El], Quelle0[El], Quelle1[El]); 

Dies ist tatsächlich zu vereinfacht. Es geht an die Anweisung Vektorsumme Arbeiten. Obwohl dies mit dem passiert AnweisungsintrinsikEs werden hier nicht viele Informationen berücksichtigt, wie z. B. die Anzahl der Vektorkomponenten und deren Datenformat. Dies geschieht aus Klarheit.

Sie können jedoch sehen, dass diese Methode die Anzahl der dekodierten Anweisungen von entschlüsselt wird Zahlen * Komponenten zu Zahlen. Die Anzahl der Sprunganweisungen wird ebenfalls verringert, da die Schleife weniger Mal ausgeführt wird. Diese Gewinne resultieren aus der parallelen Ausführung der vier mathematischen Operationen.

Was jedoch passiert ist, ist, dass das verpackte SIMD -Register eine bestimmte Datenmenge enthält, sodass es nicht möglich ist, mehr Parallelität zu erhalten. Die Geschwindigkeit ist durch die Annahme, dass wir vier parallele Operationen durchgeführt haben, etwas begrenzt (bitte beachten Sie, dass dies für beide üblich ist Altivec und Sse).

Parallel Stream Paradigma (SIMD/MIMD)

// Dies ist eine fiktive Sprache für Demonstrationszwecke. Elemente = Array Streamelement[Nummer, Nummer]) [100] Kernel = Beispiel Streamkernel("@arg0 [@iter]") Ergebnis = Kernel.aufrufen(Elemente) 

In diesem Paradigma wird der gesamte Datensatz definiert, anstatt dass jeder Komponentenblock separat definiert wird. Die Beschreibung der Datenmenge wird in den ersten beiden Zeilen angenommen. Danach wird das Ergebnis aus den Quellen und dem Kernel abgeleitet. Der Einfachheit halber gibt es eine 1: 1 -Zuordnung zwischen Eingabe- und Ausgabedaten, dies muss jedoch nicht sein. Angewandte Kerne können auch viel komplexer sein.

Eine Implementierung dieses Paradigmas kann eine Schleife intern "ausrollen". Dies ermöglicht den Durchsatz mit der Chip -Komplexität, wobei Hunderte von Alus leicht verwendet werden.[3][4] Die Beseitigung komplexer Datenmuster macht einen Großteil dieser zusätzlichen Leistung zur Verfügung.

Während die Stream -Verarbeitung ein Zweig der SIMD/MIMD -Verarbeitung ist, dürfen sie nicht verwirrt werden. Obwohl SIMD -Implementierungen häufig auf "Streaming" funktionieren können, ist ihre Leistung nicht vergleichbar: Das Modell sieht ein ganz anderes Verwendungsmuster vor, das eine weitaus größere Leistung für sich selbst ermöglicht.

Es wurde festgestellt, dass bei der Anwendung von generischen Prozessoren wie der Standard -CPU nur eine 1,5 -fache Beschleunigung erreicht werden kann.[5] Im Gegensatz dazu erreichen Ad-hoc-Stream-Prozessoren leicht über 10-fache Leistung, was hauptsächlich auf den effizienteren Speicherzugriff und höhere Ebenen der parallele Verarbeitung zurückzuführen ist.[6]

Obwohl das Modell verschiedene Flexibilitätsgrade ermöglicht, stellen Stream -Prozessoren normalerweise einige Einschränkungen für den Kernel oder die Stromgröße auf. Zum Beispiel fehlt der Verbraucherhardware häufig die Fähigkeit, Mathematik mit hoher Präzision auszuführen, komplexe Indirektionsketten oder gilt für die Anzahl der Ausführung von Anweisungen.

Forschung

Universität in Stanford Zu den Stream-Verarbeitungsprojekten gehörten das Stanford Echtzeit programmierbare Schattierungsprojekt, das 1999 gestartet wurde.[7] Ein Prototyp namens Imagine wurde 2002 entwickelt.[8] Ein Projekt namens Merrimac lief bis etwa 2004.[9] AT&T auch recherchierte streamverstärkte Prozessoren als Grafikverarbeitungseinheiten schnell in Geschwindigkeit und Funktionalität entwickelt.[1] Seit diesen frühen Tagen wurden Dutzende von Stream -Verarbeitungssprachen sowie spezielle Hardware entwickelt.

Programmiermodellnotizen

Die unmittelbarste Herausforderung im Bereich der parallele Verarbeitung liegt nicht so sehr in der Art der verwendeten Hardware-Architektur, aber wie einfach es sein wird, das betreffende System in einer realen Umgebung mit akzeptabler Leistung zu programmieren. Maschinen wie Imagine verwenden ein unkompliziertes Einzel-Thread-Modell mit automatisierten Abhängigkeiten, Speicherzuweisung und DMA Planung. Dies an sich ist ein Ergebnis der Forschung am MIT und Stanford bei der Suche nach einem optimalen Aufgabenschichtung zwischen Programmierer, Tools und Hardware. Programmierer schlagen Tools bei der Zuordnung von Algorithmen auf parallele Hardware, und Tools schlagen Programmierer, um intelligenteste Speicherzuweisungsschemata usw. zu erfassen usw. von besonderer Bedeutung sind MIMD -Designs wie z. B. Zelle, für den der Programmierer mit der Anwendungspartitionierung über mehrere Kerne hinweg zu tun hat und sich mit der Prozesssynchronisation und dem Lastausgleich befassen muss. Effiziente Multi-Core-Programmierwerkzeuge fehlen heute stark.

Ein Nachteil der SIMD -Programmierung war das Problem von Strukturen (AOS) und Struktur der Arrays (SOA). Programmierer wollten oft Datenstrukturen mit einer „echten“ Bedeutung erstellen, zum Beispiel:

 // ein Teilchen in einem dreidimensionalen Raum. Struktur partikel_t {   schweben x, y, z;  // nicht einmal ein Array!   ohne Vorzeichen Byte Farbe[3]; // 8 Bit pro Kanal, sagen wir, wir kümmern uns nur um RGB   schweben Größe;   // ... und viele andere Attribute können folgen ... }; 

Was passiert ist, dass diese Strukturen dann zusammengebaut wurden Arrays Dinge gut organisiert zu halten. Das ist Array von Strukturen (AOS). Wenn die Struktur im Speicher angelegt wird, erzeugt der Compiler verschachtelte Daten, in dem Sinne, dass alle Strukturen zusammenhängend sein, aber es gibt einen konstanten Versatz zwischen beispielsweise dem "Größen" -attribut einer Strukturinstanz und demselben Element der folgenden Instanz. Der Offset hängt von der Strukturdefinition ab (und möglicherweise andere Dinge, die hier nicht berücksichtigt werden, wie z. B. die Richtlinien des Compilers). Es gibt auch andere Probleme. Zum Beispiel können die drei Positionsvariablen nicht so simd-ordentlich sein, da sie nicht sicher ist, ob sie im kontinuierlichen Speicherplatz zugewiesen werden. Um sicherzustellen, dass SIMD -Operationen darauf funktionieren können, müssen sie an einem "gepackten Speicherort" oder zumindest in einem Array gruppiert werden. Ein weiteres Problem liegt sowohl in "Farbe" als auch in "XYZ", die in dreikomponenten Vektormengen definiert werden. SIMD-Prozessoren unterstützen normalerweise nur 4-Komponenten-Operationen (mit einigen Ausnahmen).

Diese Art von Problemen und Einschränkungen machte die SIMD -Beschleunigung auf Standard -CPUs ziemlich böse. Die vorgeschlagene Lösung, Struktur der Arrays (SOA) folgt:

Struktur partikel_t {   schweben *x, *y, *z;   ohne Vorzeichen Byte *Farbe Rot, *Farbe blau, *Farbe grün;   schweben *Größe; }; 

Für Leser, die nicht erlebt werden mit C, Das '*' vor jeder Kennung bedeutet einen Zeiger. In diesem Fall werden sie verwendet, um auf das erste Element eines Arrays zu verweisen, das später zugewiesen werden soll. Zum Java Programmierer, dies entspricht ungefähr "[]". Der Nachteil hier ist, dass die verschiedenen Attribute im Speicher verbreitet werden können. Um sicherzustellen, dass dies keine Cache -Misses verursacht, müssen wir alle verschiedenen "Reds", dann alle "Grünen" und "Blues" aktualisieren.

Für Stream -Prozessoren wird die Verwendung von Strukturen gefördert. Aus Anwendungssicht können alle Attribute mit einer gewissen Flexibilität definiert werden. Wenn Sie GPUs als Referenz nehmen, sind eine Reihe von Attributen (mindestens 16) verfügbar. Für jedes Attribut kann die Anwendung die Anzahl der Komponenten und das Format der Komponenten angeben (aber nur primitive Datentypen werden vorerst unterstützt). Die verschiedenen Attribute werden dann an einen Speicherblock angehängt, um möglicherweise a zu definieren schreiten Zwischen "aufeinanderfolgenden" Elementen derselben Attribute, die effektiv verschachtnete Daten zulassen. Wenn die GPU mit der Stream -Verarbeitung beginnt, wird dies versammeln Alle verschiedenen Attribute in einem einzigen Satz von Parametern (normalerweise sieht dies wie eine Struktur oder eine "Magic Global Variable" aus), führt die Operationen aus und führt zu Streuung Die Ergebnisse zu einem Speicherbereich für die spätere Verarbeitung (oder das Abrufen).

Modernere Stream -Verarbeitungs -Frameworks bieten eine FIFO -ähnliche Schnittstelle zur Strukturdaten als wörtlicher Stream. Diese Abstraktion bietet ein Mittel, um Datenabhängigkeiten implizit anzugeben und gleichzeitig die Laufzeit/Hardware zu ermöglichen, dieses Wissen für eine effiziente Berechnung voll auszunutzen. Eine der einfachsten und effizientesten Modalitäten für die Stream -Verarbeitungsmodalitäten für C ++ ist, ist Raftlib, was ermöglicht, unabhängig zu verknüpfen Kernel berechnen zusammen als Datenflussdiagramm mit C ++ Stream -Operatoren. Als Beispiel:

#enthalten  #enthalten  #enthalten  #enthalten  Klasse hallo : Öffentlichkeit Floß::Kernel { Öffentlichkeit:   hallo() : Floß::Kernel()   {   Ausgang.Addport< std::Saite >( "0" );    }   virtuell Floß::Kstatus Lauf()   {   Ausgang[ "0" ].drücken( std::Saite( "Hallo Welt\n" ) );   Rückkehr( Floß::Pause );    } }; int hauptsächlich( int argc, verkohlen **argv ) {   /** Instanziierung des Druckkerns **//   Floß::drucken< std::Saite > p;   /** Instanziierung von Hello World Kernel **/   hallo hallo;   /** Machen Sie ein Kartenobjekt **//   Floß::Karte m;   /** Fügen Sie Kerne zum Karte hinzu, sowohl Hallo als auch P werden gleichzeitig ausgeführt **//   m += hallo >> p;   /** Führen Sie die Karte aus **//   m.exe();   Rückkehr( Exit_success ); } 

Berechnungsmodelle für die Stream -Verarbeitung

Neben der Angabe von Streaming-Anwendungen in hochrangigen Sprachen wurden auch Berechnungsmodelle (MOCs) häufig verwendet Datenfluss Modelle und prozessbasierte Modelle.

Generische Prozessorarchitektur

In der Vergangenheit begann CPUs aufgrund der ständig steigenden Leistung im Vergleich zu relativ langsam wachsenden externen Speicherbandbreite verschiedene Ebenen des Speicherzugriffs-Optimierungen. Als sich diese Lücke weit verbreiterte, waren große Mengen an die Flächengebiete dem Verstecken von Gedächtnislatenzen gewidmet. Da das Abrufen von Informationen und Opcodes zu diesen wenigen ALUs teuer ist, ist nur sehr wenig Würfelbereich für die tatsächlichen mathematischen Maschinen gewidmet (als grobe Schätzung ist es weniger als 10%).

Eine ähnliche Architektur gibt es in Stream -Prozessoren, aber dank des neuen Programmiermodells ist die Anzahl der Transistoren, die dem Management gewidmet sind, tatsächlich nur sehr gering.

Aus Sicht des gesamten Systems existieren in einer kontrollierten Umgebung normalerweise Streamprozessoren. GPUs existieren in einem Add-In-Board (dies scheint auch für Imagine zu gelten). CPUs erledigen die schmutzige Aufgabe, Systemressourcen zu verwalten, Anwendungen auszuführen und dergleichen.

Der Stream-Prozessor ist normalerweise mit einem schnellen, effizienten, proprietären Speicherbus ausgestattet (Querlattenschalter sind jetzt üblich, in der Vergangenheit wurden Multi-Busse verwendet). Die genaue Menge an Speicherspuren hängt vom Marktbereich ab. Wie dies geschrieben ist, gibt es noch 64-Bit-breite Verbindungen (Einstiegsebene). Die meisten Modelle mit mittlerer Reichweite verwenden eine schnelle 128-Bit-Querleiste-Schaltermatrix (4 oder 2 Segmente), während High-End-Modelle riesige Mengen an Speicher (tatsächlich bis zu 512 MB) mit einer etwas langsameren Querleiste einsetzen, die 256 Bit breit ist. Dagegen Standardprozessoren von Intel Pentium für manchen Athlon 64 haben nur einen einzelnen 64-Bit-Datenbus.

Speicherzugriffsmuster sind viel vorhersehbarer. Während Arrays existieren, ist ihre Dimension auf Kernel -Aufruf festgelegt. Das, was mit einer Mehrzeigerindirektion am besten übereinstimmt, ist eine Indirektionskette, was jedoch garantiert letztendlich aus einem bestimmten Speicherbereich (innerhalb eines Streams) gelesen oder schreiben wird.

Aufgrund der SIMD -Natur der Ausführungseinheiten des Stream -Prozessors (Alus -Cluster) wird erwartet Rambus und DDR SDRAM, zum Beispiel). Dies ermöglicht auch effiziente Speicherbusverhandlungen.

Die meisten (90%) der Arbeit eines Stream-Prozessors erfolgen auf Chip, wobei nur 1% der globalen Daten in den Speicher gespeichert werden müssen. Hier zahlt sich die Kernel -Zeiträume und -abhängigkeiten aus.

Innen enthält ein Stream -Prozessor einige clevere Kommunikations- und Managementschaltungen, aber was interessant ist, ist die Stream -Registerdatei (SRF). Dies ist konzeptionell ein großer Cache, bei dem Streamdaten in der Masse auf externe Speicher übertragen werden. Als cache-ähnliche softwarelegierte Struktur der verschiedenen Struktur AlusDas SRF wird zwischen all den verschiedenen Alu -Clustern geteilt. Das Schlüsselkonzept und die hier mit Stanfords Imagine Chip hier durchgeführte Innovation sind, dass der Compiler in der Lage ist, den Speicher optimal zu automatisieren und für den Programmierer vollständig transparent zuzuweisen. Die Abhängigkeiten zwischen Kernelfunktionen und Daten sind durch das Programmiermodell bekannt, mit dem der Compiler die Flussanalyse durchführen und die SRF optimal verpacken kann. In der Regel können dieses Cache- und DMA -Management den größten Teil des Projektplans in Anspruch nehmen, was der Stream -Prozessor (oder sich zumindest vorstellbar) vollständig automatisiert. Tests in Stanford zeigten, dass der Compiler auch einen oder besseren Job bei der Planung des Speichers gemacht hat, als wenn Sie das Ding mit viel Aufwand übergeben würden.

Es gibt Beweise; Es kann viele Cluster geben, da angenommen wird, dass die Kommunikation zwischen Cluster selten ist. Innen kann jedoch jeder Cluster eine viel geringere Menge an Alus effizient ausnutzen, da die Intra-Cluster-Kommunikation häufig ist und daher hocheffizient sein muss.

Um die Alus mit Daten abgerufen zu halten, ist jede ALU mit lokalen Registerdateien (LRFs) ausgestattet, die im Grunde genommen seine nutzbaren Register sind.

Dieses dreistufige Datenzugriffsmuster erleichtert es einfach, temporäre Daten von langsamen Erinnerungen fernzuhalten, wodurch die Siliziumimplementierung hocheffizient und sparsam wird.

Hardware-in-the-Loop-Probleme

Obwohl eine Größenordnung beschleunigt werden kann (selbst vom Mainstream -GPUs beim Berechnen in Streaming), profitieren nicht alle Anwendungen davon. Kommunikationslatenzen sind eigentlich das größte Problem. Obwohl PCI Express Verbessert dies mit Full-Duplex-Kommunikation, dauert es möglicherweise lange Zeit, wenn eine GPU (und möglicherweise ein generischer Stream-Prozessor) die Arbeit zum Arbeiten benötigt. Dies bedeutet, dass es normalerweise kontraproduktiv ist, sie für kleine Datensätze zu verwenden. Da das Ändern des Kernels eine ziemlich teure Operation ist, entspricht die Stream -Architektur auch Strafen für kleine Ströme, ein Verhalten, das als das bezeichnet wird Kurzstream -Effekt.

Pipelining ist eine sehr weit verbreitete und stark verwendete Praxis für Stream -Prozessoren, wobei GPUs über 200 Stufen liegen. Die Kosten für das Umschalten der Einstellungen hängen davon ab, dass die Einstellung geändert wird, aber es wird jetzt als immer teuer angesehen. Um diese Probleme auf verschiedenen Ebenen der Pipeline zu vermeiden, wurden viele Techniken eingesetzt, wie "Über -Shader" und "Texturatlasen". Diese Techniken sind aufgrund der Natur der GPUs spielorientiert, aber die Konzepte sind auch für die generische Stream-Verarbeitung interessant.

Beispiele

  • Das Blitz im Commodore Amiga ist ein frühes (circa 1985) Grafikprozessor, mit dem drei Quellströme von 16 Komponentenbitvektoren auf 256 Möglichkeiten kombiniert werden können, um einen Ausgangsstrom zu erzeugen, der aus 16 Komponentenbitvektoren besteht. Die gesamte Eingangsstrombandbreite beträgt bis zu 42 Millionen Bit pro Sekunde. Die Output -Stream -Bandbreite beträgt bis zu 28 Millionen Bit pro Sekunde.
  • Vorstellen,[10] angeführt von Professor William Dally von Universität in Stanford, ist eine flexible Architektur, die sowohl schnell als auch energieeffizient ist. Das ursprünglich 1996 konzipierte Projekt umfasste Architektur, Softwaretools, eine VLSI -Implementierung und ein Entwicklungsausschuss, wurde von finanziert von DARPA, Intel und Texas Instrumente.
  • Andere Stanford Projekt namens Merrimac,[11] zielt darauf ab, einen auf Stream-basierten Supercomputer zu entwickeln. Merrimac beabsichtigt, eine Stream-Architektur und fortschrittliche Verbindungsnetzwerke zu verwenden, um mehr Leistung pro Einheit zu liefern als Cluster-basierte wissenschaftliche Computer aus derselben Technologie.
  • Das Storm-1 Familie von Stream Processors, Inc, eine kommerzielle Ausgründung von Stanford's Vorstellen Projekt wurde während einer Funktionspräsentation bei bekannt gegeben ISSCC 2007. Die Familie enthält vier Mitglieder von 30 GOPS bis 220 16-Bit-GOP (Milliarden Operationen pro Sekunde), die alle hergestellt wurden TSMC in einem 130 Nanometerprozess. Die Geräte zielen auf das obere Ende der DSP Markt einschließlich Videokonferenzen, Multifunktionsdrucker und digital Videoüberwachung Ausrüstung.
  • GPUS sind weit verbreitete Streamprozessoren für Verbraucherqualität[2] entworfen hauptsächlich von AMD und Nvidia. Verschiedene Generationen, die aus Sicht der Stream -Verarbeitung bezeichnet werden sollen:
    • PRE-R2XX/NV2X: Keine explizite Unterstützung für die Stream-Verarbeitung. Kerneloperationen waren in der versteckt API und bot zu wenig Flexibilität für den allgemeinen Gebrauch.
    • R2XX/NV2X: Kernel -Stream -Operationen wurden explizit unter der Steuerung des Programmierers, jedoch nur für die Scheitelpunktverarbeitung (Fragmente verwendeten immer noch alte Paradigmen). Keine Verzweigungsunterstützung stark behinderte Flexibilität, aber einige Arten von Algorithmen konnten ausgeführt werden (insbesondere Flüssigkeitssimulation mit niedriger Präzision).
    • R3XX/NV4X: Flexible Verzweigungsunterstützung Obwohl noch einige Einschränkungen für die Anzahl der Operationen vorhanden sind, die ausgeführt werden sollen, und strenge Rekursionstiefe sowie Array -Manipulation.
    • R8XX: Unterstützt Puffer und Atomoperationen von Append/Konsum. Diese Generation ist der Stand der Technik.
  • AMD Firestream Markenname für die Produktlinie, die auf HPC abzielt
  • Nvidia Tesla Markenname für die Produktlinie, die auf HPC abzielt
  • Das Zellprozessor aus Stiein Allianz von Sony Computer Entertainment, Toshiba Corporation, und IBM, ist eine Hardware -Architektur, die wie ein Stream -Prozessor mit geeignetem Softwareunterstützung funktionieren kann. Es besteht aus einem kontrollierenden Prozessor, dem PSA (Power Processing Element, einem IBM Powerpc) und eine Reihe von SIMD -Coprozessoren, genannt SPE Mimd Maschine. Im nativen Programmiermodell werden alle DMA- und Programmplanung dem Programmierer überlassen. Die Hardware bietet einen schnellen Ringbus unter den Prozessoren für die lokale Kommunikation. Da der lokale Speicher für Anweisungen und Daten begrenzt ist, sind die einzigen Programme, die diese Architektur effektiv ausnutzen können, entweder einen winzigen Speicherausdruck oder ein Stream -Programmiermodell einzuhalten. Mit einem geeigneten Algorithmus kann die Leistung der Zelle mit der von reinen Stream -Prozessoren mithalten. Dies erfordert jedoch fast immer eine vollständige Neugestaltung von Algorithmen und Software.

Stream -Programmierbibliotheken und Sprachen

Die meisten Programmiersprachen für Stream -Prozessoren beginnen mit Java, C oder C ++ und fügen Erweiterungen hinzu, die bestimmte Anweisungen bereitstellen, damit Anwendungsentwickler Kernel und/oder Streams taggen. Dies gilt auch für die meisten Schattierungssprachen, die bis zu einem gewissen Grad als Stream -Programmiersprachen angesehen werden können.

Zu den nichtkommerziellen Beispielen für Stream-Programmiersprachen gehören:

  • Ateji px Free Edition ermöglicht einen einfachen Ausdruck der Stream -Programmierung, des Schauspielermodells und des MapReduce -Algorithmus auf JVM
  • Auto-Pipe aus dem Stream-basierten Supercomputing-Labor bei Washington University in St. Louis, eine Anwendungsentwicklungsumgebung für Streaming -Anwendungen, mit der Anwendungen für heterogene Systeme das Erstellen von Anwendungen ermöglicht (CPU, Gpgpu, FPGA). Anwendungen können in jeder Kombination von C, C ++ und Java für die CPU entwickelt werden. Verilog oder VHDL für FPGAs. CUDA wird derzeit für NVIDIA GPGPUS verwendet. Auto-Pipe behandelt auch die Koordination von TCP-Verbindungen zwischen mehreren Maschinen.
  • ACOTES -Programmiermodell: Sprache von Polytechnische Universität Katalonien bezogen auf OpenMP
  • Beepbeep, eine einfache und leichte Java-basierte Event-Stream-Verarbeitungsbibliothek aus dem formalen Informatik-Labor bei Universität du Québec à Chicoutimi
  • Brook Sprache von Stanford
  • CAL Actor Language: Eine hochrangige Programmiersprache für Schreibakteure (DataFlow), die staatliche Operatoren sind, die Eingangsströme von Datenobjekten (Token) in Ausgabestreams umwandeln.
  • CAL2MANY Ein Codegenerierungsrahmen von der Halmstad University, Schweden. Es nimmt Cal Code als Eingabe an und generiert verschiedene zielspezifische Sprachen, einschließlich sequentielles C, Meißel, parallel C -Targeting -Epiphany -Architektur, Ajava & Astruction -Targeting Ambric Architecture usw.
  • DUP -Sprache von Technische Universität München und Universität Denver
  • HStream: Eine richtlinienbasierte Spracherweiterung für heterogenes Stream Computing[12]
  • RaftLib - Open Source C ++ Stream Processing -Vorlagenbibliothek ursprünglich aus dem Stream -basierten Supercomputing -Labor unter Washington University in St. Louis
  • SPAR -C ++ - domänenspezifische Sprache zum Ausdrücken von Stream -Parallelität aus der Anwendungsmodellungsgruppe (GMAP) bei Päpstliche katholische Universität von Rio Grande do Sul
  • Sch Bibliothek aus dem Universität von Waterloo
  • Flaches, ein Open -Source -Projekt
  • S-NET-Koordinationssprache aus der Universität von Hertfordshire, die Trennung von Koordination und algorithmischer Programmierung liefert
  • Streamit von MIT
  • Siddhi von WSO2
  • Wavescript -Funktionsstromverarbeitung, ebenfalls vom MIT.
  • Funktionelle reaktive Programmierung könnte in weitem als Stream -Verarbeitung angesehen werden.

Kommerzielle Implementierungen sind entweder allgemeiner Zweck oder von einem Anbieter an bestimmte Hardware gebunden. Beispiele für Allzwecksprachen sind:

  • Accelereyes'Jacke, eine Kommerzialisierung eines GPU -Motors für MATLAB
  • Ateji px Java -Erweiterung, die einen einfachen Ausdruck der Stream -Programmierung, des Schauspielermodells und des MapReduce -Algorithmus ermöglicht
  • Embot
  • Floodgate, ein mit dem versehener Stream -Prozessor GameBryo Game Engine für PlayStation 3, Xbox360, Wii und PC
  • OpenHMPP, eine "Richtlinie" Vision von vielen Kernprogrammen
  • Peakstream,[13] ein Spinout der Bach Projekt (erworben von Google im Juni 2007)
  • IBM Spade - Deklarative Engine für die Anwendungsanwendungsanwendung (B. Gedik, et al.
  • Rapidmind, eine Kommerzialisierung von Sch (erworben von Intel im August 2009)
  • TStreams,[14][15] Hewlett-Packard Cambridge Research Lab

Lieferantenspezifische Sprachen umfassen:

Ereignisbasierte Verarbeitung

Batchdatei-basierte Verarbeitung (emuliert einen Teil der tatsächlichen Stream-Verarbeitung, aber im Allgemeinen viel geringere Leistung[Klarstellung erforderlich]))

Kontinuierliche Bedienungsstromverarbeitung[Klarstellung erforderlich]

  • Apache Flink
  • Walmartlabs Mupd8[16]
  • Eclipse Streamsheets - Tabelle für die Stream -Verarbeitung

Stream -Verarbeitungsdienste:

  • Amazon Web Services - Kinesis
  • Google Cloud - DataFlow
  • Microsoft Azure - Stream Analytics
  • DataStreams - Datenstreaming -Analytics -Plattform
  • IBM Streams
    • IBM Streaming Analytics
  • Eventador SqlstreamBuilder

Siehe auch

Verweise

  1. ^ Ein kurzes Intro zur Stream -Verarbeitung
  2. ^ FCUDA: Ermöglichen Sie eine effiziente Zusammenstellung von Cuda -Kerneln auf FPGAs
  3. ^ IEEE Journal of Solid-State Circuits:"Ein programmierbarer 512 GOPS -Stream -Prozessor für Signal-, Bild- und Videoverarbeitung", Stanford University und Stream Processors, Inc.
  4. ^ Khailany, Dally, Rixner, Kapasi, Owens und Towles: "Erforschung der VLSI -Skalierbarkeit von Stream -Prozessoren", Stanford und Rice University.
  5. ^ Gummaraju und Rosenblum, "Stream-Verarbeitung in allgemeinen Purpose-Prozessoren", Universität in Stanford.
  6. ^ Kapasi, Dally, Rixner, Khailany, Owens, Ahn und Mattson, "Programmierbare Stream -Prozessoren", Universitäten von Stanford, Rice, Kalifornien (Davis) und Reservoir Labs.
  7. ^ Eric Chan. "Stanford Echtzeit programmierbares Schattierungsprojekt". Website der Forschungsgruppe. Abgerufen 9. März, 2017.
  8. ^ "Das Imagine - Bild- und Signalprozessor". Gruppenwebsite. Abgerufen 9. März, 2017.
  9. ^ "Merrimac - Stanford Streaming Supercomputer -Projekt". Gruppenwebsite. Archiviert von das Original am 18. Dezember 2013. Abgerufen 9. März, 2017.
  10. ^ Vorstellen
  11. ^ Merrimac
  12. ^ Memeti, Suejb; Pllana, Sabri (Oktober 2018). HStream: Eine richtlinienbasierte Spracherweiterung für heterogenes Stream Computing. IEEE. Arxiv:1809.09387. doi:10.1109/cse.2018.00026.
  13. ^ Peakstream enthüllt Multicore- und CPU/GPU -Programmierlösung
  14. ^ TStreams: Ein Modell der parallele Berechnung (Technischer Bericht).
  15. ^ TStreams: So schreiben Sie ein paralleles Programm (Technischer Bericht).
  16. ^ "Github - Walmartlabs/Muppet: Muppet".