Domanda

suppongo che sto concentrandosi su x86, ma sto in generale interessato al passaggio da 32 a 64 bit.

A rigor di logica, posso vedere che le costanti e puntatori, in alcuni casi, sarà più grande in modo da programmi sono suscettibili di essere più grande. E il desiderio di allocare la memoria sui confini di parola per l'efficienza significherebbe più bianco-spazio tra le allocazioni.

Ho anche sentito che la modalità 32 bit su x86 deve svuotare la cache quando commutazione di contesto a causa della possibile sovrapposizione spazi di indirizzamento 4G.

Quindi, quali sono i reali benefici di 64 bit?

E come una domanda complementare, sarebbe a 128 bit ancora meglio?

Modifica:

ho appena scritto il mio primo programma 32/64 bit. Rende liste / alberi di 16 byte (versione 32b) o 32 byte (versione 64b) collegate oggetti e fa un sacco di stampa su stderr - non è un programma davvero utile, e non qualcosa di tipico, ma è il mio primo

Dimensione: 81128 (32b) v 83672 (64b) - in modo da non molta differenza

Velocità: 17s (32b) v 24s (64b) - in esecuzione su 32 bit OS (OS-X 10.5.8)

Aggiornamento:

Ho notato che un nuovo ibrido x32 ABI (Application Binary Interface) è in fase di sviluppo che è 64b ma utilizza 32b puntatori. Per alcuni test si traduce in piccole codice ed esecuzione più veloce rispetto sia 32b o 64b.

https://sites.google.com/site/x32abi/

È stato utile?

Soluzione

A meno che non avete bisogno di un accesso più memoria che 32b affrontare vi permetterà, i benefici sarà piccolo, se del caso.

Quando si esegue su CPU 64b, si ottiene la stessa memoria di interfaccia, non importa se si esegue 32b o il codice 64b (si utilizza la stessa cache e lo stesso BUS).

Mentre l'architettura x64 ha qualche registri più che permette ottimizzazioni più facile, questo è spesso contrastata dai puntatori fatto sono ora più grandi e con qualsiasi struttura con i puntatori si traduce in un traffico di memoria superiore. Stimerei l'aumento dell'uso complessivo memoria per un'applicazione 64b rispetto ad un 32b uno a circa 15-30%.

Altri suggerimenti

I tipicamente vedere un miglioramento della velocità del 30% per il codice di calcolo intensivo su x86-64 rispetto a x86. Questo è probabilmente dovuto al fatto che abbiamo registri di uso generale 16 x 64 bit e 16 registri x SSE invece di 8 x 32 bit registri di uso generale e 8 registri x SSE. Questo è con il compilatore Intel ICC (11.1) su un x86-64 Linux - i risultati con altri compilatori (ad esempio gcc), o con altri sistemi operativi (ad esempio Windows), può essere diverso, naturalmente,

.

A prescindere dai benefici, vorrei suggerire che si compila sempre il vostro programma per la dimensione della parola predefinita del sistema (32-bit o 64-bit), dal momento che se si compila una libreria come un binario a 32 bit e di fornire su un sistema a 64 bit, si costringerà chiunque voglia collegamento con la libreria per fornire loro biblioteca (ed eventuali altre dipendenze della biblioteca) come un binario a 32 bit, quando la versione a 64 bit è l'impostazione predefinita a disposizione. Questo può essere un bel fastidio per tutti. In caso di dubbio, fornire entrambe le versioni del tuo grimorio.

Per quanto riguarda i vantaggi pratici di 64-bit ... la più ovvia è che si ottiene uno spazio di indirizzamento più grande, quindi se mmap un file, è possibile affrontare più di esso in una sola volta (e caricare file di dimensioni maggiori in memoria). Un altro vantaggio è che, assumendo il compilatore fa un buon lavoro di ottimizzazione, molte delle operazioni aritmetiche possono essere parallelizzati (per esempio, ponendo due coppie di numeri a 32 bit in due registri e svolge due aggiunge nel funzionamento singolo componente aggiuntivo) e grande calcoli numerici verrà eseguito in modo più rapido. Detto questo, il tutto a 64 bit vs 32 bit cosa non vi aiuterà con la complessità asintotica a tutti, quindi se si sta cercando di ottimizzare il codice, si dovrebbe probabilmente essere guardando gli algoritmi piuttosto che i fattori costanti come questa.

