Grundlagenartikel Warum Apples M1 Single "Core" Vergleiche grundlegend fehlerhaft sind (mit Benchmarks) | Gastbeitrag

Igor Wallossek

Format©
Mitarbeiter
Mitglied seit
Jun 1, 2018
Beiträge
10.178
Bewertungspunkte
18.761
Punkte
114
Alter
59
Standort
Labor
Ich habe heute etwas ziemlich Aufregendes für Eure Leser; etwas, das fast jeder bei großen Getöse um die Apple M1-Benchmark-Vergleiche verpasst zu haben scheint. Was wäre, wenn ich Euch sagen würde, dass so ziemlich alle Single-Core-Benchmark-Vergleiche zwischen dem Apple M1 und modernen x86-Prozessoren, die Ihr online sehen könnt, grundlegend fehlerhaft sind (vorausgesetzt, Ihr wollt sehen, welcher Kern der schnellste ist)? Denn wie Ihr seht, nutzen die meisten Einzelkern-Benchmarks, die im Umlauf sind, einen modernen x86-Kern nicht einmal vollständig aus - aber wahrscheinlich die des M1.




>>> Hier den gesamten Artikel lesen <<<
 
Verstehe nicht wie man sich darüber so auslassen kann nur weil Apple dies als "single Core Benchmark" bezeichnet. Fakt ist nun einmal: X86 braucht die "Krücke" SMT da ein thread idR den Core nicht auslasten kann. Im allgemeinem spricht man ja auch von einem CPU-Limit wenn man eigentlich ein "Core"-Limit meint bzw müsste man dies ja jetzt auch als Thread-Limit bezeichen.
Zb wird jedem Gamer geschrieben er sei trotz "nur" 40% Auslastung in einem CPU-Limit -- Ja was denn jetzt??

Ich würde für 10-20% mehr SingleThread Leistung sehr sehr gerne auf SMT verzichten, dann wir es halt ein 12 oder 16 Kerner. Und ich glaube da wäre ich nicht alleine.
 
