Microsoft Windows XP 64 bit: ormai manca poco!

Microsoft Windows XP 64 bit: ormai manca poco!

Negli ultimi giorni vari rumors segnalano come data di rilascio per il nuovo windows a 64bit, il 29 Aprile. Per ingannare l'attesa Microsoft ha distribuito una versione trial che, stando a vari commenti raccolti in rete, appare abbastanza matura e non ha creato particolari problemi nel riconoscimento

di pubblicata il , alle 17:23 nel canale Programmi
MicrosoftWindows
 
211 Commenti
Gli autori dei commenti, e non la redazione, sono responsabili dei contenuti da loro inseriti - info
cdimauro03 Febbraio 2005, 08:42 #181
Originariamente inviato da Banus
Proprio sulla possibilità del punto 2) e 3) si basava il discorso di fek

Esatto. Comunque hai azzeccato proprio tutto...
I punti 1), 2) e 3) garantiscono che la somma dei tempi di esecuzione delle singole istruzioni corrisponde al tempo di esecuzione della routine.

Esatto. Anche considerando il caso migliore per il codice a 32 bit (tutte le istruzioni e i dati che sono perfettamente allineate alla dimensione della linea di cache) e quello peggiore per il codice a 64 bit (istruzioni disallineate e letture/scritture dei valori a 64 bit disallineati), calcolatrice alla mano, non si scappa.
Incidenza degli accessi in memoria:i punti 2), 3) garantiscono che i dati si trovano in cache.

Perfettamente.
Il 2) "obbliga" la pagina dello stack in cui verranno scritti tutti gli argomenti a trovarsi in memoria.
Il 3) è un vincolo più rilassato, perché una volta che il codice è sta nella cache e la pagina dei dati (stack) è caricata, il processore non potrà mai generare un'eccezione dovuta a un page fault.
Assunzione (sicuramente verificata nell'Athlon64): due accessi a 32 bit sono più lenti di un singolo accesso a 64 bit, dalla cache.

Esatto. Anche nel caso peggiore per l'Athlon64.
Resta solo da valutare, calcolatrice alla mano , l'incidenza del salvataggio dei registri (a 64 bit sono in numero maggiore e più grandi).

Infatti. Questo era il vincolo rimasto per l'altro esempio.
Non è una dimostrazione formale ma una traccia di come affronterei il problema

Per la "formalità" basta conteggiare il numero di cicli di clock considerando il caso migliore per il codice a 32 bit e quello peggiore per quello a 64 bit, e il gioco è fatto...

Complimenti!

x repne scasb: come vedi, per come sono poste le condizioni, eccezioni di fatto non ce ne possono essere. Il codice verrà sempre eseguito senza alcuna interruzione.
cdimauro03 Febbraio 2005, 09:07 #182
Originariamente inviato da fek
E' questo il mio punto, e non si tratta di parlare lingue diverse, ma di sapere di che cosa si sta parlando oppure no, oppure di essere in malafede

Si può anche essere in buona fede, ma avere dimenticato un dettaglio, anche se importante.
Puoi riuscire a dimostrare che quel particolare pezzo di codice a 64 bit e' sempre piu' veloce a livello teorico, ma poi lo metti in condizioni reali, ne misuri le prestazioni e ti accorgi che nella realta' pratica difficilmente riuscirai a notare differenze prestazionali.

Il problema, come ti dicevo anche nel mio messaggio precedente, è quello di stabile le condizioni reali: se non lo si fa, anche il codice di repne scasb risulta validissimo.
Proprio per questo motivo ho buttato la pietra della "dimostrazione formale".
E' ovvio, che se qualcuno e' in malafede, puo' semplicemente buttare il codice in un inner loop e cercare di dimostrare anche che gli asini volano, ma il mio discorso e' sempre stato il seguente:
in condizioni di esecuzione normale, e' difficile che si possano apprezzare differenze perche' di solito quel codice e' memory bound.

D'accordo, ma vedi messaggio precedente (che t'ho scritto): mancavano le condizioni relative alla definizione di "normalità".
In altre parole, se l'ambiente in cui quelle istruzioni sono eseguite contiene molte altre istruzioni e molti altri accessi ai dati, e' molto probabile che i dati per quelle istruzioni non saranno in cache e la CPU si trovera' ad attendere l'arrivo dei dati su cui operare per la maggior parte del suo tempo, rendendo del tutto vano il risparmo di istruzioni. Questa e' la situazione tipica, un inner loop non e' la situazione tipica.

D'accordo, ma permettimi di farti le seguenti osservazioni:

1) la logica di prefetch per quanto riguarda il caricamento del codice nell'apposita sezione della cache L1 "normalmente" fa un ottimo lavoro: i cache miss dovuti all'esecuzione di codice non presente nella cache DI NORMA sono dovuti a salti condizionati di cui si è sbagliata la predizione; questo rispecchia il punto "1" della mia dimostrazione;

2) i dati di cui si parla negli esempi trattati sono gli argomenti "pushati" (che brutto termine); il tuo discorso lo si può applicare quando il processore deve andare a "pescare" dalla memoria quei dati, ma certamente non lo puoi applicare quando poi te li ritrovi nello stack: per sua stessa natura lo stack conserva dei dati "recenti", le pagine dello stack fanno parte normalmente del working set (se non fosse così il decadimento prestazionale dovuto alla chiamata di una funzione, specie con diversi argomenti, sarebbe notevole), e che normalmente il processore si ritrova nella cache L1.
Questo mi sembra proprio il caso nostro: quando il processore ha eseguito il push, ha posto i dati/argomenti nella cache L1 (per poi essere scritti nella cache L2 e quindi in memoria, ma di questo se ne occupa la sezione di load/store) e di conseguenza quando nella funzione si torna a leggerli, sono già lì, a portata di mano; questo rispecchia il punto "3" della mia dimostrazione;

