2012-02-10 19 views
10

Il set di istruzioni x86-64 aggiunge più registri e altri miglioramenti per semplificare il codice eseguibile. Tuttavia, in molte applicazioni la maggiore dimensione del puntatore è un peso. I byte extra non utilizzati in ogni puntatore intasano la cache e potrebbero persino sovraccaricare la RAM. GCC, ad esempio, crea con il flag -m32 e presumo che questo sia il motivo.Puntatori a 32 bit con ISA x86-64: perché no?

È possibile caricare un valore a 32 bit e trattarlo come un puntatore. Questo non richiede istruzioni aggiuntive, basta caricare/calcolare i 32 bit e caricare dall'indirizzo risultante. Il trucco non sarà tuttavia portatile, poiché le piattaforme hanno mappe di memoria diverse. Su Mac OS X, è riservato l'intero 4 GiB basso dello spazio di indirizzamento. Tuttavia, per un programma che ho scritto aggiungendo immediatamente 0x100000000L a "indirizzi" a 32 bit prima di utilizzare prestazioni migliorate notevolmente rispetto a veri indirizzi a 64 bit o compilando con -m32.

C'è qualche impedimento fondamentale per avere una piattaforma a 32 bit, x86-64? Suppongo che il supporto di una simile chimera possa aggiungere complessità a qualsiasi sistema operativo, e chiunque voglia avere quell'ultimo 20% dovrebbe semplicemente farlo funzionare, ma sembra comunque che questo sarebbe il più adatto per una varietà di programmi ad alta intensità di calcolo.

+0

I dati di profilo nella maggior parte delle applicazioni non suggeriscono alcuna perdita significativa a causa della maggiore dimensione del puntatore. – Puppy

+0

Il compilatore Intel ha l'opzione ['Qauto-ilp32'] (http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/copts/ccpp_options/option_qauto_ilp32 .htm) che "cerca" di utilizzare 32 bit per i puntatori, anche in modalità x64. – Mysticial

+0

@Mysticial ma è più simile ai puntatori "near" e "lontano" vecchio stile, giusto? Questa soluzione è OK, suppongo, ma non è così pulita come quella a cui mi riferisco. – Potatoswatter

risposta

10

C'è un ABI chiamato "x32" per linux in fase di sviluppo. È un mix tra x86_64 e ia32 simile a quello che viene descritto: lo spazio di indirizzamento a 32 bit mentre si utilizza il set di registri completo a 64 bit. Ha bisogno di un kernel personalizzato, binutils e gcc.

Alcune prove SPEC indicano un miglioramento delle prestazioni di circa il 30% in alcuni benchmark. Vedere ulteriori informazioni a https://sites.google.com/site/x32abi/

+0

Questa è davvero una buona informazione. Mi sentivo un po 'insicuro nel porre la domanda, perché il suo fraseggio poteva precludere qualsiasi buona risposta. Ma avere anche solo una piattaforma per supportare la chimera, nel caso in cui la differenza sia abbastanza significativa, cambia il campo di gioco. – Potatoswatter

-4

Si chiama "emulazione x86-32" o WOW64 su Windows (presumibilmente qualcos'altro su altri sistemi operativi) ed è un flag hardware nel processore. Non c'è bisogno di trucchi in modalità utente qui.

+0

È un flag accessibile all'utente? Quindi il sistema operativo è necessario per salvarlo/ripristinarlo e supportarlo? – Potatoswatter

+0

Ah, ho cercato: http://en.wikipedia.org/wiki/WOW64. No, è solo un codice x86 standard, il vecchio ISA con soli 8 registri, su un sistema operativo a 64 bit. Proprio come '-m32'. Non penso che altri sistemi operativi si preoccupino di dare un nome a quel "nome". – Potatoswatter

+0

@Potatoswatter: E questo è significativamente diverso da quello che descrivi come, esattamente? Invece di fare hack in modalità utente per raggiungere l'obiettivo, il processore lo raggiunge in hardware. Sarà sempre più veloce. Non c'è alcun flag per il compilatore che lo ottenga, è una caratteristica del processore hardware. – Puppy

0

Non mi aspetto molto difficile supportare un tale modello nel sistema operativo. L'unica cosa che deve cambiare per i processi in questo modello è la gestione delle pagine, le pagine devono essere allocate sotto il punto di 4 GB. Anche il kernel dovrebbe allocare i suoi buffer dai primi 4 GB dello spazio degli indirizzi virtuali se li passa all'applicazione. Lo stesso vale per il caricatore che carica e avvia le applicazioni. Oltre a ciò un kernel a 64 bit dovrebbe essere in grado di gestire tali app senza importanti modifiche.

Il supporto del compilatore non dovrebbe essere un grosso problema. Si tratta principalmente di generare codice che può utilizzare i registri CPU aggiuntivi e i loro 64 bit completi e l'aggiunta di prefissi REX appropriati ogni volta che è necessario.

Problemi correlati