Modifica :
Si prega di ignorare la mia dichiarazione circa l'aggiunta parallelizzato. Questo non viene eseguita da una dichiarazione add normale ... mi era confusa che con alcune delle istruzioni vectorized / SSE. Un vantaggio più accurato, a parte il più grande spazio di indirizzi, è che ci sono registri di uso più generale, il che significa più variabili locali possono essere mantenuti nel file registri della CPU, che è molto più veloce di accesso, che se si posiziona le variabili nella programma pila (che di solito significa uscire alla cache L1).

Oltre ad avere più registri, a 64 bit ha SSE2 predefinita. Questo significa che si possono infatti eseguire alcuni calcoli in parallelo. Le estensioni SSE avevano altre chicche troppo. Ma credo che il vantaggio principale non si trova a dover verificare la presenza delle estensioni. Se è x64, ha SSE2 disponibili. ... Se la mia memoria non mi inganna.

Solo giustificazione per spostare l'applicazione per 64 bit è necessità di una più memoria in applicazioni come grandi database o applicazioni ERP con almeno 100s di utenti simultanei in cui 2 GB limite sarà superato abbastanza rapidamente quando le applicazioni cache per migliorare le prestazioni. Si tratta di case appositamente sul sistema operativo Windows in cui intero e lungo è ancora a 32 bit (hanno nuova _int64 variabile. Solo i puntatori sono a 64 bit. Infatti WOW64 è altamente ottimizzato su Windows x64 in modo che le applicazioni a 32 bit funzionano con bassa pena a 64 bit di Windows OS. La mia esperienza su Windows x64 è la versione applicazione a 32 bit esegue il 10-15% più veloce rispetto a 64 bit dal momento che in primo caso, almeno per i database di memoria proprietarie che è possibile utilizzare il puntatore arithmatic per il mantenimento di b-tree (la maggior parte processor intensivo di sistemi di database) . Compuatation intensive che richiedono grandi decimali per la massima accuratezza non potuti permettere doppio su sistema operativo 32-64 bit. Queste applicazioni possono utilizzare _int64 in modo nativo invece di emulazione software. Naturalmente grandi database basati disco mostrerà anche miglioramento rispetto a 32 bit dovuto semplicemente alla capacità di utilizzare grandi quantità di memoria per la cache piani di query e così via.

Più dati vengono trasferiti tra la CPU e RAM per ogni memoria fetch (64 bit invece di 32), quindi programmi a 64 bit possono essere forniti più velocemente sono scritti in modo da sfruttare adeguatamente questo.

Nel caso specifico di x68 per x68_64, il programma a 64 bit sarà circa la stessa dimensione, se non leggermente più piccolo, usare un po 'più di memoria, e correre più veloce. Principalmente questo è perché x86_64 non solo ha 64 registri bit, ma ha anche il doppio. x86 non ha abbastanza registri per rendere linguaggi compilati come efficienti come potrebbero essere, quindi il codice x86 spende un sacco di istruzioni e la larghezza di banda della memoria spostando indietro di dati e indietro tra i registri e la memoria. x86_64 ha molto meno di quello, e quindi ci vuole un po 'meno spazio e corre più veloce. virgola mobile e le istruzioni vettoriali bit-giocherellando sono anche molto più efficiente nel x86_64.

In generale, però, a 64 bit di codice non è necessariamente più veloce, ed è di solito più grande, sia per il codice e l'utilizzo della memoria in fase di esecuzione.

Tutte le applicazioni che richiedono l'utilizzo della CPU come ad esempio la transcodifica, prestazioni di visualizzazione e mezzi di rendering, che si tratti di audio o video, sarà certamente richiederà (a questo punto) e beneficiare utilizzando 64 bit vs 32 bit grazie alla capacità della CPU per accordo con l'enorme quantità di dati che vengono gettati a questo. Non è tanto una questione di spazio di indirizzi in quanto è il modo in cui i dati sono in corso di esame. Un processore a 64 bit, dato a 64 bit di codice, sta per eseguire meglio, soprattutto con le cose matematicamente difficili come la transcodifica e dati VoIP - di fatto, qualsiasi tipo di applicazioni 'matematica' dovrebbe beneficiare dall'uso di 64 CPU bit e sistemi operativi. Smentirmi.

Sono la codifica di un motore di scacchi. La migliore estrazione mossa utilizzando una ricerca albero minimax a base alla profondità 9 (da una certa posizione) ha ~ 17.0s sulla configurazione Win32 e dopo il passaggio a x64 prende ora ~ 10.3s. Questo è del 41% dell'accelerazione!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top