Portál AbcLinuxu, 18. července 2025 11:42
Jelikož si s architekturou počítačů pohrávám už nějakých těch patnáct let, něco jsem si z toho odnesl.Jóóó? Vždyť jeden chlapík (nevím teď kdo) na živě tvrdí, že procesorům vůbec nerozumíš?
„1) zásobníkově orientované instrukce jsou sice jednoduché, ale je jich pro stejný algoritmus potřeba cca 2x více, než u register-based architektury (viz třeba ten paper co jsem postoval link).“To je možné, ale: - dnešní implementace těch instrukcí v zásobníkových procesorech jsou téměř vždy pětibitové (šest instrukcí na každý 32bitový fetch!), takže kód je pořád kompaktní a většinou i kompaktnější kvůli výhodám, zmíněným dále. - zvýšený throughput to vykompenzuje nebo i naprosto přebije, kvůli výhodám, zmíněným dále.
„2) pokud většina instrukcí implicitně hýbe se stackem, nejde to jednoduše superscalovat (ani hlouběji pipelinovat), protože dekodér dopředu netuší kam bude stack ukazovat, a tedy odkud má načítat argumenty. Tohle u registrů nevadí, store-load konflikty u stejného registru jednoduše překladač proloží něčím jiným.“Tohle je ale irelevantní. Zásobníkové procesory nemají pipeline. V každém taktu provedou jednu instrukci a tím to pro ně hasne. Dekodér naopak naprosto přesně ví, kde zásobník bude – vrchol zásobníku je na vrcholu zásobníku, druhý prvek je těsně pod ním a tak dále. Odpadá tedy latence z dekódování adresy a připojení správného registru k ALU, čímž se sníží hloubka hradlové sítě, kterou se propagují změny signálů v každém cyklu, a tedy se i zvýší taktovací frekvence. (V každé hradlové síti je žádoucí při maximalizaci výkonu omezovat počet průchodů hradly v řadě za sebou v každém taktu, ne?
„Jednoduchost je subjektivní, mě se zase líbí 68K, MIPS a PowerPC. Uveďte prosím libovolný zásobníkový CPU, který je výkonově srovnatelný s běžnými register-based RISCy (tj dělá aspoň 1000-2000 MIPS/Watt).“Uvádím to všude: Pět let staré jádro c18 má při výrobě relativně starou 180nm technologií 120000 MIPS/Watt. Je to osmnáctibitové, tak si to vynásobte třeba 0.6, a protože to je zásobníkové, klidně ještě vydělte dvema nebo třemi, pro mě za mě...
decode-load-execute-store v jednom taktu bez pipeliningu? Jakou magii ty procáky používají, aby to při takhle extrémně dlouhých kritických cestách běhalo na gigahertzech?Jakákoli dostatečně pokročilá technologie je nerozlišitelná od magie...
Navíc honit gigahertzy je u úsporných CPU obecně blbej nápad, protože pokud ekvivalentní gate load potřebujete nabít za poloviční čas, potřebujete dvojnásobný proud, tedy čtyřnásobný výkon. Proto je lepší zvyšovat spíš IPC než takt, a v tom jsou RISCy docela dobré.Tyhle procesory se neznaží maximalizovat ani takt, ani IPC, ale througput dat na počet tranzistorů (jestli to tak můžu vyjádřit) nebo na spotřebu...
co má společného RISC model a inlining?Možná jsem to nevyjádřil přesně.
Google "c18 core" mi dalo pár linků, ale 1) nikde se 120GIPS/W neuvádí 2) není to jen nějaký obskurní Harward s onchip ROM a pár kilobyte SRAM?Harwardský design to jádro, pokud vím, nemá. Přinejmenším některé jeho implementace umožňují spouštět kód přístupný i jako data. Je pravda, že je primárně určeno pro resource-contrained aplikace. Sám autor přeci tvrdí: "Optimized for compute-bound portable applications." Nemyslím si ovšem, že tohle nějak omezuje použitelnost v jiných aplikacích. Třeba při roztažení šířky slova na 32 bitů, přidání větší on-die paměti a paměťového řadiče a externích rozhraní pro vnější paměť a periférie se poměr výkon/spotřeba asi nijak drasticky nezmění, statická paměť pravděpodobně nemá nijak zvlášť vysokou spotřebu oproti multigigahertzovému procesorovému jádru navrženému tak, aby se v něm žádný hradlo neflákalo.
Jednodušší než co? RISCy jsou podle vás složité? PIC nebo AVR máte taky do 20k hradel.Jedna reference viz výše (nebudu ji už opakovat): F21, 500 MHz při 800nm procesu, 100 mW (je to stará výrobní technologie
Co je jednodušší, zkompilovat zásobníkový mezikód pro registr s N registry nebo zrekompilovat registrový mezikód pro M registrů pro procesor s N registry?Lze obojí, ale první je jednodušší. Pro JIT kompilaci je zásobníkový pseudokód vhodnější, je blíž zdrojáku, ale ještě lepší je použít přímo syntax tree. Pro exekuci (ať už interpretem nebo v křemíku) je lepší registrový kód. Horší hustota kódu je víc než vyvážena lepším výkonem.
CPU, videoprocesor pro barevný videovýstup, hodně slušně programovatelná jednotka anologového vstupu/výstupu a docela komplexní jednotka pro síťovou komunikaci. To vše v 15000 tranzistorech, ne hradlech. Ale bohužel se jednalo o "solution without problem", takže se v té době (~1998) nenašla vhodná aplikace. Škoda, pár bych jich zaměstnal...Nojo, jasná konspirace. Některé z těch 13 familií co jak všichni víme vládnou světu se to asi znelíbilo. Radši to nebudu moc řešit, nebo mě zas rozbolí hlava z hrubejch vibrací. PS: Přečetl jsem si toto interview s Chuckem Moore, a vypadá na pěkného omezence. To že má někdy pravdu na tom moc nemění. Zvláštní, doposud jsem na zavilé forth-isty nenarazil, netušil jsem že je ta víra tak tuhá.
Nojo, jasná konspirace. Některé z těch 13 familií co jak všichni víme vládnou světu se to asi znelíbilo. Radši to nebudu moc řešit, nebo mě zas rozbolí hlava z hrubejch vibrací.Srandičky, srandičky, srandičky.
PS: Přečetl jsem si toto interview s Chuckem Moore, a vypadá na pěkného omezence. To že má někdy pravdu na tom moc nemění. Zvláštní, doposud jsem na zavilé forth-isty nenarazil, netušil jsem že je ta víra tak tuhá.Víra? V jeho případě spíš bohotvorství, ne?
Nezbývá mi nic jiného, než reagovat a současného modelu se zastat. Uživatelé mají příliš velké požadavky na podporovaný sortiment HW a výrobci HW se činní v tom, aby množství různých, často obskurních, zařízení s časem exponenciálně rostlo. Rešení je buď prohlásit, že stabilní řada 2.6 bude osahovat podporu pro hardware kompatabilní/vyrobený např. před rokem 2005 (což by způsobilo více křiku než současný model) nebo všechno backportovat a forwardportovat mezi stabilní a vývojovou větví. Forwardportování a snaha podporovat silně se rozcházející větve povede k vzniku ošklivého kódu. Backportování je zase strašné urpení a práce, když se pěkný kód musí mrzačit aby chodil s již zastarávajícími základy subsystémů. Další možnost je zpomalit vývoj základu (kdo by však nechtěl robust-mutex, PI atd) nebo získat mnohem více vývojářů.
Nový model tedy podle mého názoru šetří síly. Širokým testováním zajišťuje, že se ve vývojové větvi nenaakumuluje hromada skrytých chyb a umožňuje distribucím dodávat jádra s určitým odstupem od čela vývoje, která jsou již rozumě stabilizovaná a přitom podporují většinu nového hardware. Přitom rozdíl ve verzích je natolik malý, že ještě lze minimálně bezpečnostní opravy a opravy driverů bez větších problémů backportovat. Bohužel některé vylomeniny v API a věcech jako je UDEV pak uživatelům občas přinesou perné chvilky.
Menší komunity, jako třeba ARM Linux, již opravdu sílami na dvoukolejnou schizofrenii nedisponují.
Pokud distributoři poskytují svoje změny zpět do mainline jádra, tak se nemusí velkých potíží bát. Ti co si vymýšlejí polouzavřené vývojové větve postavené na hromadě úprav a proprietátních konfiguračních utilit, které nedohodnou a nepřipraví pro začlenění do mainline, a prohlašují, že jejich jádro je lepší než všechna ostatní, tak zatáhnou uživatele do slepé větve. Pak jim vše přeroste přes hlavu.
Podívejte se na množství chudáků bojujících s komerčními distribucemi pro ARM a jiné embedded systémy založenými na jádře 2.4.18 či 2.4.20. Výsledek je katastrofa. Řada 2.6.x naopak chodí spolehlivě. S minimem patchů si s ní hraji na mašem HW od verze 2.6.8 a lokální patchstack se mi s časem zmenšuje, protože jediné místo, kde lze rozumně patche spravovat je mainline strom.
Je ovšem pravda, že začlenení kódu je proces často extrémě nákladný na trpělivost a schopnost komunikovat. V žádném případě Hansovi nezávidím. Na druhou stranu většinou proces eliminuje zmetky.
Podla mailinglistu Slack by nefungoval lebo má udev 071, ale -current má už pár dní 097 (a 96 tam bola o trochu dlhšie). Takže Slack fungovať bude. (odhliadnuc od toho, že udev vôbec nemusíte použiť)
ale opravdu by melo byt vice distribuovano primo s jadremSouhlas. IMHO cokoli co vyžaduje jádro by mělo být dodáváno s ním, ve zdrojovém kódu.
Koncep UDEVu plně chápu a pro desktopy má význam. Bohužel je trošku nepříjemné, když se vám po hodinách portování, pokusů a omylů podaří spustit jádro na právě navržené desce s řádkou init=/bin/sh a zjistíte, že se bez hromady skriptů a nebo překynutého statického /dev nedostanete na readonly filesystemu ani k sériáku, který má zrovna major:minor 204:41. No nic situace se lepší, nějaká podpora je již alespoň v BusyBoxu a všechna zařízení snad již reportují major:minor přes /sys.
Když se ovšem podívám na následující vrchol programátorské hamby (např. v linux/drivers/usb/core/usb.c usb_find_interface()) který se od verze v 2.6.11 v LXR změnil do dnešního 2.6.18-rc4 pouze o přidání dalšího overheadu v lockování, tak mě to nadšení z UDEVu přechází. Přitom každý subsystém si to musí řešit zvlášť a většinou to končí na staticky předalokovaných polích minorů. Přitom pod DevFS to chodilo s jednou referencí přes ukazatel. Chápu, že jsou s ní potíže s lockováním a cyklickými referencecounty, ale slušný návrh takové věci, jako je O(N) hledání, neobsahuje. Na doporučení, že to mám reportovat jinde, dopředu uvádím, že jsem si na to KHG stěžoval již v okamžiku, kdy se prohlásil za pána nad /dev a vítězoslavně obdržel souhlas s postupným zlikvidováním DevFS, které již předtím zbavil všeho, co ho dělalo zajímavým. Statických tabulek indexovaných minory se tedy ve svých driverech nezbavím
PS: neví někdo, jestli je někde LXR pro aktuální jádra?
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.