NPS, Förderer, automatisches Rechnen und wieder ... Coroutinen

1. Wieder über Coroutinen


In meinem vorherigen Artikel, lieber Habr, habe ich nur die Probleme des Wissens über moderne Programmierung angesprochen. Die anschließende Diskussion bestätigte nur die spontanen Befürchtungen: Die berüchtigten „theoretischen Grundlagen“ wurden sofort zu einer Quelle von Meinungsverschiedenheiten. Die Tatsache, dass sie (Meinungsverschiedenheiten) möglicherweise nicht existieren oder von anderer Natur sind, scheint den Großteil der "echten" Programmierer nicht zu stören. Darüber hinaus ist es vielleicht nicht besonders interessant, weil Programmierer werden hauptsächlich durch ein Interesse stimuliert - Code, Code und nur Code. Na ja, fast "wie der Arzt es verschrieben hat" [1] ...

Als ich in meinem Artikel und in meinen Kommentaren auf das Thema Corutin einging, träumte ich überhaupt nicht davon, wie sehr sie im „aktuellen“ Trend sind. Erstaunt jedoch die "Backing Tracks" meiner Kommentare mit oder ohne. Für was, sagen sie, Programmierer? Es scheint mir jedoch, dass alles klar wurde, nachdem ich den Artikel über das neu genehmigte C ++ 20 und die Aussichten für seine weitere Entwicklung gelesen hatte [2]. Zu meinem Erstaunen stellte sich heraus, dass Coroutinen an der Spitze der gegenwärtigen und zukünftigen Innovationen meines geliebten C ++ stehen (siehe auch die CppCoro- Bibliothek ).

