Portál AbcLinuxu, 26. dubna 2024 15:34
Zjevně ano. Ale o tom, zda je skutečně vhodnější, jeden účelově vybraný benchmark vypovídá pramálo. To bych na druhou stranu mohl argumentovat tímhle:
sign verify sign/s verify/s rsa 512 bits 0.000506s 0.000040s 1977.1 25163.1 rsa 1024 bits 0.002250s 0.000107s 444.5 9318.9 rsa 2048 bits 0.012400s 0.000343s 80.6 2915.8 rsa 4096 bits 0.079840s 0.001175s 12.5 850.8 sign verify sign/s verify/s rsa 512 bits 0.000262s 0.000018s 3822.1 54325.7 rsa 1024 bits 0.000856s 0.000044s 1168.9 22574.3 rsa 2048 bits 0.004398s 0.000125s 227.4 7988.9 rsa 4096 bits 0.026530s 0.000392s 37.7 2550.0
jenže to by byl asi tak stejný nesmysl jako ten jejich "test"…
K vašemu tvrzení vás mohlo snad vést to, že aritmetika s 64bitovými celými čísly trvá déle než s 32bitovými.
Určitě to platí i na 64-bitovém procesoru?
tradiční_způsob
, VelbloudíZápis
je spíš doména C++-istů (já ovšem preferuji klasiku i v C++). Ale když pořád lepší než javoidní velbloudBezHlavy
…
Similarly, Microsoft began using "x64" as a vendor-neutral way to refer to products that support both AMD64 and EM64T. Other companies, such as Sun Microsystems, have also adopted this convention.
IMUL reg16/32/64, mreg16/32/64
latenci 3/3/4 takty. Dále tam stojí: „The processor is capable of performing a 64-bit addition each clock cycle and a 64-bit multiplication every other clock cycle.“ Předpokládám (== hádám ), že to je kvůli paralelizaci.
Ubuntu? Linuxová distribuce, ovšem divím se, že zrovna velký pan archista gentooista to neví.
Na druhou stranu při ukládání registrů na zásobník se více nadře.Proč? Uložení 32b registru pomocí 32b sběrnice a 64b pomocí 64 bitové by mělo být úplně stejně rychlé.
gcc
rozhodne že se něco vyplatí držet v registru, tak ten load/store samozřejmě předem amortizuje. Problém je spíš v tom, že u amd64 děsně bobtnaji
sizeof(struct foo)
, limitně až na dvojnásobek- takže věci jako linked listy, hashe, bstromy apod fakticky sníží velikost cache o 30-40%... Indexování integerama místo pointerů asi pomáhá, ale málokdo to používá.
Binární konvence pro volání funkce je úplně jiná pro amd64 a i386. U i386 se parametry funkce se předávají na zásobníku. U amd64 se prvních 5 předává přímo v na to vyhražených registrech. Takže se ušetří spousta kopírování mezi pamětí a registry.
Jinak díky binárním konvencím téměř nedochází k tomu, že by se registry ukládaly zbytečně. Některé má volaná funkce právo přepsat - volající funce si pak zazálohuje jen ty, které skutečně potřebuje. Některé registry musí volaná funkce vrátit v původním stavu - opět ale zálohuje jen ty, se kterými pracuje. Takže pro daný algoritmus 64 bitový kod ukládá mnohem méně registrů do paměti.
Samozřejmě existuje řada svičů kompilátoru, které ovlivnují výsledný kod. Někdy se i na amd64 předávájí parametry přes zásobník - lépe se pak analyzují core dumpy - třeba v (Open)Solarisu. Možná že distribuce XY zrovna používá takové defaultní nastavení gcc - koho dnes zajímá nějaká rychlost ve srovnáné se snadnou debugovatelností ... V každém případě je více registrů výhoda, přinejhorším to vyjde nastejno.
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.