Rosetta 2: Darum ist Apples „Notlösung“ für x86-Apps so schnell
Apples Umstieg auf die hauseigenen ARM-Chips begann vor zwei Jahren und ist mittlerweile fast abgeschlossen. Lediglich im Mac Pro arbeiten noch Intel-Prozessoren, alle anderen Desktops und Notebooks verfügen über eine M-CPU, in einigen werkelt sogar schon deren zweite Generation. Der fortschreitende Architekturwechsel macht sich naturgemäß auch bei den Apps bemerkbar, die meisten Anwendungen gibt es in nativen Ausführungen für Apple Silicon. Wer noch x86-Programme einsetzen muss, hat damit allerdings keine Probleme, denn Apple sorgt bekanntlich mit Rosetta 2 für umfassende Rückwärtskompatibilität von M-Macs.
Rosetta 2 übersetzt x86-Anweisungen in ARM-CodeBemerkenswert an dem Tool, das den Übergang in die neue Mac-Ära so nahtlos wie möglich gestalten soll, ist dessen Performance. Der Entwickler Dougall Johnson hat jetzt ergründet, weshalb Rosetta 2 so schnell ist. Das Ergebnis seiner Untersuchung veröffentlichte er in einem längeren und aufschlussreichen
Blog-Beitrag. Die Grundlage für die Geschwindigkeit legt Apple dadurch, dass es sich bei der „Notlösung“ für Intel-Apps bekanntermaßen nicht um einen reinen x86-Emulator handelt. Das in macOS enthaltene Tool übersetzt den ursprünglichen Code lediglich einmal in ARM-Instruktionen, und zwar vor dem ersten Start einer entsprechenden App. Dabei berücksichtigt Rosetta 2 auch Sprunganweisungen und Aufrufe. Nur wenn diese während der Laufzeit eines Programms unerwartet auf die Mitte einer x86-Instruktion verweisen, kommt während der Ausführung ein zusätzlicher Just-in-Time-Compiler zum Einsatz (JIT).
Optimierungen sorgen für PerformanceRosetta 2 enthält zudem weitere Optimierungen, welche sich positiv auf die Performance auswirken. Dazu gehört unter anderem ein spezielles RAM-Layout, bei dem übersetzter Binärcode hinter den noch im Original vorliegenden Teilen platziert wird. Das ermöglicht Johnson zufolge direkte Aufrufe der Runtime. Darüber hinaus unterstützt Apples Tool die in modernen Prozessoren, also auch in den M-Chips vorhandene „return address prediction“ und schreibt die x86-Instruktionen „CALL“ und „RET“ in die entsprechenden ARM-Anweisungen namens „BL“ und „RET“ um. Außerdem nutzt Rosetta 2 die „flag-manipulation extensions“ von ARM-Chips, um mit den Unterschieden zum Verhalten von Intel-CPUs effizient umgehen zu können. Weitere „Tricks“ setzt Apple im Zusammenhang mit dem Handling von Fließkommaoperationen sowie bei der Nutzung einer in den M-Prozessoren verwendeten Technik namens „total store ordering“ ein.
M-Chips enthalten eine spezielle ErweiterungDie enorme Leistungsfähigkeit von Apple Silicon spielt bei der Performance von Rosetta 2 natürlich ebenfalls eine Rolle. Apple hat die hauseigenen SoCs zudem mit einer undokumentierten Erweiterung ausgestattet, welche die Umsetzung bestimmter Instruktionen und Register im Zusammenhang mit Additionen und Subtraktionen beschleunigt. Johnson zufolge dient dieser Ansatz dazu, die allergrößten Probleme bei der Übersetzung von Intel-Code in ARM-Anweisungen hardwareseitig anzugehen und somit im Zusammenspiel mit den anderen Maßnahmen für die bemerkenswerte Performance von Rosetta 2 zu sorgen.