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
cdimauro31 Gennaio 2005, 16:38 #111
Originariamente inviato da fek
Si', sono decisamente il caso di calcoli intensivi su inner loop molto stretti (il raytracing ad esempio). Ma quelli sono calcoli in floating point...
Mi stona molto il risultato di MySQL... ma siamo sicuri che qui stiamo analizzando le ottimizzazioni architetturali oppure la differenza fra codice a 32 bit e 64 bit?
Perche' non vedo davvero dove la seconda possa entrare in calcoli floating point effettuati da un raytracer...

Per quanto mi riguarda sto confrontando le differenze architetturali nell'esecuzione di codice fra x86 e x86-64: quindi non semplicemente fra codice a 32 e 64 bit, se non intendendo con ciò x86-32 e x86-64 rispettivamente, nel loro complesso.

E' chiaro che i 64 bit di per sé non posso influire da soli nei risultati: è l'intera architettura che, essendo diversa, comporta delle differenze in termini prestazionali. Con ciò si spiega il guadagno di POV-Ray, che fa massiccio uso di calcoli in floating point, come giustamente sottolinei, e penso nessun uso di variabili intere a 64 bit. Evidentemente il maggior numero di registri GPR/SSE, ecc. ha portato a questo risultato.
cdimauro31 Gennaio 2005, 16:45 #112
Originariamente inviato da fek
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).

Rimane il fatto che nel disassemblato che hai fornito non è presente neppure un'istruzione di moltiplicazione, che è assolutamente necessaria (ce ne vogliono almeno tre, come giustamente ha riportato repne scasb) per calcolare in maniera corretta la funzione che hai riportato.
Infatti i due sorgenti che hai postato, in C e assembly, non calcolano la stessa funzione, ed è questo (penso) che voleva farti notare repne scasb.
cdimauro31 Gennaio 2005, 17:05 #113
Originariamente inviato da fek
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.

Questo è pacifico: le condizioni al momento dell'esecuzione posso chiaramente influenzare anche pesantemente l'esecuzione del codice, ma se dovessimo considerare tutte le variabili che possono incidere, che senso avrebbe effettuare il profiling di un codice? Nessuno, perché non si sa mai in quali condizioni verrà eseguito: quali pagine del codice, dei dati e dello stack sono caricati in memoria, quali parti stanno nella cache L1, in quella L2 (eventualmente nella L3), quali pagine sono mappate nei tag del TLB, ecc. ecc. ecc.

Penso che sia ragionevole, invece, spostare l'attenzione sul punto di vista di un compilatore, che di tutte queste variabili non è assolutamente a conoscenza e comunque, sorgente "alla mano", deve pur tirare fuori un codice eseguibile.
Da questo punto di vista, analizzando indifferentemente le prime o le seconde versioni a 32 e 64 bit della funzione di cui sopra, mi sembra più che evidente che il codice che POTENZIALMENTE girerà più velocemente e quello per x86-64: è molto più compatto (quindi occupa meno spazio nella cache), utilizza meno istruzioni, meno accessi alla memoria, esegue una sola moltiplicazione, utilizza meno registri e quindi può anche fare a meno di spostare avanti e indietro registro nello stack/cache/memoria.

D'altra parte ti sarai reso conto che POV-Ray ha evidenziato un notevole miglioramento, pur non usando registri (interi) a 64 bit: eppure i puntatori "pesano" il doppio, le strutture quindi occupano più spazio -> più accessi alla memoria -> più accessi alla cache & meno spazio disponibile per gli altri dati/codice, il codice x86-64 occupa il 20% circa in più di spazio, ecc. ecc.

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.

D'accordo, ma vedi sopra: possiamo andare avanti per centinaia di messaggi, ed è chiaro che fare il profiling di due codici completamente diversi, quali sono quelli a 32 e 64 bit di cui sopra, non porterà a niente. Com'è anche più che evidente che gli incrementi prestazionali dell'architettura x86-64 esistono, e spesso sorprendono anche te...
fek31 Gennaio 2005, 17:31 #114
Originariamente inviato da cdimauro
Per quanto mi riguarda sto confrontando le differenze architetturali nell'esecuzione di codice fra x86 e x86-64: quindi non semplicemente fra codice a 32 e 64 bit, se non intendendo con ciò x86-32 e x86-64 rispettivamente, nel loro complesso.

