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
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