Apple vil bruge ARM-processor i MacBooks: Kan starte chip-revolution

Plus11. juni 2020 kl. 16:5416
Apple vil bruge ARM-processor i MacBooks: Kan starte chip-revolution
Illustration: ARM.
ANALYSE: Det kan være startskuddet på en længe ventet chip-revolution, når Apple forventes at bytte Intels x86-chips ud med egenudviklede ARM-chips fra næste år. For selvom ARMs processorer stadig har en lavere ydeevne, er de langt mere energieffektive, fleksible og ikke mindst billigere.
Artiklen er ældre end 30 dage

Rygterne har svirret de seneste år. Hvornår melder Apple åbent ud, at de vil skrotte Intels x86-platform og erstatte den med Apples egne ARM-chips i de bærbare Mac-computere. Senest har flere analytikere over for Bloomberg spået, at den udmelding bliver officiel om få uger under den årlige Apple-udviklerkonference WWDC.

Gratis adgang i 30 dage

Tegn et gratis prøveabonnement og få adgang til alt PLUS-indhold på Ing.dk, Version2 og Radar, helt uden binding eller betalingsoplysninger.

Alternativt kan du købe et abonnement
remove_circle
Har du allerede et PLUS-abonnement eller klip?
close

Velkommen til PLUS

Da du er ved at tilmelde dig en gratis prøve beder vi dig hjælpe os med at gøre vores indhold mere relevant for dig, ved at vælge et eller flere emner der interesserer dig.

Vælg mindst et emne *
Du skal vælge en adgangskode til når du fremover skal logge ind på din brugerkonto.
visibility
Dit medlemskab giver adgang
Som medlem af IDA har du gratis adgang til PLUS-indhold, som en del af dit medlemskab. Fortsæt med MitIDA for at aktivere din adgang til indholdet.
Oplever du problemer med login, så skriv til os på websupport@ing.dk
Abonnementsfordele
vpn_key
Fuld adgang til Ing.dk, Version2 og Radar
Fuld digital adgang til PLUS-indhold på Ing.dk, Version2 og Radar, tilgængeligt på din computer, tablet og mobil.
drafts
Kuraterede nyhedsbreve
Det seneste nye fra branchen, leveret til din indbakke.
Adgang til andre medier
Hver måned får du 6 klip, som kan bruges til permanent at låse op for indhold på vores andre medier.
thumb_up
Adgang til debatten
Deltag i debatten med andre kloge læsere.
16 kommentarer.  Hop til debatten
Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger
16
13. juni 2020 kl. 11:00

Lidt mere detaljeret info om, hvordan en emulator fungerer (krydskompilerende). Der er kopi af den oprindelige kode, så der altid er adgang til de oprindelige data.

Der er en layout map, der fylder det samme som den oprindelige kode. Det indeholder single-byte call indstruktioner der kalder en oversætter. Og så er der endeligt et område/områder med den krydsoversatte og optimerede kode til den nye processor.

Antager vi, at programmet f.eks. starter i adresse 0, så hopper vi til addresse 0 i vores layout map område. Her står en single-byte call til oversætteren, og oversætteren kaldes. Denne oversætter fra den oprindelige kode et stykke af programmet, typisk indtil en branch, man ikke kender retningen af, men den kan også oversætte mere.

Herefter udskifter den call-byten i layout map'en, med en jump til den oversatte kode. Nu kan vil et jump til vores addresse i kode layout map'en, medføre at vi udføre den oversatte kode. Vores kode layout map, har samme addresse layout som den CPU vi emulerer.

Stak problemer kan løses på flere måder, f.eks. ved at vi altid placerer call indstruktioner i kode layout map området. Her svarer addresserne til det originale program, og derfor gemmes de samme data på stakken, og der returneres til de samme addresser. Processorerne kan også være udstyret med features, så vi kan have call/returns der ikke står i dette område.

Når der returneres til en addresse fra stakken, så vil der i layout-map'en stå en hop addresse, til den oversatte kode efter vores call indstruktion.

