La legge di Amdahl, che ha preso il nome del progettista di computerGene Amdahl, viene usata per trovare il miglioramento atteso massimo in una architettura di calcolatori o in un sistema informatico quando vengono migliorate solo alcune parti del sistema[1][2]. Nella sua forma più generale può essere espressa come[3]:
"Il miglioramento delle prestazioni di un sistema che si può ottenere ottimizzando una certa parte del sistema è limitato dalla frazione di tempo in cui tale parte è effettivamente utilizzata"
che può essere ulteriormente semplificata nella pratica regola[4]:
"Make the common case fast" (rendi veloce il caso più frequente)
Ad esempio: se per percorrere un tragitto si impiegano 10 minuti in automobile più 40 minuti a piedi, non ha molto senso acquistare un'automobile più veloce.
La legge di Amdahl viene usata spesso nell'informatica parallela per predire l'aumento massimo teorico di velocità che si ottiene usando più processori. Nell'ambito dei sistemi software può essere interpretata in modo più tecnico, ma il significato basilare è che l'algoritmo decide l'aumento di velocità, non il numero di processori. Prima o poi si raggiungerà un punto in cui non si potrà parallelizzare ulteriormente l'algoritmo[5][6].
La legge di Amdahl è una dimostrazione della legge dei rendimenti decrescenti: anche se si potesse aumentare la velocità di una parte di un computer di cento o più volte, se tale parte influisce solamente sul 12% dell'elaborazione complessiva, al massimo l'accelerazione può essere di un fattore .
Più tecnicamente, la legge riguarda l'aumento di velocità ottenibile con un miglioramento a un'operazione che influisce per un P sul complesso e dove il miglioramento riduce il tempo di calcolo di un fattore S[7]. (Per esempio, se il calcolo da migliorare influisce per il 30% del calcolo, P sarà 0.3; se il miglioramento raddoppia la velocità della porzione modificata, S sarà 2.)[8][9]. La legge di Amdahl afferma che l'aumento di velocità complessivo prodotto dal miglioramento sarà[5]
.
Per vedere come si arriva a questa formula, supponiamo che il tempo di esecuzione del vecchio calcolo sia 1, in una data unità di tempo. Il tempo di esecuzione del nuovo calcolo sarà il tempo impiegato per la frazione non migliorata (che è 1 − P) più il tempo impiegato dalla frazione migliorata. Il tempo impiegato dalla parte del calcolo migliorata è il tempo di esecuzione della parte non ancora migliorata diviso per il fattore di accelerazione, ossia P/S. L'aumento finale di velocità è calcolato dividendo il vecchio tempo di esecuzione per il nuovo tempo di esecuzione, ottenendo così la formula sopra indicata.
Un altro esempio. Abbiamo un compito scomponibile nelle seguenti quattro parti: P1 = 0,11 ossia 11%, P2 = 0,18 ossia 18%, P3 = 0,23 ossia 23%, P4 = 0,48 ossia 48%, aventi come somma 100%. Poi, non miglioriamo P1, perciò S1 = 1 ossia 100%, acceleriamo P2 di un fattore 5, perciò S2 = 5 ossia 500%, acceleriamo P3 di un fattore 20, perciò S3 = 20 ossia 2000%, e acceleriamo P4 di un fattore 1,6, perciò S4 = 1,6 ossia 160%. Usando la formula , troviamo che il tempo di esecuzione è ossia un po' meno della metà del tempo di esecuzione originale che sappiamo essere 1. Perciò l'accelerazione complessiva è , ossia, usando la formula , poco più del doppio della velocità originale. Si noti come le accelerazioni 20x e 5x non hanno un grande effetto sull'accelerazione e sul tempo di esecuzione complessivi, dato che oltre la metà del compito viene accelerato solo di un fattore 1,6 o non viene accelerato affatto[10][11].
Parallelismo
Nel caso speciale del parallelismo, la legge di Amdahl afferma che se F è la frazione di un calcolo che è parallelizzabile (cioè che può beneficiare dal parallelismo), e (1 − F) è la frazione che non può essere parallelizzata, allora l'aumento massimo di velocità che si può ottenere usando N processori è
.
Al limite, al tendere di N all'infinito, l'accelerazione tende a 1/(1-F). In pratica, il rapporto prestazioni/prezzo scende rapidamente al crescere di N, dato che F/N diventa piccolo rispetto a (1-F).
Per fare un esempio, se (1-F) è solamente il 10%, la velocità del calcolo può essere al massimo decuplicata, indipendentemente dal valore di N. Per questa ragione, il calcolo parallelo è utile solamente o per piccoli numeri di processori o per problemi con valori molto bassi di (1-F). Gran parte della ricerca sul calcolo parallelo consiste nel tentativo di ridurre (1-F) al valore più piccolo possibile[12].