I programmi a 64 bit sono più grandi e più veloci delle versioni a 32 bit?


85

Suppongo di concentrarmi su x86, ma generalmente sono interessato al passaggio da 32 a 64 bit.

Logicamente, posso vedere che costanti e puntatori, in alcuni casi, saranno più grandi, quindi è probabile che i programmi siano più grandi. E il desiderio di allocare la memoria sui confini delle parole per l'efficienza significherebbe più spazio bianco tra le allocazioni.

Ho anche sentito che la modalità a 32 bit su x86 deve svuotare la cache durante il cambio di contesto a causa di possibili spazi di indirizzi 4G sovrapposti.

Allora, quali sono i veri vantaggi del 64 bit?

E come domanda supplementare, 128 bit sarebbe ancora meglio?

Modificare:

Ho appena scritto il mio primo programma a 32/64 bit. Crea elenchi / alberi collegati di oggetti a 16 byte (versione 32b) o 32 byte (versione 64b) e stampa molto su stderr - non è un programma veramente utile e non è qualcosa di tipico, ma è il mio primo.

Dimensioni: 81128 (32b) v 83672 (64b) - quindi non molta differenza

Velocità: 17s (32b) contro 24s (64b) - in esecuzione su sistema operativo a 32 bit (OS-X 10.5.8)

Aggiornare:

Noto che è in fase di sviluppo un nuovo ibrido x32 ABI (Application Binary Interface) che è 64b ma utilizza puntatori 32b. Per alcuni test risulta in codice più piccolo e un'esecuzione più veloce rispetto a 32b o 64b.

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


1
Suma

1
E il mio di pochi giorni fa: stackoverflow.com/questions/2334148/…
Mr. Boy

Ci sono alcune sovrapposizioni, sono d'accordo, ma ancora nessun acquirente sulla cache della CPU e parti a 128 bit. Grazie Suma e John per i link.
philcolbourn


"Ho anche sentito che la modalità a 32 bit su x86 deve svuotare la cache durante il cambio di contesto a causa di possibili spazi di indirizzi 4G sovrapposti." Puoi indicarmi un riferimento che parla di questo?
gkb0986

Risposte:


30

A meno che non sia necessario accedere a più memoria consentita dall'indirizzamento 32b, i vantaggi saranno piccoli, se presenti.

Quando si esegue su CPU da 64b, si ottiene la stessa interfaccia di memoria, indipendentemente dal fatto che si stia eseguendo codice a 32b o 64b (si utilizza la stessa cache e lo stesso BUS).

Sebbene l'architettura x64 abbia alcuni registri in più che consentono ottimizzazioni più semplici, questo è spesso contrastato dal fatto che i puntatori sono ora più grandi e l'utilizzo di qualsiasi struttura con puntatori si traduce in un traffico di memoria più elevato. Stimerei che l'aumento dell'utilizzo complessivo della memoria per un'applicazione 64b rispetto a 32b sia intorno al 15-30%.


2
Qual è la tua opinione sulla proposta di x32 ABI?
philcolbourn

Penso che memcpy e strcpy saranno più veloci della CPU a 32 bit perché leggerà una parola ogni volta poiché una parola è di 8 byte sulla CPU a 64 bit
Mark Ma

43

In genere vedo un miglioramento della velocità del 30% per il codice ad alta intensità di calcolo su x86-64 rispetto a x86. Ciò è molto probabilmente dovuto al fatto che abbiamo 16 registri per scopi generali a 64 bit e 16 registri SSE invece di 8 registri per scopi generali a 32 bit e 8 registri SSE. Questo è con il compilatore Intel ICC (11.1) su Linux x86-64 - i risultati con altri compilatori (ad esempio gcc), o con altri sistemi operativi (ad esempio Windows), possono essere ovviamente diversi.


1
Per "calcolo intensivo" intendi grafica, matrice, DFT?
philcolbourn

4
@phil: sì, principalmente elaborazione delle immagini, per lo più interi (punto fisso), molto codice SIMD, ecc.
Paul R

Ho osservato che i compilatori a 64 bit utilizzano i registri SSE mentre i compilatori a 32 bit utilizzano l'ALU standard. Ciò rende il codice a 64 bit più veloce a causa della larghezza FP più stretta (64 vs 80) più istruzioni aggiuntive.
IamIC

16

Indipendentemente dai vantaggi, ti suggerirei di compilare sempre il tuo programma per la dimensione della parola predefinita del sistema (32 bit o 64 bit), poiché se compili una libreria come binario a 32 bit e la fornisci su 64 bit sistema, costringerai chiunque desideri collegarsi alla tua libreria a fornire la propria libreria (e qualsiasi altra dipendenza dalla libreria) come binario a 32 bit, quando la versione a 64 bit è quella predefinita disponibile. Questo può essere un vero fastidio per tutti. In caso di dubbio, fornisci entrambe le versioni della tua libreria.

