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
midian31 Gennaio 2005, 13:24 #101
percio adesso chi ha un sistema a 64 bit usa ancora windows xp 32 bit???
repne scasb31 Gennaio 2005, 13:27 #102
repne scasb31 Gennaio 2005, 13:31 #103
fek31 Gennaio 2005, 13:46 #104
Originariamente inviato da repne scasb
[CODE]
[...]
[/CODE]



Nel tuo codice hai omesso tutta una serie di istruzioni di ripristino dei registri che presuppongono accessi alla memoria (lo stack), istruzioni che io ho inserito.

Voglio credere che questa sia solo una ingenua dimenticanza, perche' quando inserisci anche quelle istruzioni nel codice dimostri quello che ho detto: una serie di istruzioni matematiche, immerse in una serie di accessi alla memoria che rendono le istruzioni risparmiate nel codice a 64 bit sostanzialmente gratuite.

Non hai correttamente letto la mia risposta, o non hai letto la mia risposta in modo intregrale.

Non e' il risultato del compilatore, in quanto nel sorgente 'C(++)' c'e' una moltiplicazione che non c'e' nel codice assembly generato dal compilatore. Spero di aver chiarito.


Non hai letto correttamente o in maniera integrale la mia risposta alla tua risposta: ho fatto copy&paste del codice prodotto dal compilatore (a meno di una chiamata al codice di controllo dei buffer overrun che non ci interessa).

Originariamente inviato da repne scasb
Un ultimo appunto, sulle prestazioni dei due codici 32 e 64 bit postati piu' sopra. Non ho spremuto al massimo il codice a 32-bit, comunque il codice a 64-bit e su Athlon64 3500+ e MSI K8N Neo2 Platinum il 278% piu' veloce (RDTSC/1.000.000.00 di iterazioni).


Voglio credere anche qui che hai dimenticato in buona fede di riportare le condizioni del tuo profiling, che sono il nodo centrale del discorso.
Come hai preso questi tempi?
Hai inserito la chiamata a funzione "in mezzo a del codice" oppure l'hai messa in mezzo ad un loop con solo la chiamata?

Ovvero:

codice;
codice;
codice;
chiamata a funzione;
codice;
codice

Oppure:
loop 1.000.000
chiamata a funzione

Perche' se hai fatto il secondo esperimento, hai dimostrato quello che ho detto fino ad ora: in caso di inner loop molto stretti (con tutto il working set in cache) e' ovvio che la seconda versione e' piu' veloce.

Ma questo non e' un esperimento realistico, e' una condizione limite, mi sembra un errore troppo ingenuo l'aver riportato quei dati in quella maniera con una conclusione cosi' perentoria che... e' falsa.

Ripeti l'esperimento buttando la chiamata a funzione in mezzo a dell'altro codice, in una situazione piu' realistica, e vediamo se noti la stessa differenza.
repne scasb31 Gennaio 2005, 14:05 #105
fek31 Gennaio 2005, 14:06 #106
Questo e' il 319% piu veloce.

Ho utilizzato l'istruzione RDTSC come da me gia riportato. Per documentazione: IA_32 Intel Architecture Software Developer's Manual - Sezione 4-162 Volume 2B.


Ehehe... repn, in quanti cicli di clock viene eseguita da un P4 (scegli tu quale), questa istruzione:

mov eax, [mem]

Minimo e massimo