Zuletzt bearbeitet :
Apple dies als "single Core Benchmark" bezeichnet.
Ich habe gerade mal spaßeshalber gegoogelt. Auch der Entwickler von zumindest einem der hier angeführten Benchmarks (https://www.maxon.net/en/cinebench) sagt "Users now have the option to directly test the single core performance [...]". Die Bezeichnung hat sich also nicht Apple ausgedacht, sondern Apple verwendet lediglich die Bezeichnungen, die die Benchmark-Entwickler nehmen.

Und gerade fiel mir spontan die ZombieLoad Attacke ein. Da war damals ja auch mal was. Die Lösung, die von Manchen dagegen vorgeschlagen wird, lautet: Man deaktiviert HT ... (z. B. https://seclists.org/oss-sec/2019/q2/111)
 
Also das einzige was man kritisieren kann, ist die Bezeichnung des Benchmarks als Single-Core/Multi-Core.
Die korrekte Bezeichnung wäre Single-Thread/Multi-Thread, und das sind auch die einzigen Werte die interessant sind. Einer Single-Thread-Anwendung bringt SMT nun mal gar nichts, und wenn die Anwendung eh Multithread ist, kann sie auch auf mehreren vollen Kernen laufen.

Ein Benchmark "Single-Core + SMT" ist vollkommen praxisfern und damit irrelevant.

Wirklich grotesk wird es aber, wenn man SMT als "Vorteil" der x86 Architekturen herausstreicht.
SMT ist nichts anderes als eine Krücke weil die Architektur nicht in der Lage ist aus einem Thread genug ILP zu extrahieren um das Backend gut auszulasten.

Da SMT in Hardware sehr billig ist, ist das natürlich eine absolut valide Methode, allerdings eine Methode die im Nachteil ist gegenüber einer Architektur welche die Hardware auch ohne SMT auslasten kann, weil das funktioniert nämlich mit jeder Software, SMT kann nur was bringen wenn die Software schon Multithreaded ist.
Genauso ist es Unsinn eine Architektur zu loben, wenn diese durch SMT mehr profitiert als eine Archetektur der Konkurrenten, ein höherer Zuwachs durch SMT kann nur dadurch entstehen, weil die Architektur eben nicht in der Lage ist ihre Hardware mit einem Thread auch auszunutzen.
Das beste Beispiel dafür waren ja vor Jahren die ersten Atom-Generationen, die Singlethread so lahm waren, dass SMT bei denen fast so viel gebracht hat wie ein weiterer vollständiger Kern

Und wenn man sieht, dass man mit 5W beinahe die Performance erreicht, für welche die Konkurrenz >50W benötigt kann man einfach nur staunen.

Die Hardware ist hier einfach gnadenlos überlegen, das muss man einfach neidlos (ok das war ne Lüge) anerkennen.
 
Ich hab jetzt noch nicht alle Reaktionen zu dem Artikel gelesen, aber je mehr ich drüber nachdenke, desto mehr scheint mir eine Sache auffällig:
Ist die Grundprämisse des Artikels nicht grundlegend falsch?

Ich spreche von der Aussage des zitierten "architects":
It is worth noting that SMT philosophy is embedded in the design. The decode to uOP, and subsequent optimizations for scheduling through retirement (including intermediate issues instruction dependencies, pipe-line bubbles and flushing, etc.), are a large part of why x86 embraced SMT. RISC load/store architectures simply have less front-end decoding complexity, versus decoupled CISC, and thus are able to obtain better Instruction per Thread, per clock. This is why dispatching multiple threads is required to maximize the performance of a single core (in x86).

Mir ist absolut nicht klar, warum SMT für x86/CISC prinzipbedingt einen größeren vorteil im Vgl. zu RISC-Architekturen bieten soll.

Ich mein...die betroffenen Ressourcen sind ja competitively shared. Und bei SMT gehts ja drum, brachliegende Ressourcen (genaugenommen: die eigentlichen execution units) besser auszunutzen, indem man die angesprochenen Probleme (instruction dependencies, pipeline stalls...aber auch - und vor allem - banale cache misses) durch switchen auf einen unabhängigen Thread abfängt.
NUR...diese Dinge passieren (branch prediction mal außen vor) iGuG alle *nach* dem Decoding.
Und wenn man dann durch SMT schafft, die Auslastung zu erhöhen, warum soll x86 davon mehr profitieren? Man *steigert* dadurch ja nur den Druck aufs Frontend...
Und selbst wenn man tatsächlich mal Frontend-bound ist, dann bringt einem SMT hier keinen Vorteil, weil sich die Natur des Decode ja nicht ändert, egal ob der Instruction Stream jetzt von einem oder zwei Threads gefüttert wird. Und das ist übrigens ohnehin ziemlich selten der Fall - siehe z.B. die Papers von Intel's Ahmad Yasin.

Ich könnte es ja verstehen, wenn bei einer SMT-Implementierung das Frontend (bzw. zumindest der Decoder) verdoppelt wird, aber das tut niemand (wohl aus letzterem Grund).

Und dann gibts da ja noch den elephant in the room: RISC-Architekturen wie IBMs POWERx mit 8-fach-SMT - davon 4 Threads gefüttert von einem 6-wide-Frontend...

Falls ich hier was Grundlegendes übersehen haben sollte, bitte gern korrigieren!
 
Ich hab jetzt noch nicht alle Reaktionen zu dem Artikel gelesen, aber je mehr ich drüber nachdenke, desto mehr scheint mir eine Sache auffällig:
Ist die Grundprämisse des Artikels nicht grundlegend falsch?

Möglicherweise, ist aber auch eigentlich irrelevant, wenn sich aus x86 ISA-Bedingt nicht mehr Performance pro Thread holen lässt ist das eben ein inhärenter Nachteil davon, oder anders gesehen ein Performance Vorteil für ARM.
Ob man mit SMT mehr Performance herausholen kann ist bei der Betrachtung der Single-Thread-Performance irrelevant, weil ohne angepasste Software bringt SMT in jedem fall nix, und von mehr Durchsatz pro Thread profitiert jede Software und ist damit in jedem Fall vorteilhafter.

Genauso gut könnte ich sagen, die ganze Welt hat Bulldozer falsch getestet, die erbärmliche Single-Thread Performance ist ja nicht die Wahrheit, weil Bulldozer wurde ja "designed for multithreading".

Oder ich kann den ganzen Spieß umdrehen, und sagen die ganzen Multithread-Tests sind falsch, weil ARM könnte ja im selben Powerbudget wahrscheinlich 2-4x mehr Kerne unterbringen, also sind ja die ganzen Test M1 4-Kerner gegen Renoir 8-Kerner+SMT falsch (und der M1 ist selbst in dieser Situation zumindest mit nativem Code meistens schneller)

Ich spreche von der Aussage des zitierten "architects":


Mir ist absolut nicht klar, warum SMT für x86/CISC prinzipbedingt einen größeren vorteil im Vgl. zu RISC-Architekturen bieten soll.

Da muss man sehr weit in die Geschichte der Rechnerarchitektur zurückgehen, so weit dass es unsicher ist wie viel heute davon noch auf die Architekturen der Micro und Macro-Ops zutrifft.

Man muss verstehen wie und warum sich die Paradigmen der CISC und RISC Architekturen entwickelt haben.
CISC wurde zu einem Zeitpunkt entwickelt, als es noch üblich war Programme in Assembler zu coden. Ein wesentlicher Punkt für diese Entwicklung war es den Entwicklern die Arbeit zu erleichtern. Auch wenn das "Complex" in CISC erstmal danach klingt als wäre es schwieriger zu erlernen, ist ein mächtigerer Befehlssatz für die Softwareentwicklung wesentlich einfacher, da man mit weniger Befehlen das selbe Problem lösen kann.

Das kann man an folgendem Beispiel auch recht gut sehen:
Stell dir eine einfache RISC-ISA vor die keinen nativen Befehl für die Multiplikation hat. Das ist auch nicht notwendig, da eine Multiplikation immer durch eine mehrfache Addition simuliert werden kann. Wenn tatsächlich in Assembler programmiert wird, müsste der Entwickler für jede einzelne Multiplikation eine Schleife bauen, welche diese mehrfache Addition vornimmt, wobei Schleife eigentlich falsch ist, das ist schon ein Hochsprachenkonstrukt, in Hardware gibt es keine Schleifen, nur bedingte und unbedingte Sprünge, was das ganze noch mal wesentlich komplizierter macht.
Auf einer CISC Architektur die eine native Multiplikation kennt bräuchte man dagegen nur 1 Zeile.

CISC wurde also in erster Linie dafür entwickelt für den Menschen gut lesbar zu sein, nicht um für Maschinen gut lesbar zu sein.
Wobei CISC in der damaligen Zeit auch für die Hardware Vorteile hatte. Unter anderem war Speicher extrem teuer, und weniger Befehle heißt auch, dass CISC Programme weniger Speicher benötigen, also es war es auch ein wirtschaftlicher Vorteil.

Mit der Zeit wurden die Befehlssätze aber immer komplexer und es war mit CISC nicht mehr möglich alle Befehle nativ auszuführen. Also gab es Mikroprogramme direkt in den CPUs integriert, welche die komplexen Befehle auseinandernahmen und erst zur Laufzeit den eigentlich auszuführenden Code erzeugten.

Um zu dem vorherigen Beispiel zurückzukommen: Es ist nicht unbedingt notwendig dass, die fiktive CISC-Maschine auch tatsächlich eine ALU hat die multiplizieren kann um den Befehl in der ISA zur Verfügung zu stellen. Genauso gut könnte in der CPU ein Mikroprogramm laufen, welches aus dem Multiplikationsbefehl die notwendige Schleife erzeugt um die Multiplikation mittels Addition zu lösen.

Die Komplexität der Befehlssätze wurde also immer größer und damit auch die Komplexität der notwendigen Mikroprogramme. Letzteres wurde mit der Zeit immer problematischer, da jene in einem ROM direkt in der CPU liegen, und damit bei Fehlern nicht einfach ausgetauscht werden können.

Die Folge war, dass man die Befehlssätze wieder aufs nötigste reduzierte, Compiler waren mittlerweile fortgeschritten genug, dass man nicht mehr in Assembler programmieren musste, und die RISC-Idee war geboren.

Mit den RISC Befehlssätzen hat sich etwas sehr wesentliches geändert, die Befehlslänge war nun konstant.
Das führte dazu, dass die Idee des Pipelining realisiert werden konnte. Durch die konstante Befehlslänge musste der Programm-Counter immer garantiert um einen fixen Wert (oder ein vielfaches davon) inkrementiert/dekrementiert werden, und das wichtigste ist, dieser Wert ist immer bekannt. Mit variabler Befehlslänge weiß man erst nach dem Decoding wo der nächste Befehl beginnt.
Gleichzeitig vereinfacht es die Hardware enorm um Befehle in mehrere kleine Teile zu zerlegen die parallel abgearbeitet werden können.

Jenes Pipelining war es, dass damaligen RISC Prozessoren enorme Performancevorteile verschafft hat, bis dahin waren es nicht Instructions per Cycle sondern Cycles per Instruction.
Durch das Pipelining war erstmals ein Durchsatz von 1 Befehl pro Takt möglich.

Von diesen brauchte man mit RISC zwar mehr, aber wenn CISC für jeden Befehl gleich mehrere Takte braucht war man natürlich trotzdem schneller.

Die nächste Beschleunigung war dann OOOE, die ebenfalls durch RISC deutlich vereinfacht wurde.
Die Einfachheit der Befehle hatte auch zur Folge, dass jeder Befehl gleich viele Takte in der Pipeline braucht, was damit den Aufbau einer OOO Architektur wesentlich erleichterte.

Bis, nun ja bis Intel mit dem Pentium Pro das komplexe Decoding von x86 von der eigentlichen Ausführung entkoppelt hat und damit auch die Speedups durch OOE und Pipelining mitnehmen konnte.


Es ist also durchaus denkbar, dass es auch heute noch mit einem RISC Befehlssatz viel mehr ILP extrahieren lässt, als es mit x86 möglich wäre.

Ein weiterer Punkt sind die Decoder. Apple hat hier ein viel breiteres Design, was auch bedeutet dass es viel einfacher ist das Backend auch mit 1 Thread gut auszulasten.

Mit ziemlicher Sicherheit würde Apple also SMT wesentlich weniger bringen als bei x86, was jetzt aber keine Schwäche von deren SMT Umsetzung, sondern eine Stärke wäre, weil eben viel weniger Ressourcen brach liegen.

Die Frage ist nun ob x86 das Frontend auch so stark verbreitern könnte um bei der Performance pro Thread gleichzuziehen.

Ich würde dazu sagen eher unwahrscheinlich. Soweit ich weiß arbeiten die Decoder in modernen x86 Prozessoren quasi nach dem Trial&Error Prinzip, heißt sie machen sehr viel Arbeit umsonst, und verschwenden damit eine Menge Energie. Da bei x86 eben die Befehlslänge nicht im vorhinein bekannt ist, laden die Decoder einen Datenstrom aus dem I-Cache und probieren erstmal alle möglichen Instruktionslängen durch bis sie die richtige gefunden kann. Erst dann ist bekannt wo die Grenze zwischen 2 Befehlen ist.

Die Decoder noch breiter zu machen dürfte die Energieverschwendung wohl noch weiter erhöhen, falls nicht jemand eine geniale Idee hat wie man das Ganze anders lösen könnte.
 
Die Headline des Artikels ist etwas mißverständlich formuliert. Sie legt nahe, daß die Singelscore Vergleiche seitens Apple grundlegend fehlerhaft sind. Apple hat bisher aber nur seine eigenen Produkte mit dem M1 verglichen. Den Vergleich von M1 und X86 haben bisher "unabhängige" Medien eingebracht. Apple hat es nach langer gähnlangweiliger Zeit geschafft, die Kinnladen von so manchem nach unten klappen zu lassen und – Chapeau – mit einer Prozessorgeneration zu starten, die sich vor Intel/AMD nicht verstecken muß. Der niedrigste Preis für einen Mac – an den ich mich zumindest erinnern kann – ist ebenso ein Knaller.

Ich stimme meinem Vorredner PlayerOne vollständig zu SMT als Krücke der Architektur zu betrachten. SMT kann nur was bringen wenn die Software schon Multithreaded ist. Single Core Performance ist vielleicht einfach der falsche begriffliche Ansatz und die Single-Thread Performance sollte im Vordergrund stehen. Benches zur reinen Rohleistung eines Prozessor sind für mich nur Anhaltspunkte um zu sehen wie sich ein System ca. schlägt. Die Berücksichtigung anderer Faktoren fällt dort in der Regel unter den Tisch und interessiert ehrlich gesagt nur denjenigen, der alle Faktoren in seine monetäre Rechnung uns Szenario einfließen lassen muß.

Ein 11665G7 dem ich 28W + 4,7Ghz und evtl. noch nen Doppelthread zur Verfügung stelle damit er ausgelastet ist um zu sehen, das er einem M1 mit 10W + 3,2 GHZ vorraus ist? Sollte mir der Bench dann eine vernünftige Analyse der Leistung pro Watt und Taktzahl anzeigen, und mir somit das reine Leistungspotential aufzeigen, wäre dies zur Entscheidungsfindung optimal.

Pipi in den Augen werde ich allerdings bekommen wenn die Jungs und Mädels aus Cupertino Ihren M mit 32 Performance Kernen loslassen. ;)
 
Möglicherweise, ist aber auch eigentlich irrelevant, wenn sich aus x86 ISA-Bedingt nicht mehr Performance pro Thread holen lässt ist das eben ein inhärenter Nachteil davon, oder anders gesehen ein Performance Vorteil für ARM.
Ob man mit SMT mehr Performance herausholen kann ist bei der Betrachtung der Single-Thread-Performance irrelevant, weil ohne angepasste Software bringt SMT in jedem fall nix, und von mehr Durchsatz pro Thread profitiert jede Software und ist damit in jedem Fall vorteilhafter.

Aber genau darauf läufts eigentlich ja hinaus - die Annahme "wenn sich aus x86 ISA-Bedingt nicht mehr Performance pro Thread holen lässt" würde eigentlich gegen SMT sprechen...


Da muss man sehr weit in die Geschichte der Rechnerarchitektur zurückgehen, so weit dass es unsicher ist wie viel heute davon noch auf die Architekturen der Micro und Macro-Ops zutrifft.


Es ist also durchaus denkbar, dass es auch heute noch mit einem RISC Befehlssatz viel mehr ILP extrahieren lässt, als es mit x86 möglich wäre.

Sorry fürs abkürzen - wegen mir hättest du die geschichtliche Abhandlung nicht schreiben müssen (auch wenns schon eine Weile her ist, ich hab das Zeug studiert :) )...aber dein Schluss von obigem Satz lässt sich daraus nicht ziehen. Da ist nicht viel unsicher oder unklar. Nach dem Decoder gibts kein RISC vs CISC mehr, µops sind buchstäblich eine fixed length, ld/st-ISA, *alle* weiteren Pipelinestufen operieren damit.
Und dinge wie OoO-Scheduling sind ja mittlerweile durchgehend Standard - und grad letzteres z.B. beim M1 weit größer als bei aktuellen x86-Designs.

