linux user group brescia

immagine del castello

Archivio della mailing list

VERO bitmap

Bauno bauno a inwind.it
Mar 13 Maggio 2003 00:28:23 UTC
On Monday 12 May 2003 12:03, Vernia Damiano wrote:
> > Per gli intel compatibili 32 bit e' sempre 32 bit.
>
> 	Scusa, ma un PII e' compatibile anche con un 8086 che di bit ne ha
> 16. Secondo questo ragionamento un [ipotetico] intel a 64 bit compatibile
> con uno a 32 girerebbe a 32 bit e basta anche con i long. (Una volta gli
> int non erano a 16 bit?)

Hmm...qui si fa un po' di confusione...

1) La dimensione degli int la decide il compilatore, tenendo presente che
lo standard impone soltanto che:

sizeof(char) <= sizeof(int) <= sizeof(long)

Alcuni compilatori DOS (non tutti, attenzione) usavano int a
16 bit, altri (il gcc, x esempio) usavano int a 32 bit anche sotto DOS.

2) Un Intel a 64 bit (ossia con registri a 64 bit) su cui si potesse
fare girare codice compilato x Intel a 32 bit "girerebbe a 32 bit e
basta anche con i long". Questo x' il codice asm generato dal "vecchio"
compilatore caricherebbe nei registri 32 bit alla volta [1]. E`
possibile che il processore in questione (quello a 64 bit) ottimizzi
opportunamente il flow delle istruzioni in modo, ad esempio, da caricare
4 variabili da 32 bit in due registri, ma questi sono discorsi di
ottimizzazione "spinta" che non è possibile fare a priori.

[1]: il codice macchina generato da un compilatore carica esplicitamente
le variabili nei registri, ovviamente. E se le variabili sono a 16 o a
32 bit, il resto del registro a 64 bit rimane inutilizzato.
 
> 	Non mi servono numeri, mi servono stringhe di bit. Se le librerie,
> il compilatore, il processore e _la_memoria_ puo' gestire direttamente
> numeri a 64 o 128 bit (larghezza del bus!) riduco proporzionalmente anche
> tutte le operazioni che devo fare.

I registri degli x86 (dal 386 in poi, athlon compreso) sono a 32 bit.
Saprai senz'altro (almeno, lo spero! :) che, prima di eseguire una
qualunque operazione, devi caricare gli operandi nei registri. Ne
consegue che puoi operare al massimo su 32 bit x volta. Se usi variabili
a 64 bit, queste vengono caricate e manipolate un pezzo alla volta.
L'incremento prestazionale è nullo.

Un'eccezione in realtà c'è, puoi usare il coprocessore matematico che ha
registri + lunghi (128 bit, se non mi ricordo male) x fare operazioni su
interi, xò tieni presente che:
1) Caricare gli operandi nei registri della FPU è dispendioso in termini
di cicli di CPU.
2) Devi forzare la cosa in assembly.

Non sono peraltro aggiornato sulle prestazioni della FPU sulle
operazioni "tra interi", non giurerei sulla velocità...

> Mi e' stato fatto notare che non dovrebbero esserci
> differenze di tempo di esecuzione, ma SE il bus processore-memoria e'
> piu' ampio si dovrebbe poter migliorare.

Hai una coda di prefetch, hai una L1 cache, non credo che un artificio  del
genere ti faccia migliorare, ammesso (e non concesso) che i dati vengano
efettivamente "prelevati" in modo diverso (cosa di cui non sono affatto
certo, anzi sono quasi certo del contrario, ma bisognerebbe vedere il
codice assembly generato).


-- 
Bauno - Eurydices, oro, properata retexite fata!
"Build a fire for a man, and he'll be warm for a day.
Set a man on fire, and he'll be warm for the rest of his life." (T. 
Pratchett)





Maggiori informazioni sulla lista Lug