2010-05-17 17 views

risposta

27

Un oggetto che è "8 byte allineati" è memorizzato in un indirizzo di memoria che è un multiplo di 8.

Molte CPU caricherà solo alcuni tipi di dati da posizioni allineate; su altre CPU tale accesso è solo più veloce. Ci sono anche molti altri possibili motivi per usare l'allineamento della memoria - senza vedere il codice è difficile dire perché.


accesso Allineato è più veloce perché il bus esterno di memoria non è un singolo byte ampio - è tipicamente largo 4 o 8 byte (se non maggiore). Ciò significa che la CPU non recupera un singolo byte alla volta: recupera 4 o 8 byte a partire dall'indirizzo richiesto. Di conseguenza, i 2 o 3 bit meno significativi dell'indirizzo di memoria non vengono effettivamente inviati dalla CPU: la memoria esterna può essere letta o scritta solo su indirizzi multipli della larghezza del bus. Se si richiedesse un byte all'indirizzo "9", la CPU chiedeva effettivamente alla memoria il blocco di byte che inizia all'indirizzo 8 e carica il secondo nel registro (scartando gli altri).

Questo implica che un accesso disallineato può richiedere due legge dalla memoria: Se chiedete 8 byte con inizio alle indirizzo 9, la CPU deve prendere le 8 byte a partire dall'indirizzo 8, nonché le 8 byte con inizio alle indirizzo 16, quindi mascherare i byte che si desidera. D'altra parte, se chiedi gli 8 byte che iniziano all'indirizzo 8, è necessario solo un singolo recupero. Alcune CPU non eseguono nemmeno un carico disallineato, semplicemente sollevano un'eccezione (o caricano anche in modo silenzioso i dati errati!).

+1

significa che se la prima posizione è 0x0000 la seconda posizione sarà 0x0008 .. quali sono i vantaggi di questi 8 byte di tipo allineato? –

4

"X byte allineati" significa che l'indirizzo di base dei dati deve essere un multiplo di X. Può essere utilizzato per l'utilizzo di hardware speciale come un DMA in alcuni hardware speciali, per un accesso più rapido da parte della CPU, ecc. ...

È il caso del processore di cella in cui i dati devono essere allineati di 16 byte per poter essere copiati dal/coprocessore.

+0

ok. ma come l'esecuzione diventa più veloce quando è di X byte di allineati? A causa di un calcolo più semplice dell'indirizzo di memoria o di qualche altra cosa? Inoltre c'è qualche allineamento per le funzioni? /Kanu__ –

+0

Beh, dipende dalla tua architettura. Ad esempio, se si dispone di un'architettura a 32 bit e si può accedere alla memoria solo per 4 byte per un indirizzo multiplo di 4 (4 byte allineati), sarebbe più efficiente adattare i dati a 4 byte (ad es .: intero) in esso . Ti permetterebbe di accedervi in ​​una memoria letta invece di due se non è allineata. (NOTA: Questo caso è ipotetico) – Phong

+0

Generalmente il tuo compilatore fa tutto l'ottimizzazione, quindi non devi gestirlo. In alcuni casi MOLTO specifici, potrebbe essere necessario specificarlo personalmente (ad es. Processore della cella o hardware del progetto). Se stai lavorando su un'architettura tradizionale, non hai davvero bisogno di farlo. – Phong

8

L'allineamento della memoria è importante per le prestazioni in diversi modi. Ha un motivo relativo all'hardware. Dagli anni '80 c'è una differenza nel tempo di accesso tra CPU e memoria. La velocità del processore cresce più rapidamente della velocità della memoria. Questa differenza sta diventando sempre più grande nel tempo (per fare un esempio: su Apple II la CPU era a 1.023 MHz, la memoria era al doppio di quella frequenza, 1 ciclo per la CPU, 1 ciclo per il video. a circa 3GHz sulla CPU, con una memoria a soli 400 MHz). Una soluzione al problema di una sempre minore memoria, è quella di accedervi su bus sempre più ampi, invece di accedere a 1 byte alla volta, la CPU leggerà una parola a 64 bit di larghezza dalla memoria. Ciò significa che anche se si legge 1 byte dalla memoria, il bus consegnerà un'intera parola a 64 bit (8 byte). La memoria avrà queste unità da 8 byte all'indirizzo 0, 8, 16, 24, 32, 40 ecc. Un multiplo di 8. Se si accede, ad esempio una parola da 8 byte all'indirizzo 4, l'hardware dovrà leggere la parola all'indirizzo 0, mascherare i 4 byte alti di quella parola, quindi leggere la parola all'indirizzo 8, mascherare la parte bassa di quella parola, combinarla con la prima metà e assegnarla al registro. Come puoi vedere un'operazione piuttosto complicata (quindi lenta). Questo è il primo motivo per cui si preferisce l'accesso alla memoria allineato. Darò un'altra ragione in 2 ore.

+0

Grazie. Buono. Sto aspettando il tuo secondo motivo. –

+0

Mi dispiace, l'ho dimenticato. Non c'è una seconda ragione. Al momento in cui l'ho scritto, ho pensato agli array e alle dimensioni degli elementi dell'array, che non è strettamente relativo all'allineamento. Ma le dimensioni che sono potenze di 2, hanno il vantaggio di essere facilmente calcolate. Alcune CPU hanno persino modalità di indirizzamento che rendono tale moltiplicazione per 2, 4 o 8 direttamente senza penalità (x86 e 68020 per esempio). Ma come detto, non ha molto a che fare con gli allineamenti. –

+0

esattamente. Grazie per le informazioni. /renjith_g –

0

se i dati di memoria sono allineati a 8 byte, significa:
sizeof(the_data) % 8 == 0.
generalmente in linguaggio C, se una struttura viene proposta con 8 byte allineati, la sua dimensione deve essere la moltiplicazione di 8, e se non lo è, il padding è richiesto manualmente o dal compilatore.alcuni compilatori forniscono direttive per creare una struttura allineata con n byte, per VC, è #prgama pack(8) e per gcc, è __attribute__((aligned(8))).

+0

Quindi diciamo che si sta lavorando con SSE (128 bit) su dati Floating Point (Single). Eppure la lunghezza dei dati è 38. Il processo moltiplica i dati per una costante. Cosa dovrebbe fare lo sviluppatore per gestire questo? – Royi

Problemi correlati