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?
Antworten:
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.
quelle
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!
quelle