Man kan forestille sig det sådan, at vi beholder de samme addresser i layout map'en, så der opnås kompatibilitet på addresse niveau. Men, vi gemmer vores oversatte kode et andet sted, så der er plads til udskejelser og tilpasninger.

Nu kan man tro at det tager masser af tid med sådan et ekstra lag bestående af en layoutmap, der primært består af call og jump indstruktioner. Det tager dog ikke ekstra tid - for processorer i dag arbejder med flere ting parallelt, og udførslen af selve indstruktionerne kører adskildt. Det at læse vores jumps og call, og håndtere stakken, foregår derfor parallelt med udførslen af kode, og tager ikke nogen tid. I dag bruges ingen tid på jumps, branches og call/return i processorer. Det er derfor ikke et problem hastighedsmæssigt med et lag der ikke indeholder andet.

Umiddelbart skulle man tro der bruges mere ram, da der både er det oprindelige lager, der er et layout map lager, og der er kode lager. Men, moderne processorer har slet ikke nogen ram. I stedet gemmes alt på harddisken. Når man ønsker et ram område, så sker det ved man åbner en fil på harddisken og bruger den. Når en fil åbnes på harddisken, så assoiceres den til et område i ram'en, og herefter kan man skrive og læse til harddisken, ved at accessere til rammen i det åbnede område. Imidlertid, så er der altid en stor ram cache, så det ikke føles som om det er harddisk, men som ram. Det betyder dog, at det er meget hurtigere at hente store programmer ind, da de ikke tager tid at hente til ram'en, for der sker intet andet end en assoicering med området. Først, når at en del af et program reelt udføres, så vil den hentes ind i ram'en. Dette opdages heller ikke, at det tager tid, for moderne processorer har en række prediction features, så den henter dataene ind før de reelt bruges, blandt andet ud fra analyse af kode. At der er reserveret mere lager til et program, medfører derfor ikke et større ram forbrug, da ram'en ikke reelt findes.

En emulering kan samtidigt optimere koden, og det er muligt at emulere en processor, så den kører ca. 10% hurtigere, på sig selv, hvis den kører ældre uoptimeret kode.

Emuleres den på konkurentens processor, kører den ofte hurtigere end original processoren, fordi at konkurenterne normalt placerer flere resourcer i CPU'en. Og, med software emulering, er muligt at opnå blandt andet parallelisering af sekventiel kode. Man har i mange år arbejdet med at automatisk parallelsiere sekventiel kode, for at kunne køre PC programmer optimalt på supercomputerne.

Oftest vil man udvikle moderne processorer med overvejelser om hvad der sker i en compiler drevet simulering i tankerne, da det er en typisk applikation. Som eksempel vil både emulering af x86 processorer, og andre konkurerende indstruktionssæt, ofte kunne udføres hurtigere, end producerenter der har oversættelse i hardwaren formår.

15
12. juni 2020 kl. 16:55

Det gennemprøvede valg til ARM hedder derfor Linux. Raspberry Pi er ARM baseret og langt det meste Desktop software til x86 kan også hentes til Raspberry Pi.

Det ville være dejligt hvis det var sådan, men ARM hardware er desværre hverken særligt standardiseret eller åbent. Jeg har f.eks. efterhånden længe søgt efter en telefon som kan køre ubports. Der findes stadig kun ganske få enheder at vælge imellem og det er en kamp fordi der ikke er standarder på området. En løsning ville være at tvinge firmaerne til at udlevere kildekode når et stykke hardware ikke længere blev supporteret, men det kræver jo desværre nogle politikere med mod. Der er dog projekter/firmaer (pine64/librem o.a.) som gerne vil noget andet, så måske er der muligheder.

14
12. juni 2020 kl. 14:53