Per quanto riguarda i vantaggi pratici del 64 bit ... il più ovvio è che si ottiene uno spazio di indirizzamento più grande, quindi se mmap un file, puoi indirizzarne più in una volta (e caricare file più grandi in memoria). Un altro vantaggio è che, supponendo che il compilatore svolga un buon lavoro di ottimizzazione, molte delle operazioni aritmetiche possono essere parallelizzate (ad esempio, posizionando due coppie di numeri a 32 bit in due registri ed eseguendo due aggiunte in un'unica operazione di aggiunta) e i calcoli del numero verranno eseguiti più rapidamente. Detto questo, l'intera cosa a 64 bit contro 32 bit non ti aiuterà affatto con la complessità asintotica, quindi se stai cercando di ottimizzare il tuo codice, dovresti probabilmente guardare gli algoritmi piuttosto che i fattori costanti come questo.

EDIT :
Si prega di ignorare la mia dichiarazione sull'aggiunta parallela. Questo non viene eseguito da una normale istruzione add ... Lo stavo confondendo con alcune delle istruzioni vettorializzate / SSE. Un vantaggio più accurato, a parte lo spazio degli indirizzi più ampio, è che ci sono più registri per scopi generali, il che significa che è possibile mantenere più variabili locali nel file di registro della CPU, che è molto più veloce da accedere, rispetto a se si inseriscono le variabili nel stack del programma (che di solito significa uscire dalla cache L1).


> "ad esempio, mettendo due coppie di numeri a 32 bit in due registri ed eseguendo due addizioni in un'unica operazione di addizione" C'è qualche compilatore là fuori che fa questo? Inoltre, sembra che lo stesso possa essere fatto su x86 usando le istruzioni SSE.
Suma

Pensare a questi "due aggiunge in uno" in più, è una sciocchezza e nessun compilatore può farlo come un'ottimizzazione, perché l'aggiunta da 32b inferiori potrebbe traboccare in 32b superiori. Hai bisogno delle istruzioni SIMD per questo.
Suma

Immagino che se fossi appassionato potresti fare più operazioni aritmetiche a 16 bit in registri a 64 bit. Sembrerebbe essere disordinato, ma scommetto che è stato fatto.
philcolbourn

"Constant Factors" - il suono è come qualcosa che direbbe Brian Harvey.
philcolbourn

5

Oltre ad avere più registri, 64 bit ha SSE2 per impostazione predefinita. Ciò significa che puoi effettivamente eseguire alcuni calcoli in parallelo. Le estensioni SSE avevano anche altre chicche. Ma immagino che il vantaggio principale non sia dover controllare la presenza delle estensioni. Se è x64, è disponibile SSE2. ... Se la mia memoria mi serve correttamente.


4

Sto codificando un motore di scacchi chiamato foolsmate . La migliore estrazione della mossa utilizzando una ricerca ad albero basata su minimax fino alla profondità 9 (da una certa posizione) ha avuto:

sulla Win32configurazione: ~ 17.0s;

dopo il passaggio alla x64configurazione: ~ 10.3s;

Questo è il 41% dell'accelerazione!


2

L'unica giustificazione per spostare l'applicazione a 64 bit è la necessità di più memoria in applicazioni come database di grandi dimensioni o applicazioni ERP con almeno 100 utenti simultanei in cui il limite di 2 GB verrà superato abbastanza rapidamente quando le applicazioni memorizzano nella cache per prestazioni migliori. Questo è il caso specialmente su sistema operativo Windows dove integer e long è ancora a 32 bit (hanno una nuova variabile _int64. Solo i puntatori sono a 64 bit. Infatti WOW64 è altamente ottimizzato su Windows x64 in modo che le applicazioni a 32 bit vengano eseguite con una penalità bassa su Windows a 64 bit Sistema operativo. La mia esperienza su Windows x64 è che la versione dell'applicazione a 32 bit viene eseguita più velocemente del 10-15% rispetto a 64 bit poiché nel primo caso almeno per i database di memoria proprietari è possibile utilizzare il puntatore aritmatico per mantenere b-tree (la maggior parte dei sistemi di database ad alta intensità di processore) . Applicazioni ad alta intensità di elaborazione che richiedono decimali di grandi dimensioni per la massima precisione non offerta dal doppio sul sistema operativo a 32-64 bit. Queste applicazioni possono utilizzare _int64 in modo nativo invece dell'emulazione software. Ovviamente anche i database basati su disco di grandi dimensioni mostreranno miglioramenti rispetto a 32 bit semplicemente grazie alla possibilità di utilizzare una grande memoria per la memorizzazione nella cache dei piani di query e così via.


In primo luogo, intrimane a 32 bit ovunque, indipendentemente dalla dimensione della parola dell'ambiente di esecuzione. Per quale compilatore è longancora a 32 bit durante la compilazione a 64 bit? Stai affermando che MSVC fa questo? Per quanto ne so, questo è anche [approssimativamente] trattato nello standard C ++ 11: sizeof(long) == sizeof(void*)Per favore, qualcuno, correggimi se sbaglio, poiché non ho un facile accesso a MSVC.
Matthew Hall

3
@ Matthew Hall: il suo sistema operativo Windows a 64 bit standard e quindi MSVC segue questo modello LLP64 (rispetto a LP64 per le varianti Unix). Fare riferimento a ( msdn.microsoft.com/en-us/library/3b2e7499(v=vs.100).aspx ).
GirishK

1

Più dati vengono trasferiti tra la CPU e la RAM per ogni recupero della memoria (64 bit invece di 32), quindi i programmi a 64 bit possono essere più veloci a condizione che siano scritti in modo da trarne vantaggio.


11
In realtà, non è così: il bus di memoria è di qualsiasi larghezza, che non ha nulla a che fare con la larghezza dei registri del processore. Alcuni sistemi a 32 bit recuperano 128 bit alla volta, ci sono sistemi a 64 bit che recuperano 32 bit alla volta e persino sistemi a 32 bit che recuperano memoria non più di 8 bit alla volta.
Andrew McGregor

OK, non ne ero a conoscenza, ma non è corretto che una singola istruzione mov trasferisca 64 bit su una CPU a 64 bit e 32 bit su una CPU a 32 bit? Quindi, quando si copia una grande quantità di memoria dal punto A al punto B, ciò significherebbe almeno che è necessario eseguire meno istruzioni mov su una CPU a 64 bit (anche se il bus di memoria è il collo di bottiglia)?
Rune Aamodt

2
Quando si sposta una grande quantità di memoria, si utilizzeranno le istruzioni SIMD da 128b sia su x86 che su x64.
Suma

Che cosa sono esattamente i "sistemi a 64 bit che recuperano 32 alla volta"? Si prega di citarne alcuni. Se ci sono, sono davvero "sistemi a 64 bit"?
Johnny

1

Nel caso specifico da x68 a x68_64, il programma a 64 bit avrà all'incirca le stesse dimensioni, se non leggermente più piccolo, utilizzerà un po 'più di memoria e verrà eseguito più velocemente. Principalmente questo perché x86_64 non ha solo registri a 64 bit, ma ne ha anche il doppio. x86 non ha abbastanza registri per rendere i linguaggi compilati il ​​più efficienti possibile, quindi il codice x86 spende molte istruzioni e larghezza di banda della memoria spostando i dati avanti e indietro tra i registri e la memoria. x86_64 ne ha molto meno, quindi richiede un po 'meno spazio e funziona più velocemente. Anche le istruzioni vettoriali in virgola mobile e bit-twiddling sono molto più efficienti in x86_64.

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


2
Non capisco bene il punto che stai dicendo. Inizialmente (prima frase) dici che i programmi a 64 bit generalmente gireranno più velocemente ma poi la tua ultima frase sembra fare marcia indietro per dire "non proprio"
SN

1

Qualsiasi applicazione che richiede l'utilizzo della CPU come la transcodifica, le prestazioni di visualizzazione e il rendering multimediale, sia audio che visivo, richiederà sicuramente (a questo punto) e trarrà vantaggio dall'utilizzo di 64 bit rispetto a 32 bit grazie alla capacità della CPU di gestire la pura quantità di dati che vengono lanciati su di esso. Non è tanto una questione di spazio degli indirizzi quanto il modo in cui i dati vengono trattati. Un processore a 64 bit, dato un codice a 64 bit, funzionerà meglio, specialmente con cose matematicamente difficili come la transcodifica e i dati VoIP - in effetti, qualsiasi tipo di applicazione 'matematica' dovrebbe trarre vantaggio dall'uso di CPU e sistemi operativi a 64 bit. Dimostra che ho torto.


No . Non lo farà. Se il requisito di RAM supera i 4 GB, solo allora sarà più veloce. Puoi facilmente cercare 1000 milioni di interi array in meno di 4 GB di dati in un'architettura a 32 bit. Quindi l'utilizzo di una macchina a 64 bit qui rallenterà
sapy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.