Die Verwendung mehrerer Kerne erfordert die explizite Offenlegung der Parallelität auf Thread-Ebene für das Betriebssystem, sodass der Programmierer normalerweise ein Multithread-Programm schreiben muss. (Oder um ein Single-Thread-Programm mehrmals auf verschiedenen Eingaben auszuführen, z. B. beim Kompilieren mit make -j4
)
Compiler für einige Sprachen unterstützen jedoch die automatische Parallelisierung. Beispielsweise kann C oder C ++ mit OpenMP eine gewöhnliche for()
Schleife in ein Programm kompilieren , das mehrere Threads startet.
#pragma omp parallel for
for(int i = 0; i < 1000000; ++i)
{
A[i] = B[i] * constant + C[i];
}
Dies muss jedoch passieren, wenn Sie das Programm geschrieben oder kompiliert haben. Derzeitige Hardware und Betriebssysteme können nicht mehrere Kerne verwenden, um ein Single-Thread-Programm zu beschleunigen.
Verwandte: Wie läuft ein einzelner Thread auf mehreren Kernen? : Antwort: Sie tun es nicht. Es gibt jedoch auch andere Arten von Parallelität, z. B. Parallelität auf Befehlsebene , die ein einzelner CPU-Kern findet und ausnutzt, um einen einzelnen Thread schneller als jeweils einen Befehl auszuführen.
Meine Antwort auf diese Frage geht auf einige Details ein, wie moderne CPUs feinkörnige Parallelität auf Befehlsebene finden und ausnutzen. (Hauptsächlich mit Fokus auf x86). Dies ist nur ein Teil der Funktionsweise normaler CPUs, da mehrere Anweisungen gleichzeitig im Flug sind, und muss nicht speziell aktiviert werden. (Es gibt Leistungsindikatoren, mit denen Sie sehen können, wie viele Anweisungen pro Takt Ihre CPU während der Ausführung eines Programms oder anderer Maßnahmen ausführen konnte.)
Beachten Sie, dass RPi3 in der Reihenfolge ARM Cortex-A53-CPU-Kerne verwendet . Jeder Kern ist 2-fach superskalar (2 Befehle pro Takt, wie ILP dies zulässt), kann jedoch keine Befehle neu anordnen, um mehr Parallelität auf Befehlsebene zu finden und die Latenz zu verbergen.
Da die CPU dennoch über eine Pipeline verfügt, ist die Gesamtzahl der Befehle im Flug (vom Abrufen und Decodieren bis zur Rückschreibphase am Ende der Pipeline) erheblich. Wenn Datenabhängigkeiten die Dinge nicht einschränken, können in jeder Pipeline-Phase, an der die CPU arbeitet, 2 Befehle mit einem Durchsatz von 2 Befehlen pro Takt vorhanden sein. (Das bedeutet 2-weit.)
Es kann keine Befehle außerhalb der Reihenfolge ausführen, aber bei sorgfältiger Befehlsreihenfolge (normalerweise durch einen Compiler) kann es dennoch die Latenz eines Befehls verbergen, der mehrere Zyklen benötigt, bis seine Ausgabe bereit ist. (zB ein Ladevorgang, selbst wenn er im Cache eintrifft oder multipliziert wird, dauert mehrere Zyklen, während ein Add im nächsten Zyklus bereit ist). Der Trick besteht darin, die asm-Anweisungen so zu ordnen, dass zwischen der Anweisung, die ein Ergebnis erzeugt, und der Anweisung, die es verwendet, mehrere unabhängige Anweisungen bestehen.
Wenn Software (ein Compiler) Anweisungen statisch plant, ist dies spröder als Hardware, die intern neu angeordnet werden kann, während die Illusion erhalten bleibt, in Programmreihenfolge ausgeführt zu werden. Für Compiler ist es sehr schwierig, so gute Arbeit zu leisten wie für ein kleines Fenster außerhalb der Reihenfolge, in dem Anweisungen neu angeordnet werden können, da Cache-Fehler nicht vorhersehbar sind und es schwierig ist, Abhängigkeitsketten über Funktionsaufrufe hinweg zur Kompilierungszeit zu analysieren. Und die Anzahl der Register ist ohne Umbenennen der Hardwareregister begrenzt.
All dies ist ein kleiner Komfort, wenn Ihr Code langsamer ausgeführt wird, als Sie möchten. Sicher, in einem Cortex-A53 steckt viel cooles Zeug unter der Haube, aber in einem Cortex-A57 steckt noch mehr cooles Zeug unter der Haube (wie die Ausführung von bis zu 3 Anweisungen pro Uhr außerhalb der Reihenfolge) und noch mehr in eine große x86-CPU wie Skylake (ganz zu schweigen von den Taktgeschwindigkeitsunterschieden).
Cortex-A53 ist ziemlich fantastisch im Vergleich zu einer https://en.wikipedia.org/wiki/Classic_RISC_pipeline wie Original-MIPS, die Sie im Computerarchitekturunterricht kennenlernen würden, aber für moderne Verhältnisse ist es ziemlich billig.