Da quello che sembra, un processore a 64 bit significa allineamento a 64 bit, il che significa che se in esso è presente un Unicode utf-8, ogni chunk di 8 bit occupa 64 bit di spazio. Questo non ha molto senso, quindi penso di dover fare un po 'di più per capire esattamente come funziona l'allineamento della cache .
Ma grazie a questa ottima risposta a Scopo dell'allineamento della memoria vedo come l'allineamento è utile, quindi mi piacerebbe sapere cosa significherebbe in pratica implementare allineamento a un word e a riga cache , insieme.
Ad esempio, prendi unicode codificato in utf-8. Se dovessi archiviarlo in memoria e accedervi in modo più efficiente in termini di allineamento delle parole e allineamento della linea della cache, mi chiedevo cosa sarebbe / cosa intendo.
Alcuni esempi sono:
- Accesso a singoli personaggi.
- Accesso a grandi blocchi di testo.
Da come sembra, su una macchina a 64 bit, dovresti farlo (sono ancora un po 'confuso su come applicarlo, che è la ragione della domanda), dove le lettere sarebbero codificate in Unicode in ascii (per il semplice caso di utf-8, usando solo ASCII):
a b a b a b ...
Sembrerebbe:
01100001 01100010 01100001 01100010 01100001 01100010 ...
O più specificamente:
011000010110001001100001011000100110000101100010...
Per aggiungere più personaggi al mix (aggiungendo newline per la leggibilità, non aggiungendolo ai dati):
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
...
abcdefghijklmnopqrstuvwxyz
Questo è 26 x n, dove diciamo che n è 100, quindi 2600 caratteri a 8 bit (2600 byte) impilati uno accanto all'altro. Dalla mia comprensione, si potrebbe dire che questi sono "allineati a 8 bit" o "allineati a 1 byte".
Ma ora ci sono due problemi:
- Allineamento delle parole (e come capire quale sia l'allineamento delle parole della tua macchina).
- Allineamento della linea cache (presupponendo che tutte le macchine a 64 bit utilizzino 64 byte come allineamento della linea cache, che è quello che ho visto dal web).
Dato che abbiamo 2600 byte, potremmo teoricamente avere 2600/64 = 40,625 ≈ 41 blocchi allineati alla linea della cache, e se la dimensione della parola era di 2 byte, quindi 2600/2 = 1300 blocchi di parole allineati.
Ora mi sono perso, non vedo come dovremmo accedere o in alternativa organizzare i dati in modo che sfrutti queste 2 condizioni di allineamento (allineamento riga di parole e cache). Mi sento già come se avessi intenzione di creare più confusione di quanto sia necessario per la domanda se provassi a spiegare di più.
Quindi la mia domanda è, come (a) organizzare questa stringa utf-8 in memoria in modo che (b) tu possa approfittare delle 2 condizioni di allineamento, mentre (c) acceda ai dati (singoli caratteri o blocchi tra la dimensione della parola e la dimensione della linea della cache, o o blocchi più grandi della dimensione della linea della cache). Non so davvero cosa significhi "accedere a più di 64 bit alla volta", poiché i registri sono limitati in questo modo. Quindi, di nuovo, non capisco come funziona l'allineamento della cache, e interessa sapere come allineare correttamente entrambe le condizioni in questo caso come esempio pratico.
Sidenote: Non ho bisogno di sapere esattamente come farlo per x86, come quali istruzioni usare e cosa no (a meno che non sia facile / diretto da descrivere). Sto solo cercando ad un alto livello come funziona, usando x86 come punto di partenza.
Un altro modo in cui provo a guardare questo viene dopo la lettura :
- Align 8-bit data at any address [don't understand this]
- Align 16-bit data to be contained within an aligned four-byte word
- Align 32-bit data so that its base address is a multiple of four
- Align 64-bit data so that its base address is a multiple of eight
- Align 80-bit data so that its base address is a multiple of sixteen
- Align 128-bit data so that its base address is a multiple of sixteen
Non seguire esattamente, ma per i dati a 8-bit diciamo che ci allineamo con una parola di 4 byte. Ciò significa che sarebbe simile a questo:
<letter> <empty> <empty> <empty> <letter> <empty> <empty> <empty> ...
a---b---a---b---...
Sembra un sacco di spazio sprecato. Ciò significherebbe che il testo normale richiede 4x la dimensione effettiva del testo da memorizzare in memoria, il che non sembra corretto.
Infine, quando parlano di come se non si allinea ai limiti, recupererà i dati extra, continuo a pensare "non lo farà comunque per lo spazio vuoto? ". Non vedo come se la memoria è piena o non in un punto specifico che recuperare alcuni dati aggiuntivi sarebbe dannoso. Vale a dire, diciamo che i dati erano così:
abcdef...
E allineati a 4 byte. Questo significa accedere a a
verremmo effettivamente recuperando abcd
, per recuperare b
verrebbe anche recuperato abcd
, ecc. Ma non vedo come sia diverso dal recupero di a---
in questo Layout:
a---b---c---d---e---f---...