C'è un miglioramento della larghezza di banda rispetto all'installazione di un sistema operativo a 32 bit su una macchina a 64 bit?

StackOverflow https://stackoverflow.com/questions/254368

Domanda

Knuth recentemente contestato ai sistemi a 64 bit, dicendo quello per i programmi che si adattano a 4 GB di memoria, "eliminano effettivamente metà della cache" perché i puntatori sono due volte più grandi di un sistema a 32 bit.

La mia domanda è: questo problema può essere evitato installando un sistema operativo a 32 bit su una macchina a 64 bit? E ci sono benchmark ad alta intensità di banda che dimostrano il vantaggio in questo caso?

È stato utile?

Soluzione

La risposta è: sì, può in una certa misura, anche se è improbabile che la differenza di prestazioni sia notevole.

Qualsiasi benchmark per testarlo dovrà fare molta risoluzione del puntatore, che sarà difficile separare dal rumore. Progettare un punto di riferimento che non ottimizzerà via è difficile. Questo articolo sui benchmark Java errati è stato pubblicato da qualcuno in risposta a un'altra domanda, ma molti dei principi in essa descritti si applicheranno a questo.

Altri suggerimenti

La larghezza di banda non è proprio il termine corretto qui. Ciò di cui Knuth stava davvero parlando era la densità dei dati, in relazione al footprint della cache. Immagina di avere una cache di dati L1 da 16 KB: se stai semplicemente memorizzando i puntatori, puoi archiviare 2 ^ 14/2 ^ 2 = 2 ^ 12 = 4096 puntatori a 32 bit, ma solo 2048 puntatori a 64 bit. Se le prestazioni della tua applicazione dipendono dalla capacità di tenere traccia di oltre 2K buffer diversi, potresti notare un reale vantaggio in termini di prestazioni da uno spazio di indirizzi a 32 bit. Tuttavia, la maggior parte del codice reale non è così, e i vantaggi in termini di prestazioni reali di un sistema di memorizzazione nella cache spesso derivano dalla capacità di memorizzare nella cache strutture di dati interi e in virgola mobile comuni, non enormi quantità di puntatori. Se il tuo set di lavoro non è pesante per i puntatori, il rovescio della medaglia a 64 bit diventa trascurabile e il rialzo diventa molto più ovvio se stai eseguendo molta aritmetica a 64 bit interi.

Non penso che Knuth si sia opposto ai sistemi a 64 bit. Ha appena detto che l'uso di puntatori a 64 bit su un sistema che ha meno di 4 GB di RAM è idiota (almeno se hai molti puntatori come quelli in un elenco a doppio collegamento). Non posso dire di essere d'accordo con lui, qui ci sono 3 modi diversi che possono essere presi. Supponiamo che tu abbia una CPU a 64 bit che può funzionare anche in modalità 32 bit come alcuni Intel Core Duo.

1 - Tutto è a 32 bit, il sistema operativo, l'APPZ, tutti. Quindi hai puntatori a 32 bit ma non puoi usare i registri / istruzioni extra disponibili in modalità 64 bit.

2 - Tutto è a 64 bit, il sistema operativo, l'APPZ, tutti. Quindi hai puntatori a 64 bit e puoi usare i registri / istruzioni extra disponibili in modalità 64 bit. Ma dato che hai meno di 4 GB di RAM, usare i puntatori a 64 bit sembra idiota. Ma è?

3 - Il sistema operativo è a 64 bit e il sistema operativo si assicura in modo interessante che tutti i puntatori di codice / dati siano nell'intervallo 0x00000000 - 0xFFFFFFFF (memoria virtuale !!!). L'ABI funziona in un modo molto strano che tutti i puntatori di codice / dati conservati in memoria / file sono larghi a 32 bit ma vengono caricati in registri a 64 bit come zero-extended. Se è presente una posizione del codice da saltare, il compilatore / ABI esegue le correzioni necessarie e esegue l'attuale salto a 64 bit. In questo modo, i puntatori sono a 32 bit, ma APPZ può essere a 64 bit, il che significa che possono utilizzare i registri e le istruzioni a 64 bit. Questo processo è qualcosa come il thunking, penso ;-P

La mia conclusione è ::

La terza opzione mi è sembrata fattibile ma non è un problema facile. In teoria può funzionare ma non credo sia fattibile. E penso anche che la sua citazione "Quando tali valori di puntatore compaiono all'interno di una struttura, non solo sprecano metà della memoria, ma eliminano effettivamente metà della cache." è esagerato ...

Ho visto da qualche parte che il miglior mix (su CPU x86) è usare un sistema operativo a 64 bit e applicazioni a 32 bit.

con un sistema operativo a 64 bit ottieni:

  • capacità di gestire più di 4 GB di spazio degli indirizzi
  • più registri più grandi per aiutare nelle operazioni di copia dei dati

con un'app a 32 bit ottieni:

  • puntatori più piccoli
  • meno, registri più piccoli da salvare su switch di contesto

cons:

  • tutte le librerie devono essere duplicate. minuscola per gli standard spaziali HD.
  • tutte le librerie caricate sono duplicate su RAM. non così piccolo ...

sorprendentemente, non sembra esserci alcun sovraccarico quando si cambia modalità. Immagino che passare dallo spazio utente al kernel abbia lo stesso costo, indipendentemente dal testimone dello spazio utente.

ovviamente, ci sono alcune applicazioni che beneficiano di un grande spazio di indirizzi. ma per tutto il resto, puoi ottenere un rendimento extra del 5% rimanendo a 32 bit.

e no, non mi interessa questo piccolo speedup. ma non "offende" per eseguire FireFox a 32 bit su una macchina KUbuntu a 64 bit (come ho visto in alcuni forum)

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