(ti faccio questa domanda perche' dalla tua ultima risposta mi viene il sospetto che tu non sappia come si faccia il profiling del codice)
repne scasb31 Gennaio 2005, 14:10 #107
repne scasb31 Gennaio 2005, 14:29 #108
fek31 Gennaio 2005, 14:43 #109
Originariamente inviato da repne scasb
Forse e' il caso che precisi il significato "esatto" della mia precedente risposta, in modo da "non" permettere manipolazioni.

In sostanza, il test verte sul confronto 32/64 bit a parita di CPU. Nel caso specifico una CPU AMD Athlon64.

L'uso di istruzioni a 32 bit mov rg,[addr$] su Athlon64 permette (se gli accessi sono allineati ad 8 bytes), di ottenere prestazioni migliori rispetto a mov rg,[rg+off$]. Ne caso specifico, come gia' detto, non ho spremuto il massimo dalla routine a 32-bit, ma dovendo essere utilizzata su un Athlon64, ho preferito il primo tipo di indirizzamento rispetto al secondo. Altrimenti la routine sarebbe stata ancora piu' lenta rispetto alla versione a 64-bit.


Qui nessuno sta manipolando nulla. Oddio qualcuno ci sta provando, ma con scarsi risultati.

Ripeto la mia domanda, che e' assolutamente seria e precisa; quanti cicli di clock minimo e massimo sono necessari per eseguire la seguente istruzione:

mov eax, [mem]

Per quanto riguarda il profiling, consiste nel chiamare l'istruzione RDTSC prima della routine, salvare il contatore di clock, chiamare RDTSC alla fine, sottrarre il contatore di clock, dividere per il numero di iterate, derivarne le prestazioni in scala lineare, ossia:

Routine a 32 bit 1000 cicli di clock medi (esempio)
Routine a 64 bit 500 cicli di clock medi (sempre esempio)

da cui 1000/500=2 la routine a 64 bit e' il doppio piu' veloce. Spero sia tutto chiaro.


Se il profiling fosse solo chiamare RDTS sarebbe un mondo piu' bello e piu' semplice. Purtroppo la realta' e un po' piu' complessa e la seguente affermazione "tale funzione e piu' veloce di tal altra del 318.953235%" e' perfettamente priva di significato nel mondo reale.

Come provare a fregarci con un inner loop per dimostrare che il codice a 64 bit e piu' veloce di quello a 32 bit.
Nice try

Rispondi alla mia domanda per cortesia? Per te che ci fai sempre tale sfoggio, non dovrebbe essere una risposta troppo complicata. Grazie.
fek31 Gennaio 2005, 15:36 #110
Originariamente inviato da fek
Ripeto la mia domanda, che e' assolutamente seria e precisa; quanti cicli di clock minimo e massimo sono necessari per eseguire la seguente istruzione:

mov eax, [mem]


Ok, rispondo io alla domanda.

Quell'istruzione puo' impiegare ad essere eseguita da un minimo di zero cicli, se la cella di memoria e' nella cache di primo livello e la latenza viene coperta da altre istruzioni di accesso alla memoria, ad un massimo di milioni di clicli di clock, se la pagina della quale fa parte e' stata magari paginata su hard disk e quell'accesso causa un page fault, la CPU e' costretta ad una transizione in ring 0, caricare la pagina di memoria dall'hard disk alla memoria centrale, tornare in ring 3 e riprendere l'esecuzione.

In sintesi, le prestazioni di un frammento di codice dipendono fortemente dalle condizioni al contorno nel quale il codice stesso e' eseguito.
Per questo affermare che la versione di quella funzione a 64 bit e' due volte piu' veloce della versione a 32 bit significa non sapere di che cosa si sta parlando. Quella versione e' due volte piu' veloce nelle condizioni dell'esperimento, ovvero nelle condizioni ideali d'esecuzione, in un inner loop, con tutto il working set in cache, codice in cache, salti tutti predetti correttamente. Purtroppo sono condizioni di esecuzioni irrealistiche

In condizioni di esecuzione piu' realistiche, dove la stessa chiamata a funzione e' effettuata all'interno di un algoritmo piu' complesso, con il suo working set che magari non e' sempre in cache, con determinati pattern d'accesso alla memoria, la versione a 64 bit potrebbe anche risultare piu' lenta di quella a 32 bit, o di qualche punto percentuale piu' veloce, oppure esattamente equivalente. Dipende fortemente dalle condizioni di esecuzione.

Per questo mi e' venuto il dubbio che repne non sappia di che cosa sta parlando, o, molto piu' probabilmente, sa di che parla ma ha provato a fare orecchie da mercante ed ha solo cercato di manipolarsela a suo favore per chissa' quale motivo di autocelebrazione.

Un altro esempio per chiarire, la famosa tecnica di ottimizzazione per calcolare il valore del coseno di un angolo: invece di fare i calcoli della funzione (o di una sua approssimazione) si memorizzano i risultati in una tabella dove per ogni angolo e' memorizzato il valore del suo coseno. Dato l'angolo, con una semplice lettura dalla memoria si ha il risultato, apparentemente molto piu' veloce che farsi i calcoli.
Funzionava a meraviglia dieci anni fa; magari chiamando questa funzione del coseno un milione di volte anche oggi si trova che e' dieci volte piu' veloce della versione che calcola il valore senza la tabella, poi si chiama la stessa funzione dall'algoritmo che si sta cercando di ottimizzare e si scopre che... va piu' lento. La tabella di coseni occupa spazio nella cache di primo livello che causa un aumento del working set dell'algoritmo rallentandolo. Mi e' successo l'anno scorso.

Morale della favola, fare profiling non significa chiamare RDTSC, significa capire le condizioni di esecuzione di un frammento di codice e da li' capirne il profilo prestazionale interpretando i dati del profiler.

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.
 
^