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 Fabio Boneschi pubblicata il 28 Gennaio 2005, alle 17:23 nel canale ProgrammiMicrosoftWindows








Star Wars Zero Company è l'erede di XCOM 2
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Google perde la testa: AI Overview consola l'utente invece di cercare
Anthropic presenta Claude Sonnet 5.5, e risolve uno dei maggiori problemi del 5
ESA e ClearSpace svilupperanno un satellite per prolungare la vita utile di altri satelliti in orbita geostazionaria
Oracle, stock option da quasi un miliardo affondate: Ellison e i co-CEO a mani vuote
Starship: si è conclusa anticipatamente la prima missione orbitale del razzo spaziale riutilizzabile
Un computer quantistico ha funzionato nello spazio per la prima volta: la prova è un successo nonostante i guasti
Sovranità sui dati: AWS è il primo cloud provider a ottenere la certificazione NATO RESTRICTED
Il nuovo nome della distro Linux mobile postmarketOS ha origini italiane
Due ventole da 220 mm e non solo: Cooler Master HAF II 500 mette il flusso d'aria al primo posto
Truffa telefonica via Google Ads: il browser si blocca e appare un falso allarme virus
Google pensiona le Gems di Gemini: cosa sono e come verranno sostituite
Flight 14: incertezza per un problema a un motore ma alla fine il razzo spaziale Starship ha raggiunto l'orbita
C'è un problema con i robot Tesla: i dipendenti non vogliono addestrare le macchine che li sostituiranno
Raggi gamma anomali dalla Via Lattea svelano cosa si nasconde davvero al centro della galassia









211 Commenti
Gli autori dei commenti, e non la redazione, sono responsabili dei contenuti da loro inseriti - info[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 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).
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.
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)
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]
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.
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".