2013-02-12 8 views
5

Perché abbiamo bisogno di memoria allineata per SSE/AVX?Relazione tra vettorizzazione SSE e allineamento memoria

Una delle risposte che ottengo spesso è il carico di memoria allineato è molto più veloce del carico di memoria non allineato. Quindi, perché questo carico di memoria allineato è molto più veloce di un carico di memoria non allineato?

risposta

9

Questo non è solo specifico per SSE (o anche x86). Sulla maggior parte delle architetture, i carichi e i negozi devono essere allineati in modo naturale altrimenti (a) generano un'eccezione o (b) necessitano di due o più cicli più un po 'di correzione per gestire il carico disallineato/il negozio in modo trasparente. Su x86 (b) è vero per i tipi di dati < 16 byte ma (a) è vero per i tipi di dati SSE a meno che non si utilizzino esplicitamente versioni disallineate delle istruzioni di carico/archivio che possono gestire dati non allineati.

Ci si potrebbe chiedere: perché non utilizzare solo le versioni disallineate di queste istruzioni di caricamento/immagazzinamento SSE indipendentemente dall'allineamento? La risposta è che queste istruzioni sono in genere molto più lente delle loro controparti allineate poiché generalmente si comportano come per (b) sopra, il che le rende in genere 2x o più lente, a parte le recenti CPU Intel come Core i7, dove la penalità è molto più piccola , ma non insignificante.

+2

E tenere presente che anche su core moderni in cui gli accessi disallineati sono generalmente veloci, gli accessi alle pagine sono ancora piuttosto lenti. Se il buffer è abbastanza grande e disallineato, conterrà incroci di pagine. –

+1

Vero, e il superamento dei limiti della linea di cache a causa di carichi disallineati può comportare un ingombro della cache più ampio che può anche avere un impatto negativo sulle prestazioni. –

+1

Attraversare le pagine è anche peggio ... – Mysticial