Scusa se la domanda sembra stupida. Sono solo vagamente consapevole del problema dell'allineamento dei dati e non ho mai fatto alcuna programmazione a 64 bit. Sto lavorando su un codice x86 a 32 bit in questo momento. Accede frequentemente a un array di int. A volte viene letto un numero intero a 32 bit. A volte due o più sono letti. Ad un certo punto mi piacerebbe creare il codice a 64 bit. Quello che non sono sicuro è se dovrei dichiarare questo array int come int
o long int
. Preferirei mantenere la larghezza del numero intero lo stesso, quindi non devo preoccuparmi delle differenze. Sono un po 'preoccupato anche se leggere/scrivere su un indirizzo che non è allineato alla parola naturale potrebbe essere lento.Esiste una penalità di prestazioni per accedere a un array di numeri interi a 32 bit in x86-64?
risposta
Le penalità di disallineamento si verificano solo quando il carico o il magazzino attraversano un limite di allineamento. Il confine è di solito il più piccolo:
- il naturale parola dimensioni dell'hardware. (32 bit o 64 bit *)
- La dimensione del tipo di dati.
Se si sta caricando una parola di 4 byte su un'architettura a 64 bit (8 byte). Non ha bisogno di essere allineato a 8 byte. Ha solo bisogno di essere allineato a 4 byte.
Allo stesso modo, se si carica un carattere a 1 byte su qualsiasi macchina, non è necessario che sia allineato.
* Si noti che i vettori SIMD possono implicare una parola-dimensione naturale più grande. Ad esempio, SSE a 16 byte richiede ancora un allineamento di 16 byte su entrambi x86 e x64. (Salvo espliciti carichi disallineati/negozi)
Così, in breve, no, non c'è bisogno di preoccuparsi per i dati di allineamento. Il linguaggio e il compilatore si impegnano a fondo per impedirti di doversene preoccupare.
Quindi limitati a qualsiasi tipo di dati sia più adatto a te.
Ci sono un sacco di buone informazioni disponibili qui: Performance 32 bit vs. 64 bit arithmetic
ancora più informazioni https://superuser.com/questions/56540/32-bit-vs-64-bit-systems, qualora la soluzione sostiene di aver visto il peggio rallentare al 5% (da un punto di vista dell'applicazione, non singole operazioni).
La risposta breve è no, non si verificherà un calo di prestazioni.
Le CPU x86 a 64 bit sono ancora fortemente ottimizzate per una manipolazione efficiente dei valori a 32 bit. Anche nei sistemi operativi a 64 bit, l'accesso ai valori a 32 bit è almeno altrettanto rapido dell'accesso ai valori a 64 bit. In pratica, sarà effettivamente più veloce perché vengono consumati meno spazio nella cache e larghezza di banda della memoria.
Ogni volta che si accede a una posizione di memoria, un'intera riga della cache viene letta nella cache L1 e qualsiasi accesso successivo a qualsiasi elemento della linea è il più veloce possibile. A meno che l'accesso a 32 bit non attraversi una linea di cache (che non avverrà se si trova su un allineamento a 32 bit) sarà veloce quanto un accesso a 64 bit.
Non proprio. L'accesso a 1 valore sarà lo stesso. Se accedete a * un altro * valore a 32 bit che si trova nella stessa riga della cache, sarà già lì - lo dichiarate persino con "successivo ...". L'utilizzo di dimensioni di dati più piccole è generalmente più favorevole alla cache a causa del caricamento di più elementi di dati per riga della cache. – phkahler
- 1. Prestazioni di numeri interi a 32 bit in un ambiente a 64 bit (C++)
- 2. Istruzione SSE per sommare interi 32 bit a 64 bit
- 3. Conversione di numeri interi senza segno a 32 bit (big endian) a lungo e indietro
- 4. Array di stringhe a una raccolta di numeri interi?
- 5. come dividere a 64 bit integer a due interi a 32 bit
- 6. Imballaggio di bit di array di numeri interi
- 7. Esiste un modo per eseguire programmi a 64 bit su un computer a 32 bit?
- 8. EDSAC - Numeri interi a 17 bit e 35 bit
- 9. Lettura a 16 bit da un registro a 32 bit
- 10. Efficienza su una piattaforma a 64 bit: puntatore vs indicizzazione di array a 32 bit
- 11. prestazioni a 32 bit vs 64 bit aritmetica
- 12. Utilizzo di una DLL a 32 bit in un processo a 64 bit tramite COM
- 13. Elementi intrinseci SSE: Converti i float a 32 bit in interi a 8 bit UNSIGNED
- 14. Mappare un float a 32 bit su un intero a 32 bit
- 15. windows 7 PATH errato a 64 bit durante il caricamento di una libreria a 32 bit per 32 bit exe
- 16. prestazioni a virgola mobile a 32 bit rispetto a 64 bit
- 17. Cross-over due interi bit a bit
- 18. Casting un array di interi a una matrice di enumerazioni
- 19. Aggiunta di numeri a 64 bit utilizzando aritmetica a 32 bit
- 20. Vettore di doppio bit più veloce a 64 bit rispetto a un vettore di int non firmato a 32 bit?
- 21. Istruzioni di caricamento in attesa a 32 bit IR (architettura a 32 bit in stile RISC)
- 22. Esiste un modo per simulare operazioni bit a bit su interi per _m256 tipi su AVX?
- 23. Operazioni bit a bit a 48 bit in Javascript?
- 24. Operatore bit a bit per ottenere byte da 32 bit
- 25. Accesso a file da 2,3,4 GB in processo a 32 bit su Windows a 64 bit (o 32 bit)
- 26. JavaScript: convertire un intero 52-bit per interi 20-bit e 32-bit
- 27. Come genrate una maschera di bit in bianco e nero per una bitmap a 32 bit
- 28. Perché __sync_add_and_fetch funziona per una variabile a 64 bit su un sistema a 32 bit?
- 29. Numeri interi a larghezza fissa in C++
- 30. Un processo a 32 bit può accedere a più memoria su un sistema operativo Windows a 64 bit?
Se si desidera che i numeri interi a larghezza fissa provino: 'int32_t' in' ' –
Mysticial
' int' è il tipo naturale per l'architettura. A meno che tu non abbia una buona ragione per usare un tipo diverso, non farlo. –
@PeteBecker No, non lo è. 'int' è ancora solo a 32 bit sulla maggior parte dei sistemi oggi. – Mysticial