Vlákno názorů k článku 64bitové mikroprocesory s architekturou AArch64 od klokan - Princip, kde se u 32-bitových instrukcí vynuluje horních...

  • Článek je starý, nové názory již nelze přidávat.
  • 6. 6. 2017 1:46

    klokan

    Princip, kde se u 32-bitových instrukcí vynuluje horních 32bitů registru byl velmi kontroverzní u AMD64 a tak je celkem zajímavé, že to u AArch64 dělají stejně. Zajímalo by mě, jestli tyhle procesory mají nějakou obdobu Kompatibilního režimu u AMD64, tj. možnosti spustit 32bitový userland process and 64bitovém jádře.

    K tomu Archimedovi: údaj, že měl přes 4 MIPS je zavádějící. Acorn tohle tehdy náležitě rozmazával v reklamách, ale samozřejmě přitom nezmínil jistý "detail" a sice že ten procesor měl JENOM instrukce, které bylo možné vykonávat v jednom cyklu. Na rozdíl od M68000 u Amigy a ST neměl žádné složitější operace, například dělení a dokonce i násobení se muselo dělat čistě softwarově a výsledné rutiny samozřejmě vyžadovaly pár desítek cyklů. Archimedes byl ve své době úžasný počítač, znatelně rychlejší, než Atari a Amiga, ale ne osmkrát rychlejší, jak tvrdila propaganda.

  • 6. 6. 2017 4:52

    kvr kvr

    Hm, proč bylo nulování horních 32 bitů kontroverzní? IMHO je to docela praktické - speciálně o virtuálních jazyků (JVM) používá běžně 32-bitová aritmetika (nebudu teď polemizovat o výhodách a nevýhodách) a následně se pak výsledek musí použít nějakým způsobem pro adresování. A v té chvíli se nemusí těch 32 bitů explicitně mazat. Opačný případ - že bych chtěl horních 32 bitů použít, když počítám spodních - si těžko dokážů představit. Snad jen load immediate, ale pro ty jsou stejně speciální instrukce a použití aritmetiky tam nedává moc smysl...

  • 6. 6. 2017 12:03

    klokan

    Ta kontroverze nějak souvisela s pointerovou aritmetikou - vývojáři překladačů chtěli moct používat 32 bitové instrukce pro výpočet adres prvků ve vektorech apod. Jinak s tím taky souvisí jedna zajímavá historka. Opkód 0x80, který se na x86 odjakživa používal jako NOP, byla ve skutečnosti opravdická instrukce. Pokud si vzpomínám, bylo to cosi jako MOV al, al bez aktualizace stavového registru. V praxi taková operace nemá žádný efekt a tudíž běžně suplovala jako NOP (který starý x86 jinak neměl). Ovšem u AMD nastal problém, že vzhledem k ostatním volbám návrhu (32 bitové instrukce se mají chovat stejně + nulování horních bitů) tenhle nevinný opkód najednou znamenal vynulovat čtyři horní oktety v rax! Takže už žádný NOP ale normální pořádná instrukce. U AMD proto předefinovali instrukční sadu tak, aby 0x80 znamenalo skutečný pravý NOP a stará nesmyslná operace s al se tak ztratila. Zkrátka, v zájmu zachování zpětné kompatibility AMD muselo změnit operaci, která nedělá nic, tak, aby nadále pořád nedělala nic, ovšem jiným a zpětně nekompatibilním způsobem :))

  • 6. 6. 2017 12:14

    mhi (neregistrovaný)

    NOP pokud vim byl vzdy 0x90 (ne 0x80), coz vede na myslim xchg al,al nebo ax,ax nebo eax,eax.

    Tech NOP-like instrukci v x86 je vicero, moderni prekladace vkladaji jako align jine sekvence, aby to procesor prechroustal rychleji.

  • 6. 6. 2017 9:00

    Pavel Tišnovský
    Zlatý podporovatel

    Zdravím a trošku dodám k tomu MIPS: ta jednotka je takto definována, někdy má smysl to porovnávat, někdy je to samozřejmě hodně nefér (například nějaký primitivní RISC-I versus například IBM procesory s mikroprogramem pro vyšší jazyky). I tady je to porovnání RISC versus CISC, takže na jednu stranu je pravda, že to není fér, na stranu druhou to programátoři mohou vidět přesně naopak - kde má M68k prefixy s podmínkami (na dobu vzniku geniální věc)? Kde má obdobu LDM/STM, která je skutečně používaná překladači pro zásobníkové rámce. Když dojde na mul/div,je to samozřejmě jinak, to potom řešily další ARM jádra :-)

  • 6. 6. 2017 11:37

    klokan

    Rozhodně nechci ARM nijak shazovat, opravdu měl řadu na svou dobu zajímavých inovací a navíc Archimedes byl tuším jeden z vůbec prvních mikropočítačů s 32bitovou sběrnicí. I tak si ale myslím, že jablka se musí porovnávat s jablky. Uvažovat v MIPS má smysl všude tam, kde jde o tok instrukcí jako takových: při návrhu prediktorů, cache, sběrnice atd... Z programátorského hlediska je ale IMHO důležité jedině to, jak rychle dokáže procesor provést daný výpočet. Příklad budiž skalární součin čili násobení s akumulátorem (když už tu byla řeč o 3D hrách). Torzo takové smyčky bude - zjednodušeně - MOV-MOV-MUL-SHR-ADD. Dejme tomu, že pracujeme ve fixní čárce a s 16bitovými hodnotami, což bylo typické. Na M68 trvalo načtení 16 bitové hodnoty, s post-inkrementací ukazatele, 4 cykly. 16 bitové ADD byly (pokud se nepletu) taky 4 cykly. MUL bylo monstrum, trvalo tuším nějakých cca 50 cyklů (!). Shift o 16 bitů se dělal instrukcí SWAP, která sice trvala 26 cyklů ale kupodivu to bylo pořád rychlejší, než obecné instrukce shift. Celkem to dává 88 cyklů při taktu 8 MHz (na Atari ST. Amiga běžela na 7 MHz). Na ARM trval load z RAM (předpokládám) 1 cyklus, shift a součet taky po jednom, MUL nebylo vůbec a muselo se dělat ručně. Buďme benevolentní a předpokládejme, že máme nějakou supr dupr rutinu, která to zvládne za 30 cyklů (u 16 bitových operand). Takže celkem 34 cyklů při 4 MHz. Suma sumárum, pokud mám ty čísla správně, tak to Archimedes teda zvládl o nějakých 13% rychleji, než nejrychlejší stroj s M68K. To není málo, ale je to přece jenom úplně jiná realita, než co se tehdy snažil vsugerovat marketing o 4 MIPS versus 0.5 MIPS.

  • 6. 6. 2017 12:29

    JirSoft (neregistrovaný)

    Dnes už si to nepamatuji zcela přesně, měl jsem A4000 a dost pro něj programoval v asm (nebo kombinaci BASIC+asm), ale s tím jedním cyklem to není pravda (alespoň pro ARM250). Většina instrukcí 1 cyklus, pár 2 taktových (v nějakých kombinacích) a nejdelší paměťové (LD, ST) 4 cyklové. Ale knížku jsem prodal s počítačem, takže nemám, kam se podívat. Naopak shifty se dělaly v barell shifteru jako součást jakékoliv instrukce, takže i násobení se dalo napsat velmi rychle - trošku "roztahat" smyčku, použít posun a podmínku jako součást instrukce sčítání...

  • 6. 6. 2017 13:16

    Pavel Tišnovský
    Zlatý podporovatel

    Ale jo já to beru, na druhou stranu ten výběr násobení je taky dost nefér (když první ARMy naschvál násobičku neměly), protože zase tak pomalé to na ARMech není a zadruhé to nemusí být úplně častá operace (desktop, GUI programy, textové editory, databáze, překladače... doplňte si sami další). Naopak rychlé 32bitové transfery jsou skutečně násobně rychlejší a projeví se (pozitivně) prakticky všude.

    [fyi - za domácí úkol si dávám projít si objkód Dooma a zjistit, kolik má v interní smyčce MULů, fakt to nevím a možná budeme překvapeni]

  • 8. 6. 2017 17:38

    zimiston (neregistrovaný)

    První Archimedy běžely na 8 MHz, takový ty další (co vypadali jako Amiga 500 - vše v klávesnici), např. na obr. 3 už běžely na 12 MHz. Už si nepamatuju, musím se doma podívat do knížky, ale myslím, že už ty první měli Arm v2 a ten MUL měl ne? DIV sice ne, ale MUL jo. Arm v1 byl v podstatě prototyp a maximálně se dával do BBC Micro jako second processor card.
    A pravdu má kolega nade mnou, některý instrukce měly 2 takty. S těma 4 nevím... mrknu se.

  • 6. 6. 2017 9:50

    atarist (neregistrovaný)

    IMHO neni AMD64 tak cista architektura jako AArch64, kde se nebali a zahodili prakticky vsechno stare smeti. Jinak u AMD64 me vadi konvence volani funkci, to musel vymyslet nejakej teoretik od stolu (zarovnavani atd.).

  • 6. 6. 2017 11:02

    deda.jabko (neregistrovaný)

    Volaci konvence na AMD64 neni dvakrat krasa, ale zrovna to zarovnani ma prakticke opodstatneni. Jelikoz mas zarucene, ze zasobnik je zarovnan na 16B, neni problem tam rychle odsunout XMM-registry na zasobnik.

    Mnohem vetsi sranda je AArch32, krome toho, ze je zhruba tak alegantni jako AMD64, tak je tam treba perla, ze pokud se jedna o volani bezne funkce, jsou argumenty s plovouci radovou carkou predavany pres FP registry, ale pokud se jedna o variadickou funkci, jsou argumenty s plovouci radovou carkou predavany pres GP registry.