Die Tatsache, einen Prozessor mit mehr Kernen zu wählen führt bei bestimmten Programmen oft nicht in gleichem Maße zu einer Leistungssteigerung. Warum tritt dieses Phänomen auf und was sind daher die Ursachen dafür? Wir erklären es Ihnen im Detail.
Einer der Gründe, im Laufe der Zeit neuere Versionen von Programmen zu verwenden, ist, dass sie so konzipiert sind, dass sie Prozessoren mit höherer Kernanzahl besser ausnutzen. Vergessen wir nicht, dass die Anzahl dieser in den CPUs im Laufe der Zeit zunimmt. Warum steigt die Leistung in Programmen jedoch nicht auf gleichem Niveau?
Programme werden nie mit der Anzahl der Kerne skaliert
Es ist wichtig zu berücksichtigen, dass die ausgeführten Programme nicht in der Lage sind, ihre aktiven Prozesse oder Aufgaben zu einem bestimmten Zeitpunkt entsprechend der Anzahl der Ausführungsthreads, die wir in unserem haben, aufzuteilen CPU. Vor allem deshalb, weil diese Aufteilung explizit im Programmcode, also aus dem Können des Programmierers und dem Design der Anwendung resultiert.
Eigentlich geht es beim Programmieren eines Programms nicht darum, es auf möglichst viele Kerne zu optimieren, sondern auf Latenz. Letzteres als die Zeit zu verstehen, die ein Prozessor benötigt, um eine Aufgabe zu erledigen, gemessen in Zeiteinheiten. Und es ist so, dass die Leistung einer CPU darin besteht, die meisten Aufgaben in kürzester Zeit zu erledigen. Was zuerst von Ihrer Architektur und zweitens von Ihrer Taktrate abhängt.
Was uns jedoch in Bezug auf die Latenz interessiert, ist zu wissen, wie viele Aufgaben sie in einem bestimmten Zeitraum erledigen kann, was die Arbeitsbelastung ist, und dies hängt von der Situation und der Art und Weise ab, wie die Programme geschrieben wurden. Mit anderen Worten, die Leistung hängt nicht nur von der Hardware ab, sondern auch davon, wie gut oder schlecht die Software geschrieben wurde.
Arbeitsteilung in mehrere Kerne
Wenn wir nun die Anzahl der Kerne in einem System erhöhen, wird es möglich, die Arbeit in Stücke zu zerlegen und viel einfacher abzuschließen. Hier kommt die T/N-Formel ins Spiel, wobei T die Anzahl der auszuführenden Aufgaben und N die Anzahl der Ausführungs-Threads ist, die das System ausführen kann. Offensichtlich könnten wir die maximale Anzahl von Jobs auf wenige Kerne laden und sie brutal erzwingen, um sie zu beheben. Das Problem ist, dass diese Maßnahme kontraproduktiv ist, weil sie den modernsten CPUs zugute kommt, die auf jedem Kern einzeln eine höhere Leistung haben.
Die Aufteilung der Arbeit auf verschiedene Kerne ist jedoch zusätzliche Arbeit, die normalerweise einem Kern übertragen wird, der als Leiter fungiert und die folgenden Aufgaben erfüllen muss:
- Sie müssen Prozesse und Aufgabenlisten erstellen und jederzeit gut im Griff haben.
- Sie müssen jederzeit vorhersagen können, wann eine Aufgabe beginnt und endet, einschließlich der Zeit, die benötigt wird, um eine Aufgabe zu beenden und eine andere zu beginnen.
- Die verschiedenen Kernel müssen in der Lage sein, ein Signal an den Hauptkernel zu senden, um zu wissen, wann ein Prozess beginnt und endet.
Diese Lösung wurde von SONY, Toshiba und IBM in der Cell Broadband Engine übernommen, dem zentralen Prozessor der PS3, wo ein Master-Core für die Steuerung des Rests verantwortlich war. Obwohl viel weiter zurück, wurde es vom Atari Jaguar übernommen. Für PS4 hat SONY dieses Modell nicht noch einmal wiederholt und niemand hat es auf dem PC implementiert, weil es ein Albtraum ist, aber es ist die effizienteste Art, die Arbeit aufzuteilen.
Nicht alles kann auf mehreren Kernen laufen
Wenn wir uns fragen, ob wir eine Aufgabe in Teilaufgaben aufteilen können, um sie auf unbestimmte Zeit auf eine größere Anzahl von Kernen zu verteilen, lautet die Antwort nein. Konkret müssen wir Aufgaben in drei verschiedene Typen einteilen:
- Diejenigen, die vollständig parallelisiert und daher auf die verschiedenen Kerne des Zentralprozessors aufgeteilt werden können.
- Aufgaben, die teilweise parallel ausgeführt werden können.
- Teile des Codes, die nicht parallel ausgeführt werden können.
Im ersten Fall wird T/N zu 100% angesetzt, im zweiten Fall treten wir bereits in das sogenannte Amdahl'sche Gesetz ein, wo die Beschleunigung durch Erhöhung der Kernanzahl partiell ist und im dritten Fall brauchen wir einfach alle Leistung eines einzelnen Kerns für diese Aufgabe,
Was die CPU beim Multithreading von der GPU unterscheidet
Hier kommen wir zu einem Differenzierungspunkt, jeder GPU oder Grafikchip verfügt über eine Steuereinheit, die dafür zuständig ist, die Befehlslisten auszulesen und sie auf die verschiedenen GPU-Kerne und sogar auf die verschiedenen Einheiten zu verteilen. Dies ist eine Implementierung des vorherigen Falls auf Hardwareebene und funktioniert perfekt in jeder Konfiguration, in der Sie sättigen möchten, solange Arbeit vorhanden ist, und daher so viele Kerne wie möglich beschäftigt halten. Wir müssen jedoch verstehen, dass der Konzept-Thread der Ausführung in einer GPU immer entsprechenden Daten und ihrer Liste von Anweisungen entspricht. Das heißt, ein Pixel, ein Scheitelpunkt oder beliebige Daten.
Das macht sie einfach zu parallelisieren. Das heißt, wenn wir ein Ei braten wollten, würde der Prozess in der CPU darin bestehen, das Ei zu braten, was vollständig sequentiell wäre. Auf der anderen Seite wäre eine Aufgabe im Grafikchip einfach, Öl zu erhitzen oder ein Ei in die Pfanne zu geben. All das würde das Braten eines Eies nicht beschleunigen, sondern gleich mehrere, weshalb GPUs besser für Aufgaben wie das gleichzeitige Berechnen von Millionen von Polygonen oder Pixeln geeignet sind, nicht aber für sequentielle Aufgaben.