Ein weiterer Punkt sind die Decoder. Apple hat hier ein viel breiteres Design, was auch bedeutet dass es viel einfacher ist das Backend auch mit 1 Thread gut auszulasten.

Nein, genau das Gegenteil ist der Fall - und genau *das* ist mMn ja die große Kunst vom M1.

SMT ist ja wie schon gesagt primär eine Konsequenz davon, dass das Bottleneck eher im Backend zu suchen ist (welches rein auf µops operiert - da gibts keine prinzipiellen ISA-Unterschiede mehr!). Und jetzt kommt Apple mit einem etwas breiteren Decoder +) daher und schafft es immer noch, die execution units auszulasten.

Sachen wie der Scheduler (mit u.a. dem massiven >600I-ROB) und das irre Speicher-Subsystem, wo ein Core die gesamte Speicherbandbreite konsumieren kann (wovon Intel und AMD nur träumen können) - *das* sind die Highlights des M1. Und die sind mehr oder weniger ISA-unabhängig.


+) (Was so oft bei "x86 ist nur 4 wide" vergessen wird: Aus dem OpCache dispatcht Intel IIRC seit Skylake 6, AMD ab Zen 3 sogar 8µops...aber ich schweife ab. :) )

Mit ziemlicher Sicherheit würde Apple also SMT wesentlich weniger bringen als bei x86, was jetzt aber keine Schwäche von deren SMT Umsetzung, sondern eine Stärke wäre, weil eben viel weniger Ressourcen brach liegen.

