(non so cosa significhi esecuzione dinamica , ma ho familiarità con l'idea di esecuzione fuori-ordinazione )
Mentre il x86-64 set di istruzioni è (quasi) uguale tra processori recentissimi e quelli di cinque anni fa (forse con l'eccezione delle estensioni di istruzioni vettoriali come AVX-512 ), le regole di ottimizzazione sono cambiate.
In altre parole, un codice macchina programma ( eseguibile o libreria ) generato e ottimizzato per un i3770 da cinque anni fa non sarà il miglior codice ottimizzato per un recente AMD Ryzen (ma sarà in grado di girare su quella ricompensa Ryzen 1800x senza , dal momento che usa lo stesso set di istruzioni ). Quindi il codice macchina ottimizzato per Ryzen non è il massimo per i3770 e viceversa.
Ma i compilatori lo sanno e possono generare il codice ottimizzato per un particolare marchio di CPU. Quindi generano un codice su misura per caratteristiche specifiche del tuo particolare processore (ad es. Dimensioni e organizzazione della cache della CPU , configurazione e comportamento del suo predittore di ramo , esecuzione fuori-ordinazione & pipeline , etc etc etc ...)
Quindi è necessario aggiornare il compilatore (potrebbe essere importante ottenere una versione recente ) e passare ad esso le opzioni appropriate.
Per GCC , leggi ottimizzazione delle opzioni sezione e anche la sezione x86 .
Raccomando (per dritto , non incrociato , compilazione) compilazione con gcc -Wall -O2 -march=native
sulla stessa macchina di quella che esegue il codice. Se vuoi compilare un binario in grado di funzionare su diversi marchi, devi essere più attento.
BTW, alcuni compilatori (incluso GCC ...) forniscono extra builtins (e anche builtin specifici x86 ) per sfruttare le funzionalità del processore non visibili al codice C; ad esempio __builtin_prefetch
(per esplicito prefetching della cache della CPU), ma vedi questo che suggerisce di evitare di usarli in generale (perché i compilatori sono spesso - ma non sempre - ottimizzano abbastanza bene).
In pratica, i compilatori recenti fanno un buon lavoro sulle ottimizzazioni, quindi non penso che valga la pena di aggiustare il codice manualmente per ottimizzarlo ancora di più, ma YMMV. Potrebbe valere la pena di ricompilare il codice sorgente (o alcuni software libero ) durante l'aggiornamento del processore, ma di solito vincerai solo poche percentuali di rendimento.
(IMHO, cache località conta un lotto di più, poiché un importante -L3- cache miss impiega tutto il tempo necessario per eseguire più di un centinaio di istruzioni macchina, ad esempio preferisce i vettori alle liste collegate