E' chiaro che i 64 bit di per sé non posso influire da soli nei risultati: è l'intera architettura che, essendo diversa, comporta delle differenze in termini prestazionali. Con ciò si spiega il guadagno di POV-Ray, che fa massiccio uso di calcoli in floating point, come giustamente sottolinei, e penso nessun uso di variabili intere a 64 bit. Evidentemente il maggior numero di registri GPR/SSE, ecc. ha portato a questo risultato.


Si', mi trovi d'accordo, anch'io direi che la maggior parte dei miglioramenti che hai riportato sono dovuti all'architettura piu' efficiente.

Originariamente inviato da cdimauro
Rimane il fatto che nel disassemblato che hai fornito non è presente neppure un'istruzione di moltiplicazione, che è assolutamente necessaria (ce ne vogliono almeno tre, come giustamente ha riportato repne scasb) per calcolare in maniera corretta la funzione che hai riportato.
Infatti i due sorgenti che hai postato, in C e assembly, non calcolano la stessa funzione, ed è questo (penso) che voleva farti notare repne scasb.


Mi fai sorgere il dubbio di aver sbagliato il copy&paste dal debugger.

Originariamente inviato da cdimauro
Questo è pacifico: le condizioni al momento dell'esecuzione posso chiaramente influenzare anche pesantemente l'esecuzione del codice, ma se dovessimo considerare tutte le variabili che possono incidere, che senso avrebbe effettuare il profiling di un codice? Nessuno, perché non si sa mai in quali condizioni verrà eseguito: quali pagine del codice, dei dati e dello stack sono caricati in memoria, quali parti stanno nella cache L1, in quella L2 (eventualmente nella L3), quali pagine sono mappate nei tag del TLB, ecc. ecc. ecc.


Esatto, non ha senso fare il profiling di una funzione separata dal contesto. E' proprio il punto al quale volevo arrivare.
E' un esercizio che non porta a nessuna informazione e che lascio volentieri agli accademici

A me interessano i discorsi pragmatici e valutare mediamente quale impatto prestazionale possa avere il codice a 64 bit rispetto a quello a 32 bit in media. Alla luce della discussione direi molto basso se non in casi molto specifici. Qui sto parlando di codice a 64 bit non di codice per l'architettura x86-64, dal quale credo sia nata la confusione.

Da questo punto di vista, analizzando indifferentemente le prime o le seconde versioni a 32 e 64 bit della funzione di cui sopra, mi sembra più che evidente che il codice che POTENZIALMENTE girerà più velocemente e quello per x86-64: è molto più compatto (quindi occupa meno spazio nella cache), utilizza meno istruzioni, meno accessi alla memoria, esegue una sola moltiplicazione, utilizza meno registri e quindi può anche fare a meno di spostare avanti e indietro registro nello stack/cache/memoria.


Di nuovo no, questa conclusione e' errata, perche' quel codice puo' potenzialmente essere piu' lento, piu' veloce oppure uguale. Una volta messo nel suo ambiente si puo' dare una risposta e questa risposta dipende da svariati fattori.

Accedere una tabella trigonometrica ha meno istruzioni (solo una), usa meno registri (solo uno), ha meno accessi alla memoria (solo uno), potenzialmente girera' molto piu' velocemente rispetto a fare i calcoli. Toh, va piu' piano

D'accordo, ma vedi sopra: possiamo andare avanti per centinaia di messaggi, ed è chiaro che fare il profiling di due codici completamente diversi, quali sono quelli a 32 e 64 bit di cui sopra, non porterà a niente. Com'è anche più che evidente che gli incrementi prestazionali dell'architettura x86-64 esistono, e spesso sorprendono anche te...


I risultati dell'architettura non mi sorprendono affatto, mi sorprenderebbe se passare da 32 bit a 64 bit (non da architettura ad architettura) portasse ad incrementi medi del 30% come qualche utente ho sostenuto, ed e' cio' che contesto.