3) se, come dici, "di solito" quel codice è "memory bound", mi sembra razionale supporre che lo sia tanto per quello a 32 bit quanto per quello a 64 bit.
Spero di essere stato piu' chiaro ora, e a chi pensa di parlare una lingua diversa dalla mia, consiglio di imparare prima l'italiano

Fermo restando che è chiaro, come hai detto, che i benefici derivanti dal fatto che quel codice a 64 bit verrà eseguito, sì, eseguito in meno tempo, ma che in mezzo a un codice (e non un inner loop) non farebbe la differenza (il profiling non lo so si fa certo per velocizzare l'esecuzione di una routine "isolata" e "poco usata", spero che le argomentazioni che ho portato qui sopra servano a "distendere" un po' la discussione...
cdimauro03 Febbraio 2005, 09:16 #183
x ripsk Non hai sparato delle "fregnacce": sono delle giuste considerazioni.

Però c'è da dire che il codice generato per lo stesso programma, ma per architetture diverse, tende ad avere lo stesso "comportamento", tanto più quanto le architetture "si assomigliano".
E' difficile, quindi, pensare che la routine a 32 bit esegua la metà di accessi in lettura di quella a 64 bit. Può benissimo succedere, per carità, e il motivo (per quanto riguarda il confronto x86 VS x86-64) è già stato detto: i puntatori occupano il doppio di spazio.

Ma dai risultati che abbiamo potuto vedere si assiste, a mio avviso, a un quadro abbastanza chiaro: mediamente lo stesso programma compilato ed eseguito per x86-64 offre un miglioramento delle prestazioni. Questo anche se non fa uso di dati interi a 64 bit (POV-Ray, nuovamente): i benefici derivano dalla nuova architettura.
repne scasb03 Febbraio 2005, 09:20 #184
cionci03 Febbraio 2005, 10:13 #185
Consiglio un po' più di calma
cdimauro03 Febbraio 2005, 10:38 #186
Quoto: non lasciamo degenerare un thread bello come questo.

x repne scasb: neppure io sono madrelingua italiano.
Banus03 Febbraio 2005, 11:22 #187
Originariamente inviato da cdimauro
Esatto.

Per fortuna... Temevo di aver frainteso il significato di "interruzione"

Originariamente inviato da cdimauro
neppure io sono madrelingua italiano.

Questo è il thread delle rivelazioni
fek03 Febbraio 2005, 12:51 #188
Originariamente inviato da repne scasb
E' un chiaro riferimento alla mia persona. Tengo a precisare, che non sono di madrelingua italiana, e accetto il consiglio. La vostra lingua ha delle "sfumature" che alcune volte mi sfuggono.


Non faccio fatica a crederti.
fek03 Febbraio 2005, 12:59 #189
Originariamente inviato da cdimauro
Si può anche essere in buona fede, ma avere dimenticato un dettaglio, anche se importante.


Un dettaglio tipo eseguire il profiling di un inner loop?

Il problema, come ti dicevo anche nel mio messaggio precedente, è quello di stabile le condizioni reali: se non lo si fa, anche il codice di repne scasb risulta validissimo.
Proprio per questo motivo ho buttato la pietra della "dimostrazione formale".


Quel codice non e' validissimo, perche' come avevo ripetuto una decina di volte era eseguito in una condizione ideale e irreale (l'inner loop) che era gia' stata indicata da me come il caso perfetto in cui il codice a 64 bit risulta nettamente piu' veloce. Sostanzialmente ha dimostrato l'ovvio su un caso particolare per poi cercare di estenderlo per induzione a tutti i casi. Un tentativo un po' goffo.

D'accordo, ma permettimi di farti le seguenti osservazioni:

1) [...]

2) [...]

3) se, come dici, "di solito" quel codice è "memory bound", mi sembra razionale supporre che lo sia tanto per quello a 32 bit quanto per quello a 64 bit.


1) assolutamente si'

2) i dati sono anche i due operandi, non per altro nella versione C li ho passati di proposito come puntatori a interi lunghi, per risaltare il fatto che quei dati provenivano dalla memoria, potenzialmente in due pagine totalmente separate, e ancora potenzialmente non in cache

3) assolutamente si', infatti la mia conclusione voleva essere che i due pezzi di codice di solito saranno probabilmente (e non sicuramente) prestazionalmente equivalenti perche' di solito si troveranno in ambienti memory bound dove il collo di bottiglia e' l'accesso alla memoria e non il numero di istruzioni eseguite

spero che le argomentazioni che ho portato qui sopra servano a "distendere" un po' la discussione...


Tu aiuti sicuramente a distendere la discussione
Ma la discussione non si sarebbe neppure scaldata se la nostra amica ammettesse ogni tanto qualche suo errore, soprattutto quando sono cosi' goffi, invece di limitarsi ad arrampicarsi sugli specchi e insultare l'interlocutore che glieli fa notare.
gabido03 Febbraio 2005, 13:44 #190

non si può neanche scherzare?

X Helstar:
scusa se ho fatto scendere il livello della discussione con le mie buffonate....
non mi pare di aver offeso nessuno con il mio scherzoso commento (al contrario di te), e del resto non sei costretto a partecipare a questa discussione se non la reputi alla tua altezza.

Devi effettuare il login per poter commentare
Se non sei ancora registrato, puoi farlo attraverso questo form.
Se sei già registrato e loggato nel sito, puoi inserire il tuo commento.
Si tenga presente quanto letto nel regolamento, nel rispetto del "quieto vivere".

La discussione è consultabile anche qui, sul forum.
 
^