Re: Udfordring til Microsoft også</p>
<p>Det kræver en MMU som er i stand til at give et interrupt, når man kommer ud i indstruktioner der ikke er oversat - det er de fleste MMU'er i stand til</p>
<p>Er det ikke at gøre lige lovligt meget vold på et princip.</p>
<p>Det virker fint, hvis du forsøget at afvikle kode skrevet til en nyere processor på en gammel processor.</p>
<p>Men her er der jo tale om en helt anden familie. Altså ALLE instruktioner er ikke oversat. Det bliver et sandt interrupt helvede.</p>
<p>intet bliver hurtigere af at blive abstraheret.</p>
<p>Det betyder ikke så meget, så længe det der kan komme en optimizer på.

Der skulle helst ikke komme interrupts, for kode som allerede er oversat. Hvis koden er selvmodificerende, så kommer der interrupts, f.eks. hvis der hentes et nyt program ind.

Du skal forestille dig det sådan, at der oversættes et lille stykke kode, og efterhånden som programmet kører, så oversættes mere og mere, og er det oversat en gang, så oversættes ikke normalt igen, med mindre at koden er modificeret, så en genoversættelse er nødvendigt.

12
12. juni 2020 kl. 14:30

Det kræver en MMU som er i stand til at give et interrupt, når man kommer ud i indstruktioner der ikke er oversat - det er de fleste MMU'er i stand til

Er det ikke at gøre lige lovligt meget vold på et princip.

Det virker fint, hvis du forsøget at afvikle kode skrevet til en nyere processor på en gammel processor.

Men her er der jo tale om en helt anden familie. Altså ALLE instruktioner er ikke oversat. Det bliver et sandt interrupt helvede.

intet bliver hurtigere af at blive abstraheret.

Det betyder ikke så meget, så længe det der kan komme en optimizer på.

13
12. juni 2020 kl. 14:48

Du må være software mand? Alle problemer løses med at lave et abstraktionslag mere?</p>
<p>(intet bliver hurtigere af at blive abstraheret. Men udvikling af kode bliver mere effektiv. Og det tæller langt mere hvis computeren allerede er 'hurtig nok')

Nej, jeg er hardware mand. Og har et godt kendskab til de laveste lag i CPU'en. At lave en in-time krydskompiler er dog både hardware og software. Det kræver en MMU som er i stand til at give et interrupt, når man kommer ud i indstruktioner der ikke er oversat - det er de fleste MMU'er i stand til, fordi at man skrivebeskytter de dele/blokke der er oversat. Forsøges at skrive til området (selvmodificerende kode), gennereres et interrupt, og den kode der er oversat i blokken erklæres ugyldigt, så stykket genoversættes når det senere skal udføres. Herefter ser man hvilke hele områder der ikke mere er oversat i det oprindelige kode, og disse dele kan der så accepteres skrivninger til. Det er ikke så svært at lave, og i mange tilfælde kører koden hurtigere - der er faktisk lavet eksperimenter, hvor man har "emuleret" en pentium på en pentium, og derved fået koden til at gå hurtigere, specielt hvis den kode der køres ikke har været ordentligt register optimeret., altså oversat med en ældre oversætter, eller hvis den ikke har været ordentligt paralleliseret til antallet af CPU'er der har været på computeren. Fordelen har dog kun været ca. 10%. Man kan også analysere koden, og parallelisere den, så almindelig sekventiel maskinkode kan køre massivt parallelt. Dette kan give meget hvis hardwaren er forbedredt for det. I forhold til det som Intel gør, når de emulerer deres cpu i hardware, så er det en meget mere advanceret teknik, der tillader langt større analyse af koden. Den tid det tager er helt ubetydelig, og ofte opdages det ikke. Dertil kan man lade det ligge i en cache så oversættelser fra sidst bliver liggende. Helt detaljeret kan du forestille dig, at du simulere koden, for at finde ud af, hvilke dele af koden som bruges. Oftest kun indtil næste branch, da man ikke kender retningen, og ikke vil bruge tid på at oversætte kode, der måske aldrigt anvendes. Når den kommer til branch'en oversætter den så næste stykke i den retning som hoppes Der er noget teknik i det, men med de computere vi har i dag er det forholdsvis simpelt. Computerens indstruktionssæt betyder ikke noget mere. Det er relativt nemt at lave en oversætter, der oversætter programmet i små stykker fra branch til branch, og genererer et nyt program, efterhånden som programmet kører, der er lavet til den aktuelle processor. Det er også muligt at oversætte traditionelle CPU programmer ned i helt andre akitekturer, f.eks. FPGA baseret. Der er en række problemer, f.eks. med stakken, da mange programmer arbejder på kodeaddresser der står på stakken, og man designer derfor oftest CPU'erne, så de har flere stakke, og kan anvende en stak der svarer til den oprindelige stak på den emulerede computer, og har andre stakke, til de reelle stakke hvor de korrekte addresser ligger.

