2013-03-24 5 views
6

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

+8

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. –

+0

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. –

+1

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

risposta

4

per allineare correttamente diverse variabili è necessario utilizzare un aggregato, perché il layout per le variabili automatiche non è definito. Non riesco a trovare nulla nello standard C++ 11 che dice che le variabili con lo storage automatico devono essere allocate nello stack nello stesso ordine in cui sono definite. La sezione 5.9 dello standard insiste sul fatto che solo alcuni tipi di confronti tra puntatori sono definiti, e il confronto tra variabili con la memorizzazione automatica non è tra quelli elencati come definiti.