Da stimme ich dir voll zu - aber aus den eben genannten Gründen.

Die Frage ist nun ob x86 das Frontend auch so stark verbreitern könnte um bei der Performance pro Thread gleichzuziehen.

Sie könnten es sicher. Es wird nur - zumindest wenn sie sonst nichts ändern - wohl nicht viel bringen: *weil dort nicht das primäre Bottleneck sitzt*.

Ich würde dazu sagen eher unwahrscheinlich. Soweit ich weiß arbeiten die Decoder in modernen x86 Prozessoren quasi nach dem Trial&Error Prinzip, heißt sie machen sehr viel Arbeit umsonst, und verschwenden damit eine Menge Energie. Da bei x86 eben die Befehlslänge nicht im vorhinein bekannt ist, laden die Decoder einen Datenstrom aus dem I-Cache und probieren erstmal alle möglichen Instruktionslängen durch bis sie die richtige gefunden kann. Erst dann ist bekannt wo die Grenze zwischen 2 Befehlen ist.

Die Decoder noch breiter zu machen dürfte die Energieverschwendung wohl noch weiter erhöhen, falls nicht jemand eine geniale Idee hat wie man das Ganze anders lösen könnte.

Naja, die zentrale geniale Idee hatte schon wer - den µop-Cache :) Und der ist so erfolgreich (v.a. auch was Energieeinsparung betrifft), dass er mittlerweile auch in aktuellen ARM-Designs verwendet wird (X1, A78 - leider konnte ich zum Apple Silicon dazu keine Info finden...) . Dessen Auslastung zu steigern ist wohl der "Easy Win" der Stunde :)
 