9
12. juni 2020 kl. 12:25

Synes ikke de nævnte problemstillinger i denne artikel belyser emnet nok.

Hvad angår performance, så har det vist sig at iPad Pro på visse områder har bedre performance en tilsvarende MacBook. Og ARM-processorerne er jo bare blevet hurtigere og hurtigere, så det er ikke svært for Apple at se hvornår Intel er overhalet.

Hvad angår overgangen for apps, så har Apple jo også meget mere styr på denne del. Apples primære udviklersprog er swift, som jo allerede kører på ARM. Men Mac'er afvikler også Obj-C, men API'erne (frameworks) har Apple styr på, så de har formentlig et overblik og en viden om porteringen af dem, således at en app blot skal re-kompileres for at kunne køre på ARM.

Hvis det bliver ligesom de tidligere overgange, så vil Xcode lave en FAT-binary version, hvor der er maskin-kode til begge processorer i samme fil, som formentlig relativt let vil kunne kompileres ud fra eksisterende kode.

Men det vil ikke appelere til alle, der er brugere, som jeg selv, som har behov for at afvilke Windows og andre systemer virtualiseret, og det vil være en noget andet oplevelse hvis processor-instruktionerne skal konverteres af VM-programmet.

7
12. juni 2020 kl. 02:01

Hvis man ved lidt om talsystemer og boolsk logik, men ikke ved ret meget om hvordan CPU'er fungerer, kan jeg anbefale det her ingeniørspil, hvor man starter kun med NAND gates, og så laver mere og mere avancerede byggeklodser, for til sidst at have en simpel CPU</p>
<p><a href="https://nandgame.com/">https://nandgame.com/</a&gt;

Jeg har siddet og leget lidt med den, og syntes faktisk den er rigtig god. Hvis nogen har nogen børn, er det godt at leje med. Hvis jeg havde lavet den, havde jeg måske valgt nogle andre typer DFF's. Og det kan forvidre lidt, at hastigheden i komponenterne har betydning, og at forsinkelserne ikke kan være vilkårlige. Jeg vil måske have valgt en type flipflops, hvor hastigheden i komponenterne ingen betydning har overhovedet (separat klok til master/slave flipslops med ikke overlappende klok). Kredsløb hvor hastigheden betyder noget og styres i timingen i invertere og gates, er lidt tricky og kan give mange fejl, f.eks. i skifteregistre, og de afhænger meget af de analoge spændinger, samt afkobling og er skrøbelige. To-faset ikke overlappende klok kan sammenlignes med at man har en RS flipflop på ved hver DFF der fjerner støjen, men det er langt mere genialt, da hastighedne der kan opnås er langt større end i et normalt klokket system med flankestyret klok. Normalt kan klokhastigheden kun blive størst i et system med flankestyret klok, hvis der ikke er nogen operationer mellem kloksignalerne, mens det bliver hurtigst med et tofaset system, hvis der laves noget mellem kloks. I stort set alle tilfælde, undtagen i todelere, er 2-faset ikke overlappende kloks derfor mest optimale. Signalerne går igennem chipsene som bølger med denne klokstrategi, og skal ikke vente ved alle portene. Vi kan sammenligne 2-faset ikke overlappende klok med grøn bølge i trafikken, mens flankestyret klok, svarer til at der altid skal holdes for rødt ved alle lyskurver, for at være sikker, og når der er grønt, skal man vente på et rødt til grønt skift. Flankestyrede kloks, tvinger derfor signalerne ned i hastighed, fordi de skal standse og vente hele tiden mens to-faset ikke overlappende klok gør at de kører igennem som en bølge, der ikke normalt ikke standses.

