Sind CPU-Architekturen auf prozedurale Laufzeiten ausgerichtet?


12

Gibt es irgendwelche Änderungen, die an CPUs vorgenommen werden könnten, um sie für gleichzeitige Laufzeiten wie Rust leistungsfähiger zu machen? Gibt es beispielsweise Änderungen an Implementierungen für die Verzweigungsvorhersage oder an den Cachegrößen, die zu gleichzeitigen Laufzeiten führen könnten?

Ich habe den Eindruck, dass die aktuellen CPU-Designs mehr für prozedurale Laufzeiten wie C optimiert werden könnten. Wenn wir stattdessen für gleichzeitige Laufzeiten optimieren würden, wie würden CPUs anders aussehen?

Für isntance wurde eine Verzweigungsvorhersage auf der Grundlage von Verallgemeinerungen implementiert, die in Forschungsarbeiten zur Analyse von Verfahrenscodes erstellt wurden. Ich frage mich, ob die Nebenläufigkeitsabstraktion der Laufzeit eine erhebliche Menge an Funktionen hinzufügt, die sich nachteilig auf vorhandene Algorithmen zur Verzweigungsvorhersage auswirkt. Das Vorhersagen in einer for-Schleife ist beispielsweise eine Sache, aber wenn das Ziel des Zweigs immer ein neuer Teil des Speichers (Grafik, Text usw.) ist, wird es immer einen Cache-Fehler geben und es wird nie einen Zweig geben Geschichte dafür - weil noch keiner davon angefasst hat.

Dies ist wahrscheinlich eine dumme Frage, da der Inhalt, obwohl er sich möglicherweise immer im RAM befindet, in einer Größenordnung verzweigt wird, die geringer ist als die, die er verwendet (sobald er in den Cache geladen wurde) sollte eine beobachtbare zeitliche Grenze zu den Kontexten sein, die im Cache und in Verzweigungsvorhersagen in einer prozeduralen Laufzeit gespeichert sind, die sich als Abstraktionsgrenze in einer stärker parallelisierten Umgebung manifestieren würde. Ich frage mich also ... Wurden diese Grenzen eingehalten? Haben Forschungsarbeiten dies analysiert?

Sind CPU-Architekturen gegenüber gleichzeitigem Code auf prozeduralen Code ausgerichtet? Oder sind moderne CPUs so universell einsetzbar, dass eine hochkonkurrierende Sprache nicht darunter leidet?


2
Haben Sie sich die Literatur zur Itanium (IA-64) -Architektur angesehen? Es wurde mit großen Träumen von Ultraparallelität entworfen, aber dann gelang es den Leuten nicht, Compiler zu entwickeln, die die Funktionen der CPU nutzen, und die Software lief schließlich nicht so gut.
Gilles 'SO- hör auf böse zu sein'

@ Gilles ja. Obwohl es sich um eine andere Frage handelt, ist dies tatsächlich eine interessante Beobachtung - vielleicht ist die in Itanium eingebrachte Parallelität besser für moderne gleichzeitige Sprachen geeignet?
Erhöhen Sie den

@Gilles: In ähnlicher Weise scheint die neue Mill-Architektur mit Blick auf Parallelität und kostengünstige Switches gebaut worden zu sein. Wenn beispielsweise ein einziger virtueller Adressraum für alle "Prozesse" verwendet wird, wird der TLB zwischen der letzten Cache-Ebene und den Gerätecontrollern zurückgeschoben (siehe Folie 49 unter millcomputing.com/docs/memory ).
Matthieu M.

1
@pedAntic Rust, das eine Laufzeit benötigt, ist ein Missverständnis, das leicht zu machen ist: chat.stackoverflow.com/transcript/message/24171983#24171983 . Ihre Frage scheint dieses Missverständnis zu stützen, was für Rust nicht gut ist.
ArtemGr

1
@pedAntic Sie sehen, Rust hatte eine gleichzeitige Laufzeit (für grünes Threading), aber es funktioniert nicht mehr. Im Moment ist Rust in Bezug auf das Leistungsprofil bei gleichzeitiger Nutzung weitgehend in der gleichen Liga wie C. Der einzige Unterschied zu C besteht darin, dass die statische Analyse in Rust die Parallelität größtenteils sicher macht.
ArtemGr

Antworten:


1

Es ist wahrscheinlich eher so, dass moderne Computerarchitekturen mit dem Ziel entworfen wurden, die Qualität des von Compilern generierten Codes im Verhältnis zu den Kosten im Bereich und der verwendeten Leistung zu verbessern. Laufzeitbibliotheken sind nur eine bestimmte Instanz von kompiliertem Code, die effizient ausgeführt werden muss.

Die Zielsprache für die meisten Architekturen war lange Zeit die Sprache "C". Dies spiegelt die bescheidenen Anforderungen wider, die diese Sprache an ihre Hardware stellt, und die Tatsache, dass sie zu einer nahezu universellen Programmiersprache für Systeme geworden ist (Sorry Rust and Go, Sie haben einen weiten Weg vor sich, um C zu schlagen).

Eine Folge davon scheint zu sein, dass neue Sprachen häufig in Bezug auf ihre C-äquivalente Semantik definiert werden, nur um zu vermeiden, dass Prozessoreinrichtungen benötigt werden, die auf aktuellen Computern wahrscheinlich fehlen.

Die Auszahlung für einen Prozessor, der gut zu modernen Compilern passt, ist, dass der Code dieser Compiler gut läuft und der Prozessor zumindest die Chance hat, wettbewerbsfähig zu sein. Die Fehlerkosten hier machen den Prozessor zum Scheitern verurteilt, bevor er gestartet werden kann. Nur zwei Beispiele im Negativ sind das iAPX-432 und das Itanium, beide von Intel. Beide hatten ein sehr schlechtes Verhältnis zu ihren Compilern (Ada und C), da die Produkte nicht mehr als Schuldspiel zwischen Silicon und Software fungierten.


0

Ohne Zweifel ja.

Insbesondere ist das von C99 implizierte Kommunikationsmodell Shared Memory. Fortgeschrittenere gleichzeitige Sprachen verfügen über umfangreichere Kommunikationsmodelle, z. B. Nachrichtenübermittlungskanäle (wie in Rust).

Moderne CPU-Architekturen bieten explizite Hardware-Unterstützung für Shared Memory. Insbesondere werden Cache-Kohärenzprotokolle wie MESI in tatsächlichen Gattern und Drähten implementiert. Es gibt keine wirkliche Unterstützung für die Nachrichtenübermittlung zwischen Prozessen, obwohl die Idee der Nachrichtenübermittlung den CPUs nicht fremd ist. Moderne PCI-e-Busse emulieren sogar Shared Memory mit Message-Passing, während CPU-Prozesse Message-Passing mit Shared Memory emulieren müssen!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.