Schön, dass es hier Leute gibt, die sich schon länger und vor allem tiefer mit der Materie auseinander setzen als die meisten PC-Anwender heute. Ich habe auch zu der Zeit angefangen, als man sich noch mehr mit Computern befassen musste, wenn man nicht nur mit Basic programmieren wollte.
 
CISC stammt aus einer Zeit vor out of order execution, branch prediction, Caches und tiefen decode pipelines für CPUs mit wenigen Register, teilweise noch ohne MMU oder MPU.

Wenn du nur 4 Register hast und alles in order läuft hast machen komplexe Befehle Sinn, die Erleichterungen für den Programmierer sind da zweitrangig.

Sobald du viele Register, grosse Caches und tiefe Pipelines hast - alles was man halt so braucht um clock und IPC hochzutreiben - brauchst du einen Befehlssatz mit dem du deine Decoder, Pipelines und den ganzen Rest gut auslasten kannst und da sind komplexe Befehle eher schlecht weil man die nicht so gut schedulen kann und alle misses und falsch predicteten branches böse reinhauen.
 
es gibt bei den uOps sogar relativ starke architektonische Unterschiede selbst zwischen AMD und Intel, die Art und Weise wie Intel in und aus uOps (de)kodiert und scheduled ist ziemlich lange historisch gewachsen Und teilweise wird auch bis heute noch einiges per Microcode als intermediate stage gemacht (allerdinsg wenig) Außerdem müssen uOps nicht zwangsläufig feste Breite haben beim Itanium zum Beispiel waren sie das m.W.n nicht
 
Das ganze Register-aliasing und rewriting der ops in der Pipeline und so weiter betreibt Intel ja recht exzessiv weil da Ding ja von außen immer noch wie ein 8088 aussehen muss
 
Ein 11665G7 dem ich 28W + 4,7Ghz und evtl. noch nen Doppelthread zur Verfügung stelle damit er ausgelastet ist um zu sehen, das er einem M1 mit 10W + 3,2 GHZ vorraus ist? Sollte mir der Bench dann eine vernünftige Analyse der Leistung pro Watt und Taktzahl anzeigen, und mir somit das reine Leistungspotential aufzeigen, wäre dies zur Entscheidungsfindung optimal.
Hier (https://www.macrumors.com/2020/11/17/apple-silicon-m1-compiles-code-as-fast-as-mac-pro/) ist zwar kein "richtiger" Benchmark, aber zumindest ein Fingerzeig auf die Performance und die Effizienz des M1:

Der M1 in MBP und Mac Mini ist beim Kompilieren mit ungefähr 20 Minuten ähnlich schnell wie der 12-Kern Xeon im Mac Pro.
Der M1 im MBA braucht 5 Minuten länger, das MBP 16" mit 8-Kern Intel braucht nochmal 2 Minuten länger und der 4-Kern Intel im alten MPB braucht ungefähr doppelt so lange.

Fast noch beeindruckender finde ich die verbleibende Akkuladung. Die beiden M1-MacBooks brauchen 9% Akku, das Intel MBP 13" braucht 76% Akku und das 16" MBP braucht 39% von seinem rund doppelt so großen Akku. Die M1-Macs mögen sicher näher am Sweetspot arbeiten und die Software mag besser optimiert sein. Dennoch finde ich das ziemlich beeindruckend, insbesondere für Apples ersten Wurf (als direkte Konkurrenz zu Intel mit Desktop-OS).
 
Naja, die zentrale geniale Idee hatte schon wer - den µop-Cache :) Und der ist so erfolgreich (v.a. auch was Energieeinsparung betrifft), dass er mittlerweile auch in aktuellen ARM-Designs verwendet wird (X1, A78 - leider konnte ich zum Apple Silicon dazu keine Info finden...) . Dessen Auslastung zu steigern ist wohl der "Easy Win" der Stunde :)