6
12. juni 2020 kl. 01:16

Selvom Windows findes til ARM, så vil skiftet af processor også åbne for spørgsmålet om OS også skal skiftes. x86 programmer kan jo alligevel ikke afvikles på den nye arkitektur.

Mange x86 programmer er lavet til ældre processorer, med langt lavere klokfrekvens end nutidens, og de kører derfor fint på en simulator med ligeså stor hastighed, som de havde på de processorer, de var designet til.

Det er muligt at designet processorer, som er meget egnet for simulering baseret på compiler teknologi. Altså, hvor at maskinkoden krydskompileres i softwaren. Så snart at man kommer ud i kode, der ikke er krydskompileret, så vil MMUen generere et interrupt til compileren, så der oversættes den nye kode. Processorer designet med den type teknologi, kører med optimal hastighed - og nogle gange bedre - end de oprindelige processorer, fordi der ved compileringen af gammelt indstruktionssæt til nyt laves optimeringer på kode. Det er specielt, hvis koden der køres er af lidt ældre dato, skrevet på gamle compilere, med dårligere teknologi end i dag, at der opnås fordele. Koden kompileres over til en cache med den nye CPU's indstruktionssæt, og der holdes styr på det, så det som allerede er oversat, ikke oversættes igen. Oversætteren oversætter et lille bid af gangen, som den kan overskue. Hoppes ud i indsruktioner, der er udenfor det oversatte område, så kalder MMU'en oversætteren, og der oversættes nyt kode. Til sidst, er hele programmet oversat. Er operativsystemet udviklet til det, så kan den gemme cachen fra sidst programmet kørte, så det ikke oversættes på ny ved ny udførsel af programmet. Det tager dog ikke meget lang tid at oversætte.

X86 behøver således ikke at være et problem, men jeg mener ikke at ARM processorerne som standard er designet til at være gode til det. Det betyder, at man reelt er ligeså fastlåst som på X86 strukturen. Vælges derimod en processor type der kører optimalt med kryds kompiileringsteknologi, er man helt uafhængigt af CPU'ens indstruktionssæt, og kan køre alle CPU'ers kode i optimal tid. Man kan også vælge sin helt egen processorkode til operativsystemet og programmerne. Det muliggør, at der kan vælges mere kompakte indstruktioner, og det er muligt at udføre CISC indstruktioner, selvom processoren er RISC type. Hvilken CPU man vælger, og dens indstruktionssæt, betyder intet. Er processoren lavet til det, så udføres indstruktionerne ligeså hurtigt, som hvis koden er direkte skrevet til CPU'en, og det gør at designerne af operativsystemet, ikke behøver at designe det til at fungere med CPU'ens kode, men de kan have deres egen CPU kode, eller køre f.eks. X86 kode, ARM kode, motorola kode, eller anden kode med samme hastighed, som det vil kunne køre på CPU'en.

4
11. juni 2020 kl. 23:06

Selvom Windows findes til ARM, så vil skiftet af processor også åbne for spørgsmålet om OS også skal skiftes. x86 programmer kan jo alligevel ikke afvikles på den nye arkitektur.

Det gennemprøvede valg til ARM hedder derfor Linux. Raspberry Pi er ARM baseret og langt det meste Desktop software til x86 kan også hentes til Raspberry Pi.

Så hvis en producent vælger at lave en billig ARM baseret PC, hvorfor så ikke tage skridtet fuldt ud og gå rent Open Source.

3
11. juni 2020 kl. 22:35

Hvis man ved lidt om talsystemer og boolsk logik, men ikke ved ret meget om hvordan CPU'er fungerer, kan jeg anbefale det her ingeniørspil, hvor man starter kun med NAND gates, og så laver mere og mere avancerede byggeklodser, for til sidst at have en simpel CPU</p>
<p><a href="https://nandgame.com/">https://nandgame.com/</a&gt;

