2016-04-26 21 views
6

Recentemente ho fatto un po 'di scavo nella memoria e come usarlo correttamente. Ovviamente, sono incappato anche sul prefetching e su come posso rendere la vita più facile per la CPU.Esiste un modo per "riscaldare" un processo?

Ho eseguito alcuni benchmark per vedere i reali vantaggi di una corretta archiviazione/accesso di dati e istruzioni. Questi benchmark hanno mostrato non solo i benefici attesi nell'aiutare il prefetch della CPU, ma ha anche dimostrato che il prefetching velocizza il processo anche durante il runtime. Dopo circa 100 cicli di programma, la CPU sembra averlo capito e ha ottimizzato la cache di conseguenza. Questo mi consente di risparmiare fino a 200.000 tick per ciclo, il numero scende da circa 750.000 a 550.000. Ho ottenuto questi numeri usando qTestLib.

Ora per la domanda: C'è un modo sicuro per utilizzare questa runtime-accelerazione, lasciandola riscaldare, per così dire? O non si dovrebbe calcolare questo in tutto e basta costruire codice più veloce dall'inizio?

+0

Se si beneficia principalmente di una previsione di branca migliore, è possibile utilizzare l'ottimizzazione guidata profilo per suggerimenti migliori e codice ottimizzato. – Hasturkun

+1

Puoi essere più specifico su cosa esattamente hai benchmarkato? A che livello di cache stai parlando di riscaldamento? –

+0

il benchmark riguarda la memorizzazione dei dati in memoria. nel caso di questo confrontando std :: vector con QList. La mia ipotesi migliore sull'ottimizzazione automatica della cache è, il TLB impara quali indirizzi non sfrattare. – FruitSokrat

risposta

5

Prima di tutto, non c'è in genere alcun guadagno nel tentativo di riscaldare un processo prima dell'esecuzione normale: ciò accelera solo i primi 100 cicli di programma nel tuo caso, ottenendo un totale di meno di 20000 tick. Questo è molto meno dei 75000 tick che dovresti investire nel riscaldamento.

In secondo luogo, tutti questi guadagni dal riscaldamento di un processo/cache/tutto ciò che è piuttosto fragile. C'è un numero di eventi che distruggono l'effetto di riscaldamento che generalmente non controlli. Principalmente questi provengono dal tuo processo di non essere soli sul sistema. Uno switch di processo può comportarsi in modo simile ad un flush di cache asincrono, e ogni volta che il kernel ha bisogno di una pagina di memoria, può rilasciare una pagina dalla cache del disco.

Poiché i fattori rendono il tempo di calcolo abbastanza imprevedibile, devono essere controllati durante l'esecuzione di benchmark che dovrebbero produrre risultati di qualsiasi affidabilità. Oltre a ciò, questi effetti sono per lo più ignorati.

-2

È importante notare che mantenere la CPU occupata non è necessariamente una cosa negativa. Idealmente, vuoi che la tua CPU funzioni ovunque dal 60% al 100% perché ciò significa che il tuo computer sta effettivamente "funzionando". Certo, se c'è un processo di cui non si è a conoscenza e il processo sta prendendo i cicli della CPU, non va bene.

In risposta alla tua domanda, la macchina di solito si occupa di questo.

+1

È una brutta cosa per le moderne CPU. Più possono dormire, più possono salire quando c'è lavoro da fare. Dormire aumenta il budget di alimentazione/raffreddamento per "turbo". Intel Skylake lo fa meglio delle generazioni precedenti, e in effetti vede miglioramenti in alcuni benchmark con carico esplosivo (come i benchmark Javascript) a causa di ciò. Per non parlare del fatto che sprecare molta energia per un piccolo guadagno perf è davvero pessimo su un dispositivo alimentato a batteria, o comunque in cui l'energia/calore è importante. –

Problemi correlati