Naja, trotzdem liegt Apple hier bei der Performance pro Watt weit in Front und alles was im µop-Cache muss eben vorher trotzdem durch die energiefressenden Decoder.
Und das obwohl Apple bei der absoluten Performance pro Thread immer noch an der Spitze mitmischt, es ist also nicht einfach nur ein auf Effizienz getrimmtes Design, dass dafür Spitzenleistung liegen lässt.
 
Nachdem ich den Ansatz richtig gut finde, hoffe ich jetzt mal, dass Apple mit einem neuerlichen RISC Ansatz im klassischen PC Bereich mehr Erfolg beschieden sein wird als seinerzeit DEC (Alpha) oder NEXT oder Sun (Sparc Stations) vor gefühlten 25 Jahren.
Wozu genau? Für günstigere Consumerpreise wird der Apple-Einstieg ja nicht sorgen.
 
Das hat er doch schon? Unter Preis-Leistungsgesichtspunkten hat sich Apple durch die M1 Geräte doch quasi über Nacht von rein obszöner Apothekenpreisgestaltung zu durchaus beindruckender Preisgestaltung durchringen können. Die kanibalisieren sich ja sogar selbst - einige der eigenen hochpreisigeren Geräte sind komplett obsolet. Und so ein Einstiegs Macbook Air M1 ist meiner Meinung nach ein echter Preishammer, wenn man mal seriös analysiert. Sicherlich nicht für die "Pro"-gamer unter uns (fürs Gaming hab ich hier auch ne 3080 mit 5800x stehen), aber für vieles andere ... wow. Mir tun die Leute leid, die sich vor kurzem noch einen Intel-Mac gekauft haben (mein Retina iMac ist zum Glück schon über 6 Jahre alt). Auch selbst mit Windows-Kisten verglichen: für 1150 Euro bekommt man ein Notebook mit 15-18 Stunden Akkulaufzeit, das immer komplett lautlos bleibt und in diversen Benchmarks mit deutlich höherpreisigeren Geräten (auch aus dem eigenen Haus) den Boden aufwischt. Wieviel mehr Preisleistungseffekt für Consumer möchtest du denn noch haben, dawit?
 
Wozu genau? Für günstigere Consumerpreise wird der Apple-Einstieg ja nicht sorgen.

Ach, was interessieren denn hier die Consumerpreise ?
Letztlich wird hier ein alternatives System etabliert, wobei Apple genau das tut, was sie immer tun - und zwar seit Jahrzehnten.
Das war beim Shift von der Motorola 68xxx Architektur zum Power-PC, vom Power-PC zu Intel und jetzt von Intel PC zu Apple Silikon immer dasselbe. Und ich habe im Bekanntenkreis weiß Gott jede Menge Apple Jünger, denen nichts anderes ins Haus käme - und - NEIN - die Preise werden eher nicht sinken und die mangelnde Upgradefähigkeit der M1 Geräte wäre für mich persönlich ein No-Go, das geht schon beim Arbeitsspeicher los.
Aber die P/L ist für Apple Verhältnisse gut und das Konzept ist stimmig - was auf der Desktop Schiene hier noch kommt, bleibt indes abzuwarten.
Was ich am aktuellen Ansatz spannend finde, ist das Wiederaufleben einer Architektur, die grundsätzlich technisch überlegen sein KANN, wenn sie denn vernünftig eingesetzt und auch beworben wird. RISC Prozessoren waren schon immer besser in den Dingen, die sie gut können. Das muss man nur konsequent umsetzen (dafür braucht es die Marktpower eines großen Global Players) und es dem Kunden auch sinnvoll vermitteln, was nichts daran ändert, dass ich persönlich keine Apple Geräte besitze und auch nicht vorhabe, zu kaufen.
 