Nun, sag mir, ist es möglich, eine Stirn ernst und / oder ruhig zu nehmen, die sich anscheinend als jemand vorstellt? Schlagen Sie, was heißt! :(

Der Hintergrund meiner Bekanntschaft mit Coroutinen (ich werde sie auf die alte Weise alle gleich nennen) ist wie folgt. Es bestand die Notwendigkeit einer Parallelisierung, aber etwas Passendes war nicht. Ich musste erfinden und die verfügbare Literatur studieren. Infolgedessen wurden Coroutinen sofort und Threads später abgelehnt. Der Grund dafür ist, dass beide strukturelle Methoden zur Parallelisierung von Programmen und keine Rechenmodelle sind. Aber das wollte ich nicht.

Die Beschreibung dessen, worauf ich schließlich gekommen bin, ist in meinen vorherigen Artikeln über Habré enthalten. Dieses Gespräch ist noch lange nicht vorbei, aber wie wurden Coroutinen vorerst in Erinnerung gerufen, da sie bereits Gegenstand einer so hitzigen Diskussion geworden sind? Das einzige sind die „Punkte“ beim Stoppen / Umschalten von Prozessen. Im Gegensatz zu Threads ermöglichten sie die Vorhersage des Verhaltens von Prozessen, die den Parallelbetrieb simulieren. Theoretisch reduzierte dies auch die Systemverluste für die Implementierung von Parallelität. Aber insgesamt hat sich an all dem im Grunde nichts geändert. Und da die „Punkte“ einfach durch die Zustände des Automatenprogrammiermodells (AP) nachgeahmt wurden, war meine Bekanntschaft mit Coroutinen für sieben abgeschlossen.

Aber ich konnte nicht davon ausgehen, dass die Inkarnation von Coroutinen, jetzt Coroutinen genannt, mich so überholen würde. Daraus und aus meinen möglicherweise ungerechtfertigten „Angriffen“ auf sie, für die ich mich bei den Apologeten von Corutin absolut aufrichtig entschuldige. Wahrscheinlich beeilt. Trotzdem hatten die neu entdeckten Umstände keinen Einfluss auf meine Einstellung zu Coroutinen. Für den neuen Code habe ich nie etwas grundlegend Neues gesehen, um zu ihren Gunsten zu argumentieren. Ich möchte jedoch darauf hinweisen, dass Coroutinen mir dennoch näher und klarer sind als Threads, weil enthalten, wie oben erwähnt, ein Analogon der Menge der internen Zustände endlicher Automaten (CA).

Hör jedoch auf zu bereuen. Kehren wir zu Automaten zurück, die das „Coroutine-Thema“ vollständig abdecken. Als nächstes werde ich die Fähigkeiten des AP vorstellen, die mit der Modellierung paralleler Modelle verbunden sind, die in Theorie und Praxis recht bekannt sind - abgestufte parallele und Pipeline-Modelle von Algorithmen. Ihre automatische Lösung sieht meiner Meinung nach visueller, natürlicher und einfacher aus, als sie auf denselben Coroutinen basieren würde.

2. Tier-Parallel- und Pipeline-Formen von Algorithmen


Angenommen, Sie müssen den Ausdruck berechnen:

y = (((a + b) * (c + d)) + ((e * f) + (q + h))).

Lassen Sie auch die Ausführungszeit der Operation definiert werden, definiert in willkürlichen Einheiten diskreter Zeit - Maßnahmen, bei denen die Addition 1 Maßnahme und die Multiplikation 5 Maßnahmen umfasst.
Basierend auf der Logik der Berechnung des Ausdrucks, der Ausführungszeit der Operationen und der Anzahl von Zwischenvariablen kann in einer Ausführungsform die Verteilung von Operationen nach Ebenen und die Anzahl von Ebenen selbst beispielsweise wie folgt aussehen:

t1 = a + b; t2 = c + d; t3 = e * f; t4 = q + h;
Tier0: t1; t2; t3; t4;
Tier1: t5 = t1 * t2; t6 = t3 + t4;
Tier2: t7 = t5 + t6;

Grafisch ist dies in Abb. 2 dargestellt. 1 zeigt zwei Optionen für die Verteilung von Berechnungen in Ebenen und die festgelegte Berechnungszeit in Ticks. Ihr Vergleich zeigt, dass im allgemeinen Fall eine Verringerung der Anzahl der Ebenen nicht automatisch eine Verringerung der Rechenzeit bedeutet.

Bild
Feige. 1. Tierparallele Form der Berechnung eines Ausdrucks.

Es kann jedoch eine weitere Option in Betracht gezogen werden, die bereits durch eine Vielzahl von tierparallelen Formen dargestellt wird, die ein einzelnes Problem lösen. In Abb. Abbildung 2 zeigt eine solche Lösung. Die Rechenzeit hat sich verringert. Die Parallelisierung von NPS kann auch unter Berücksichtigung ihrer Ausführung auf Multiprozessorsystemen attraktiv sein.

Bild
Feige. 2. Paralleler NPS

Wenn Sie das JPF-Diagramm drehen, können Sie das Schema der Pipeline-Berechnung erhalten. Darin sind die Elemente des Förderers Ebenen, deren Betriebszeit auf die langsamste Ebene reduziert wird. In Abb. Fig. 3 zeigt ein solches Pipelining-Schema des ursprünglichen Ausdrucks.

Bild
Feige. 3. Pipeline-Modell

Da in diesem Beispiel die diskrete Förderzeit 5 Taktzyklen beträgt, ist die Berechnungszeit noch schlechter als die schlechteste Version des NPS. Vorteile der Pipeline nur in der Kontinuität der Berechnungen.

3. Ein Automatenmodell zur Berechnung von Ausdrücken


Wenn Sie die Einschränkungen für die Synchronisierung von Vorgängen aufheben, kann der NPS in eine Schaltung umgewandelt werden, die das Ergebnis als Pipeline generiert, jedoch ohne Einschränkungen in Bezug auf die Reihenfolge und den Zeitpunkt der Vorgänge. Ein solches logisches Netzwerkdiagramm mit einer Demonstration der Additionsoperation (die Implementierung der Multiplikation ist ähnlich) in Form eines Netzwerkmodells eines Raumfahrzeugs ist in Fig. 4 gezeigt. 4.

Bild
Abb. 4. Berechnungen von Ausdrücken basierend auf einem Netzwerk von Zustandsautomaten

Sie können sehen, dass das Netzwerk ständig ein Ergebnis mit einer Verzögerung von 7 Taktzyklen erzeugt, d. H. sowie das schnellste NPS-Modell (Abb. 7). Zu den Nachteilen gehört die mit Datenrennen verbundene Instabilität der Ausgabe. Beispielsweise führt eine gleichzeitige Änderung des Wertes von Variablen in Paaren von Variablen g, h und e, f zu einer Änderung von t4 beim nächsten Taktzyklus, nach einem Taktzyklus zu einer Änderung der Variablen t6 und einem weiteren Taktzyklus zur Ausgangsvariablen t7 (siehe Fig. 1 und Fig. 4). . Gleichzeitig ändert sich nach 5 Taktzyklen die Variable t3, was zu einer Änderung und Ausgabe der endgültig festgelegten Werte der Variablen t6, t7 führt.

Bild
Feige. 5. Modellierung von NPS mit einem Netzwerk von Automaten

In Abb. Abbildung 5 zeigt, wie durch die Einführung eines zusätzlichen Blocks die Berechnung des NPS simuliert werden kann. In ähnlicher Weise können Sie das Modell des Pipelined Computing simulieren und die mit Datenrennen verbundene Änderung der Ausgabe blockieren.

3. Schlussfolgerungen


Es wäre seltsam zu bezweifeln, dass die obigen „Bilder“ nicht mit Coroutinen realisiert werden können. Das ist nur, um ehrlich zu sein, ich würde das nicht tun wollen. Für mich ist es viel einfacher, Automaten zu erstellen, die die erforderlichen Operationen implementieren, und dann, wenn nur ihre Anzahl und die Beziehungen zwischen ihnen geändert werden, die Berechnung eines Ausdrucks zu implementieren.

Ich werde nicht müde zu wiederholen, dass ich von dem Konzept der visuellen Programmierung angezogen bin, das im Stateflow-Paket in MATLAB implementiert ist. Hier können Sie auch die erforderlichen Automatenoperationen erstellen und dann wie Standardblöcke ein Berechnungsschema für jeden Ausdruck „zeichnen“, das nach der Kompilierung in ein Arbeitsprogramm umgewandelt wird (z. B. in demselben C ++). Gleichzeitig stehen während des Entwurfsprozesses Visualisierungs- und Debugging-Tools zur Verfügung, die für die automatisierte Programmiertechnologie spezifisch sind.

Es kann sich die Frage stellen, warum dauerhafte Verbindungen zu einer bestimmten unbekannten Umgebung der KPdSU bestehen, wenn es einen Stateflow gibt. Aber wir werden noch separat darüber sprechen ...

Es ist undankbar, Vorhersagen zu treffen, aber dennoch werde ich aufgrund meiner Erfahrung einen aufrührerischen Gedanken ausdrücken: Als Hochsprachen, die zur Negation der Assembler-Programmierung verwendet werden, also visuelle Programmierung früher oder später und nicht weniger verdrängte Programmierung in Hochsprachen.

Literatur

1. Programmierer, lassen Sie uns die Quellen klassischer Programme untersuchen. [Elektronische Ressource], Zugriffsmodus: habr.com/de/post/488808 kostenlos. Yaz. Russisch (Datum der Behandlung 22.02.2020).
2. C ++ 20 genehmigt! Was Sie erwartet und was Sie für C ++ 23-Entwickler vorbereiten müssen. [Elektronische Ressource], Zugriffsmodus:habr.com/de/company/yandex/blog/488588 kostenlos. Yaz. Russisch (Datum der Behandlung 02.20.2020).

All Articles