Uso di nuovi strumenti di allineamento C++ 11 Volevo essere sicuro che una serie di variabili temporanee (stack) giacesse su una riga della cache. Il mio primo tentativo ingenuo fu il seguente:Variabili stack allineate alla cache
int main() {
alignas(64) int a; // 0x7fffc58aac80, properly aligned at 64
int b; // 0x7fffc58aac7c
int c; // 0x7fffc58aac78
return 0;
}
Stupido! Stack non assegna le variabili in questo modo, pertanto a
si troverà su una linea cache diversa da b
e c
.
Ciò significa che l'unico modo per allineare correttamente più variabili è tramite l'?
struct alignas(64) Abc {
int x;
int y;
int z;
};
int main() {
Abc foo;
// x 0x7fff40c2d3c0 (aligned at 64)
// y 0x7fff40c2d3c4
// z 0x7fff40c2d3c8
return 0;
}
Compiler: Clang 3.2
Pensi davvero che avere tutte queste variabili nella stessa riga della cache migliorerà le prestazioni? Le probabilità sono piuttosto buone che lo stack sia nella cache. –
Potrebbe * avere un impatto se queste variabili devono essere condivise tra più core, in modo tale che qualsiasi core voglia scrivere su questi, deve utilizzare tutte e tre le variabili alla volta. Se tutti si trovano nella stessa riga della cache e gli accessi a queste variabili sono rari, il traffico di coerenza verrebbe ridotto. Tuttavia non è garantito che la linea possa essere invalidata tra la lettura di due variabili nella stessa riga. –
Le moderne compilazioni non mantengono nemmeno le variabili di stack in una posizione fissa (a meno che non si prendano il loro indirizzo, ovviamente). Quindi se 'a' e' b' hanno condiviso una linea di cache, dopo una scrittura su uno che può cambiare. (Questo è tipico per l'ottimizzazione di Assegnazione singola statica) – MSalters