Domanda forse capziosa: se i miglioramenti architetturali (piu' registri, etc) fossero stati implementati senza i registri a 64bit secondo te avremmo ottenuto incrementi prestazionali simili, superiori o inferiori? Direi simili.
Solido31 Gennaio 2005, 17:59 #115
Scusate ma si può scaricare oppure no?
Banus31 Gennaio 2005, 18:07 #116
Originariamente inviato da fek
Di nuovo no, questa conclusione e' errata, perche' quel codice puo' potenzialmente essere piu' lento, piu' veloce oppure uguale.

Ovviamente il discorso di cdimauro è nel campo delle supposizioni.
Dal momento che puntatori a 64 bit occupano più spazio ti aspetti un maggior numero di cache miss, e quindi prestazioni peggiori a parità di altri fattori.
Dal momento che il codice della funzione che hai postato compilato a 64 bit è molto più compatto, ti aspetti che porti a meno cache miss e prestazioni migliori in alcuni casi (anche se stiamo parlando di cache del codice, non è la stessa cosa ).

Domanda forse capziosa: se i miglioramenti architetturali (piu' registri, etc) fossero stati implementati senza i registri a 64bit secondo te avremmo ottenuto incrementi prestazionali simili, superiori o inferiori? Direi simili.

Credo che questo risponda adeguatamente:
http://www.anandtech.com/guides/viewfaq.html?i=112

Di fatto solo lo spazio di indirizzamento maggiore richiede necessariamente 64 bit. I miglioramenti nel calcolo di interi sono marginali.
AMD è stata molto astuta nell'aggiungere molti miglioramenti architetturali negli Athlon64, in modo da rendere più vantaggioso il passaggio alla nuova piattaforma, anche in assenza di codice in grado di sfruttarne le caratteristiche.
Nessuno si aspetta prestazioni maggiori dai G4 perchè a 64 bit...
fek31 Gennaio 2005, 18:48 #117
Originariamente inviato da Banus
Credo che questo risponda adeguatamente:
http://www.anandtech.com/guides/viewfaq.html?i=112


Piu' che adeguatamente

I’ve been seeing a lot of confusion surrounding 64-bit computing lately, undoubtedly spurred by discussion of AMD’s Hammer. There seems to be this idea that 64-bit computing will provide a 2X performance increase over 32-bit computing; this couldn’t be more false. This idea was probably proliferated by video game console marketing (ie, a “64-bit” game console is twice as fast as a “32-bit” one.) I often see the phrase “a 64-bit CPU can process twice as much data per cycle as a 32-bit CPU” or something similar in articles, implying that the 64-bit CPU is twice as fast.
^TiGeRShArK^31 Gennaio 2005, 19:09 #118
Originariamente inviato da fek
E' quello che cerco di spiegarti, in un raytracer non apprezzi i benefici dei 64 bit, apprezzi i benefici di un'architettura piu' performante ed e' un discorso molto diverso. Ed un raytracer non e' "in quasi tutti i campi", e' un solo campo.

Quello che ti sto contestando e' che il passaggio da 32 a 64 bit possa portare benefici prestazionali in tutti i campi, no, non e' vero. I miglioramenti dell'architettura si', i 64 bit no.


Appunto. Per risponderti leggi uno dei miei primi post in questo thread:

il passaggio 16 bit 32 bit non ha NIENTE a ke vedere con quello 32 -64.
In quest'ultimo le maggiori prestazioni saranno dettate SOPRATTUTTO dal raddoppio dei registri del processore, con incrementi ke possono raggiungere anke il 20%.
inoltre sarà possibile un ULTERIORE boost x via dei programmi ke si avvantaggeranno del calcolo nativo a 64 bit. Ma non è assolutamente SOLO questo il guadagno.


che cosa ho detto di diverso rispetto a quello ke tu stai dicendo nel pezzo ke ho quotato???

e cmq il raytracer è solo un campo, ma anke l'encoding video, l'encoding audio, la compressione, i database sono altri campi....
qdi permettimi di dire ke non sono poi così poche le applicazioni che beneficieranno di WIN XP 64.
repne scasb31 Gennaio 2005, 19:24 #119
fek31 Gennaio 2005, 19:38 #120
Originariamente inviato da repne scasb
Purtroppo l'esempio di fek e' stato infelice, in quanto ha postato del codice con una moltiplicazione a 64-bit. Si tratta, in effetti, di un "raro" caso in cui il codice a 64-bit e' sicuramente piu' veloce, in quanto "esiste" in mode_64 un istruzione "nativa" per fare una moltiplicazione a 64-bit (cosa che in PM_32 richiede almeno 3 moltiplicazioni).


"Sicuramente piu' veloce". Evidentemente non hai letto nulla di quello che ho scritto io e neppure hai letto l'articolo. Mi sembra offensivo nei confronti di chi legge dover ripetere daccapo il concetto.

Pazienza, hai sprecato una buona occasione.

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