Das hat er doch schon? Unter Preis-Leistungsgesichtspunkten hat sich Apple durch die M1 Geräte doch quasi über Nacht von rein obszöner Apothekenpreisgestaltung zu durchaus beindruckender Preisgestaltung durchringen können. Die kanibalisieren sich ja sogar selbst - einige der eigenen hochpreisigeren Geräte sind komplett obsolet. Und so ein Einstiegs Macbook Air M1 ist meiner Meinung nach ein echter Preishammer, wenn man mal seriös analysiert. Sicherlich nicht für die "Pro"-gamer unter uns (fürs Gaming hab ich hier auch ne 3080 mit 5800x stehen), aber für vieles andere ... wow. Mir tun die Leute leid, die sich vor kurzem noch einen Intel-Mac gekauft haben (mein Retina iMac ist zum Glück schon über 6 Jahre alt). Auch selbst mit Windows-Kisten verglichen: für 1150 Euro bekommt man ein Notebook mit 15-18 Stunden Akkulaufzeit, das immer komplett lautlos bleibt und in diversen Benchmarks mit deutlich höherpreisigeren Geräten (auch aus dem eigenen Haus) den Boden aufwischt. Wieviel mehr Preisleistungseffekt für Consumer möchtest du denn noch haben, dawit?
Das Gesamtpaket ist keineswegs so günstig, wie es auf den ersten Blick scheint, alleine die CPU-Leistung ist tatsächlich der absolute Ausreißer.
Die 1129€ gibt doch keiner aus, die meisten werden sehr wohl Ram+SSD bei der Bestellung aufstocken. Und hier kostet 1 zusätzlicher
GB Arbeitsspeicher fast soviel wie 8 im Normalfall, 1TB kostet soviel wie 4 von den Samsung 970 EVOs a 1TB (und es gibt ja durchaus solide günstigere). Das ist, wie Alkbert schon andeutet, schlicht der Versuch, den "alteingesessenen" einen Umstieg auf die neue Hard- und Software schmackhaft zu machen, obwohl ihre "alte" Hardware ja durchaus ausreicht. Für alle "nicht-an-Apple-interessierten" spielt das keine Rolle:
"günstig" ist hier allenfalls der Einstieg in einer im Vergleich teuren Alternativwelt, und Intel/AMD werden ihre Produkte jetzt auch nicht
deswegen verbilligen. Das hat bei den Smartphones ja auch schon nicht geklappt: statt in der (Support-)Qualität aufzuholen, bieten zB
Samsung und Co. mittlerweile auch Produkte auf Iphone-Preisniveau. Ein gewisses "Umdenken" findet da erst durch die vermeintliche
"Billig"-Konkurrenz Xiaomi oder Oppo statt. Deswegen meine Frage, technisch ist das sicher sehr spannend, zu sehen, inwiefern
AMD/Intel darauf reagieren (langfristig), aber geradezu wünschen muss man Apple den Erfolg nicht. Den hat Apple so oder so -
oder eben nicht :p
 
Single-Core ist nicht Single-Threaded. Genau da beginnt ja schon die Verzerrung.

Das ganze Thema rund um Single-/Multi-Core und -Threading ist noch wesentlich komplexer und undurchschaubarer als es meist dargestellt wird.
Dazu kann man sich nahezu bis zur Unendlichkeit ausspinnen:

Nach meiner Erfahrung kann man anhand von Benchmarks wie beispielsweise Cinebench maximal einen ungefähren Richtwert erfahren, welche Leistung man schlussendlich von einem bestimmten Prozessor in diesem Fall von Maxon's Cinema in etwa erwarten kann.
Aber eigentlich war es das dann auch schon. Beim nächsten Programm (Spiel) kann es schon wieder völlig anders aussehen.

Nach meinen Beobachtungen neigen nahezu alle Entwickler dazu, in ihren eigenen Programmen (also auch Spielen) überhaupt gar keine Threads speziell einem Prozessorkern (oder Thread) zuzuweisen, sondern überlassen diese Aufgabe den Betriebssystemen selbst, was aber im Grunde nicht die optimale Lösung ist. Denn woher soll das OS auch am besten wissen welchen Programmthread es jetzt am optimalstem welchem CPU-Thread zuweisen soll.
Hinzu kommt, vor allem auffällig bei Grafiklastigen Programmen wie Spielen, dass die Treiber selbst (ja das sind auch Programme) haufenweise Threads und somit CPU-Resourcen beanspruchen. Und ich rede hier nicht nur von GPU-Treibern.

Aber logischerweise ist diese Art der Implementierung auch verständlich, denn bei nahezu endlosen Kombinationsmöglichkeiten an Prozessor- und Plattformvarianten würde dies weiteren Entwicklungsaufwand und -kosten produzieren. Dennoch genügt diese Vorgehensweise um den schwarzen Peter bei (angeblichem) Fehlverhalten dem OS zuzuschreiben - und alle rufen Windoof :p .

Zu den Threads - Cinebench ist da auch wieder ein gutes Beispiel:

Wenn ich das Programm beispielsweise jetzt gerade mal auf meinem Rechner hier einfach nur starte, und es im Grunde auch überhaupt quasi noch gar nichts macht, zeigt mir der Windows-Taskmanager bei diesem Programm schon 41 Threads an! Auch wenn die überhaupt noch gar nichts großartiges zu tun scheinen:
1616756561469.png

Dann mal den Single-Core Test starten und schon sind wir bei 58 Threads
1616756726380.png

Im Multi-Core Test sind es logischerweise 60... macht ja auch Sinn bei 8 Kernen und 16 Threads :p
1616757126900.png

Jetzt kann man ja auch noch einen Blick auf die CPU-Auslastung werfen:
1616756854094.png

Wie schon gesagt und man offensichtlich erkennt: Windows übernimmt hier die Thread-Verteilung für Cinebench.
Es scheinen aber eher zwei Kerne zu sein als nur einer... oder vier Threads... beziehungsweise 58 Threads verteilt auf 16 Threads... in diesem einen Moment weiß das vermutlich noch nicht einmal Windows selbst.


Ist das denn jetzt immer noch Single-Thread? Oder Single-Core vielleicht? Single-Thread auf Multi-Core verteilt? Multi-Thread auf Single-Core? :unsure:.