Fint spil - men fidusen med computere frem for gates og FPGA'er, ligger mest i brugen af hukommelsesstrukturer. Disse kan naturligvis også laves med gates, men det er ikke lige sådan at det gøres... Idéen med en processor, er at genbruge komponenter, så den samme adder bruges millioner af gange, specificeret med få bits i en rom eller ram, så at adderen dermed intet fylder i chip areal. Der er egentligt ingen, der siger hvilke komponenter en CPU skal indeholde, så den behøver ikke at indeholde en adder - man kan nøjes med en nand gate om man vil. Processorer holder pladsen nede, hvis de anvendes f.eks. på en FPGA. Genneralt kan man bruge det på alt digitalt elektronik, at man analyserer de komplicerede komponenter, og genbruger dem efter en opskrift der står i en rom. Så motivet bag en processor, ligger i virkeligheden i at pakke komponenterne så de fylder så lidt areal som muligt. I dag går man så den omvendte vej, fordi vi har så meget chip areal, at man folder koden ud, og omdanner en lille blok af koden til hardware med flere ALU'er. Derved udføres flere linjer parallelt. Den oprindelige årsag til CPU'er var dog at der ikke var plads til at løse komplicerede opgaver på andre måder, end ved at genbruge komponenterne. Beskrives problemet i en rom eller ram, fylder det næsten intet. En enkelt byte i ram, fylder kun en brøkdel af en enkelt bit realiseret som en latch eller flipflop. Og en tæller i ram fylder stort set intet, mens den fylder et enormt areal, hvis den skal realiseres i rent logik.

Min matematiklærer i folkeskolen kom med et godt eksempel: En studerende var sat til at lave en lommeregner, og begyndte at lave diagrammet ciffer for ciffer. Hurtigt kom han til, at der ikke var plads nok. Det var simpelt hen beviseligt, at lommeregnere ikke kunne lade sig gøre... En chip kunne dengang ikke indeholde transistorer nok i 70'erne. Så kom en erfaren ingeniør og foreslog at den samme logik blev genbrugt og skrevet i kode. Dette eksempel viser fint, hvordan man kan opnå store besparelser i hardware ved at anvende en struktur styret af en rom eller ram. Hastigheden bliver dog mindre.

Når man laver FPGA'er gør man det samme. Ofte indeholder VHDL koden masser af små CPU'er, der kan være skrædersyet til bestemte opgaver. Derved genbruges komponenterne mest muligt. Alle opgaver, der ikke skal køre med største hastighed lægges i programmerbare strukturer, typisk CPU'er, hvor der laves decideret hardware til opgaverne, eller styres af små sekvens maskiner eller mikroprogrammerede maskiner, til helt små opgaver. Kun det, som skal køre med største hastighed laves som reelt hardware. Det er ikke ualmindeligt, at selv tællere programmeres ind i en CPU, og kun de øverste bits er i hardware. Dette fylder mindre og muliggør pladsen kan bruges fornuftigt. I dag indeholder de fleste FPGA'er derudover en større CPU, der kan bruges til tungere opgaver - men til mange mindre opgaver, er små CPU'er sagen, og der kan nemt programmeres flere hundrede soft-CPU'er i en moderne FPGA, der hver kører med flere hundrede megahertz. En soft CPU er en CPU der er programmeret i VHDL og ikke anvender den indbyggede ARM cpu - men ARM CPU'en kontrolerer normalt de forskellige CPU'er og er i stand til at kunne debugge dem.

2
11. juni 2020 kl. 19:55

Hvordan kan det være en revolution? Der findes allerede arm baserede Windows 10 enheder,?

1
11. juni 2020 kl. 19:47

Hvis man ved lidt om talsystemer og boolsk logik, men ikke ved ret meget om hvordan CPU'er fungerer, kan jeg anbefale det her ingeniørspil, hvor man starter kun med NAND gates, og så laver mere og mere avancerede byggeklodser, for til sidst at have en simpel CPU

https://nandgame.com/