Costrutti di linguaggio di programmazione per l'ottimizzazione della cache?

7

L'ottimizzazione chiara dell'utilizzo della cache è destinata a migliorare l'efficienza del mio programma. Sorprendentemente, non vedo che troppi linguaggi di programmazione abbiano effettivamente questo tipo di funzionalità. Quindi, ecco la mia domanda:

  1. Che tipo di costrutti linguistici hai visto che aiutano a migliorare l'utilizzo della cache?
  2. Come innovare sull'utilizzo della cache dato che la maggior parte dei sistemi non rivela facilmente cose come la loro dimensione della cache L1 facilmente? (Windows ha API o forse / proc / cpuinfo su Linux, ma sto cercando qualcosa di più semplice per lo sviluppatore intermedio)
posta Fanatic23 05.12.2010 - 06:14
fonte

2 risposte

4

Questo è solo un elenco off-the-head.

Concetti

  • Località spaziale
  • Località temporale.
  • Modelli di accesso alla memoria facilmente prevedibili.
    • Ad esempio, la lettura / scrittura di megabyte di dati in sequenza non è affatto inefficiente, poiché la CPU può prevedere il prossimo indirizzo e leggere automaticamente in anticipo.

Programmazione dei costrutti del linguaggio.

  • Direttive di allineamento dei dati.
  • Passaggio tra array di strutture e strutture di array.
  • Contenitori di dati vettorizzati forniti da librerie ad alte prestazioni.

Il compilatore ha già svolto parte del lavoro per te. Ad esempio, i gruppi di funzioni strettamente correlati (ad esempio, che potrebbero essere chiamati in sequenza successiva) verranno compilati in istruzioni binarie e quindi archiviati l'uno vicino all'altro, in modo che risiedano all'interno dello stesso blocco di pagine 4KB. Non c'è semplicemente alcun modo per uno sviluppatore di soddisfare tali dettagli manualmente.

Per i linguaggi compilati nativi, le variabili locali sono memorizzate nello stack e l'area più vicina alla posizione dello stack corrente è probabile che venga memorizzata nella cache. Se una grande variabile (diversi KB o più) viene allocata dallo stack, la CPU potrebbe dover rimuovere qualcos'altro dalla cache per fare spazio. D'altra parte, se la grande variabile viene usata molto frequentemente, allora l'allocazione dallo stack può essere giustificata.

    
risposta data 05.12.2010 - 09:33
fonte
0

non c'è una risposta banale qui. in un sistema multiprocessing (ad esempio qualsiasi OS moderno), non è possibile fare molte ipotesi sullo stato della memoria virtuale. puoi comunque fare alcune osservazioni generali riguardo alle strutture dati. le tecniche di hashing possono consentire di sviluppare un'affinità più affidabile tra i dati e l'archiviazione, mentre le strutture di dati come gli alberi tenderanno a impiegare compensazioni che degradano l'efficacia del caching ... MA prendi tutto questo con un enorme avvertimento ... profilando i benefici di una tecnica piuttosto che un'altra sarà estremamente difficile e specifica per la propria architettura e gerarchia di memoria.

la risposta più breve qui è per lo "sviluppatore intermedio", è molto meglio usare librerie ben testate che hanno limiti prestazionali chiaramente definiti e modelli di consumo della memoria ben compresi. cercare di ottimizzare il caching su una piattaforma hardware specifica sembrerebbe essere un'ultima soluzione dolorosa per i problemi più difficili.

    
risposta data 05.12.2010 - 06:29
fonte

Leggi altre domande sui tag