Meiner Ansicht nach findet das Thema kein Ende und Unterschiede in Benchmark-Ergebnissen von +/-unendlich-viel-% wundern mich auch absolut kein bisschen :cool:.
 

Anhänge

  • 1616757978765.png
    1616757978765.png
    11,4 KB · Aufrufe : 0
Ist das denn jetzt immer noch Single-Thread? Oder Single-Core vielleicht? Single-Thread auf Multi-Core verteilt? Multi-Thread auf Single-Core? :unsure:.
Ja, Nein, Ja, Nein.

Wie viele Prozesse im Taskamanger angezeigt werden ist unwichtig. Solche Threads können das normal laufende Programm mit Eingabemenus, Tastatur und Mausabfrage, Bildschirmausgabe und Überwachung des Benchmarkvorgangs sein. Wie viele Tasks ein solches Testprogramm verwendet, spielt keine Rolle. Diese brauchen auch kaum Leistung, so dass es auf den Benchmark keinen Einfluss hat.

Interessant ist nur, wie viele Prozesse gestartet werden, die dann auf voller Leistung Berechnungen durchführen, um den Prozessor auszulasten. Wenn man Singlethread wählt, dann ist das nur ein Prozess, der gestartet wird, bei Multithread dann eben so viel Threads wie der Prozessor maximal gleichzeitig laufen lassen kann oder so viel wie man einstellt.

Auf deinem Bild vom Taskmanager sieht man, dass sich die Last trotzdem auf mehrere Kerne verteilt. Manchmal macht das Windows, manchmal auch nicht. Es ist aber zu jedem Zeitpunkt nur ein Prozess, der mal da läuft und mal da. Es ist so zu sagen ein Arbeiter, der manchmal den Arbeitsplatz wechselt. Es sind aber nie 2 Arbeiter gleichzeitig an der Arbeit. Darum bleibt es Singlethread, auch wenn es nicht so aussieht. Der Prozess ist voll ausgelastet und kann nicht schneller.

Das ist auch in vielen Programmen das Problem, dass ein Hauptprozess einen wichtigen Teil der Arbeit macht, und diese nicht an andere Threads abgeben kann. Es hilft nichts, wenn viele Arbeiter da sind, aber der Vorgesetzte diesen seine Arbeit nicht abgibt. Dann rennt und schwitzt er weiter und die anderen drehen Däumchen. Da viele Programme einen Teil der Arbeit verteilen können, aber auch eine Teil am Hauptprozess hängen bleibt, machen die beiden Tests Singlethread und Multithread Sinn. Praktisch liegt es dann je nach Anwendung irgendwo dazwischen.
 
Das ganze Thema rund um Single-/Multi-Core und -Threading ist noch wesentlich komplexer und undurchschaubarer als es meist dargestellt wird.

Fakt ist, es macht keinen Sinn zwischen Singlecore/Singlethread und Singlecore aber Mutlithread zu unterscheiden.
Die Bezeichnung "Singlecore-Performance" ist vielleicht nicht genau genug, aber die Singlethread-Performance ist neben der gesamten Multithread Performance das einzig relevante.

Ist das denn jetzt immer noch Single-Thread? Oder Single-Core vielleicht? Single-Thread auf Multi-Core verteilt? Multi-Thread auf Single-Core? :unsure:.

Jedes Programm verwendet heutzutage mehrere Threads. In Windows gibt es für jedes Programm grundsätzlich mal genau einen UI-Thread. Jedes Programm das irgendwas aufwändigeres macht und gleichzeitig noch ein reaktionsfähiges UI anzeigt muss das "aufwändige etwas" in einem separaten Thread machen.

Beispielsweise ein Browser der einen Download ermöglicht, und dabei nebenher noch eine normale Bedienung des Browsers ermöglicht muss diesen Download in einem separaten Thread machen. Jetzt mal die Tatsache ignorierend, dass moderne Browser real sogar für jeden Tab aus Sicherheitsgründen überhaupt einen eigenen Prozess spawnen (der Hauptgrund warum diese so großzügig an RAM brauchen), aber Browser konnten schon vor 10 Jahren Downloads im Hintergrund ausführen und damals liefen diese in eigenen Threads.
Diese Downloadthreads brauchen aber keine großartige CPU-Leistung.

Wenn wir von Singlethread/Multithread Performance sprechen meinen wir nur die Anzahl der Threads welche für die gerade betrachtete Aufgabe zuständig sind.
Am Beispiel von Cinebench meinen wir jene Threads die das Rendering durchführen, und das ist beim Singlecore respektive Singlethread-Test eben nur 1 Thread. Dass Cinebench daneben noch 40 andere Threads für irgendwelche anderen Hintergrundaufgaben hat ist egal, die haben keinen nennenswerten Einfluss auf das Ergebnis.

Am Beispiel von Cinebench sieht man im Processexplorer, in dem man auch die einzelnen Threads sieht, dass im Single-Thread Test logischerweise nur 1 Thread wirkliche Arbeit macht und der Rest praktisch nichts.

Screenshot 2021-03-29 114550.png

Die Minimale Auslastung der Cinebench.exe liegt vermutlich an der dynamischen Vorschau, die höchstwahrscheinlich wirklich nicht im Renderthread laufen, und der Rext macht gar nix.
 
Oben Unten