Accesso di memoria e Prefetcher

La presentazione dei nuovi processori Intel Core i7 è alle porte. In attesa dei benchmark, iniziamo con il dare un'occhiata all'architettura su cui saranno basati: Nehalem.

Avatar di Andrea Ferrario

a cura di Andrea Ferrario

Editor in Chief

Accesso di memoria e Prefetcher

Accesso alla memoria ottimizzato

Con l'architettura Core, l'accesso di memoria era soggetto a diverse restrizioni in termini di prestazioni. Il processore era ottimizzato per un accesso agli indirizzi di memoria che erano allineati in confini di 64-byte - la grandezza di una linea cache. Non solo l'accesso era lento per i dati non allineati, ma l'esecuzione di un carico non allineato o di un'istruzione immagazzinata era più pesante rispetto a quello per le istruzioni allineate, nonostante l'attuale allineamento dei dati nella memoria. Questo perché le istruzioni generavano diverse µops da amministrare per i decoder, che riducevano il throughput di questo tipo d'istruzione. Come risultato, i compilatori evitavano di generare questo tipo d'istruzione, sostituendo le sequenze d'istruzioni meno impegnative.

Così, le letture della memoria che sovrapponevano due linee di cache avevano un impatto sulle prestazioni pari a circa 12 cicli, rispetto ai 10 per la scrittura. Gli ingegneri Intel hanno ottimizzato questi accessi per renderli più veloci. Prima di tutto, non c'è un impatto sulle prestazioni per l'uso di versioni non allineate di istruzioni di carico/immagazzinamento, nei casi dove i dati sono allineati in memoria. In altri casi, Intel ha ottimizzato questi accessi per ridurre l'impatto prestazionale rispetto all'architettura Core.

Più Prefetcher lavorano in modo più efficiente

Uno dei punti di orgoglio di Intel con l'architettura Core erano i prefetcher hardware. Come sapete, un prefetch è un meccanismo che osserva l'accesso alla memoria e prova ad anticipare i dati che serviranno nei cicli seguenti. Il punto è far tornare i dati alla cache, dove saranno accessibili più velocemente al processore, massimizzando il bandwidth, usandolo quando il processore non ne ha bisogno.

Questa tecnica produce risultati rimarcabili con molte applicazioni desktop, ma nel mondo server il risultato porta spesso a una perdita di prestazione. Ci sono molte ragioni per questa inefficienza. Prima di tutto, gli accessi alla memoria sono spesso meno facili da predire con le applicazioni server. Gli accessi al database, per esempio, non sono lineari - quando si accede a un dato in memoria, il dato adiacente potrebbe non essere necessariamente chiamato in seguito. Questo limita l'efficacia dei prefetcher. Tuttavia, il problema principale riguarda il bandwidth di memoria nelle configurazioni multi-socket. Come detto, c'è già un collo di bottiglia tra i processori, e i prefetcher aggiungono maggior pressione a questo livello. Quando un microprocessore non accede alla memoria, i prefetcher entrano in gioco usando il bandwidth che credono sia disponibile. Non hanno modo di sapere se, a un certo punto, un altro processore può aver bisogno del bandwidth. Questo significa che i prefetcher potrebbero togliere a un processore il bandwidth disponibile. Per risolvere il problema, Intel non aveva migliore soluzione che offrire la possibilità di disabilitare i prefetcher in queste situazioni - una risposta che non ha soddisfatto.

Intel afferma che ora il problema è stato risolto, ma non ha fornito dettagli sul modo in cui operano i nuovi algoritmi di prefetch; tutto ciò che ha detto, è che non sarà più necessario disabilitarli per le configurazioni server. Anche se Intel non ha cambiato niente, il guadagno derivante dalla nuova organizzazione di memoria e il bandwidth maggiore risultante dovrebbero limitare ogni impatto negativo dei prefetcher.