2012-09-16 10 views
7

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?

+1

Se si desidera che i numeri interi a larghezza fissa provino: 'int32_t' in' ' – Mysticial

+0

' int' è il tipo naturale per l'architettura. A meno che tu non abbia una buona ragione per usare un tipo diverso, non farlo. –

+0

@PeteBecker No, non lo è. 'int' è ancora solo a 32 bit sulla maggior parte dei sistemi oggi. – Mysticial

risposta

7

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.

3

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.

1

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.

+0

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

Problemi correlati