LIMITE TEORICO DELLE PRESTAZIONI DI 2 CPU
Roberto A. Foglietta, rilasciato sotto LGPL
-- DOCUMENTO IN MODIFICA --
|
Commento del diagramma
1) Calcolo di A
2) Calcolo di B
3) Condizione su B
4) Eseguzione di uno dei due flussi
5) Fine
Per eseguire S1 o S2 debbo avere calcolato il valore A
Per eseguire la condizione su B devo eseguire il calcolo su B
|
Calcolo il tempo impiegato da una CPU per eseguire il programma:
T(1cpu) = T(cA) + T(cB) + p(S1)T(S1) + p(S2)T(S2)
= T(cA) + T(cB) + Tmed(Sx)
Dove T( ) e p( ) sono rispettivamente il tempo impiegato e la probabilità che accada.
Inoltre p(S2) = 1 - p(S1) essendo le due condizioni mutuamente esclusive.
Ora calcolo il tempo impiegato da un doppio processore, ma prima occorre indrodurre alcue considerazioni [nota 1]:
- si suppone che quando due processori eseguano in modo concorrente lo
steso processo essi impieghino meta` tempo di un procesore singolo. Questa
ipotesi e` lecita finche` si vuole indagare se vi sia la possibilita` di
ottimizzare il multi-thread in modo da ottenere una prestazione maggiore del
200% rispetto al singolo processore.
- si semplifica immaginando che le due CPU non debbono concorrere
all´accesso della memoria, dei dischi o di altre risorse si sitema
(valutazione sulla potenza bruta di calcolo).
- si semplifica immaginando che la CPU 1 elabori il calcolo B e la CPU 1
elabori S1 e/o S2 e che una CPU intervenga in aiuto dell´altra solo nel caso
che abbia finito il proprio compito.
Le ultime due ipotesi sono delle maggiorazioni atte a semplificare il calcolo. In definitiva se anche con l'uso di tali maggiorazioni (delle prestazioni) non si supera il limite lineare allora questo è non falsificato (almeno da questi calcoli).
In particolare nelle ipotesi precedenti ho ignorato i seguenti fatti che riducono le prestazioni:
- Le risorse di sistema, come la quantità di RAM, siano più sufficiente per entrambe le CPU.
- Overhead dovuto al riassegnamento dei compiti alle due CPU.
La terza ipotesi è più delicata e contiene due parti separate:
- Si suppone arbitrariamente di poter chiamare un set di istruzioni "processo singolo"
- Il "processo singolo" è eseguibile in modo concorrenziale al 200%
La seconda parte è una maggiorazione introdotta per le medesime ragioni delle altre due.
Mentre la prima parte è una convenzione introdotta con il seguente scopo: "l'intero programma può essere pensato come un processo singolo eseguibile al 200% ma se lo suddivido in maniera intelligente in diverse porzioni e predispongo per le diverse porzioni diversi modi di gestire il multi-thread allora posso ottenere prestazioni superiori".
Facendo uso delle ipotesi sopra dette calcolo il tempo impiegato da un doppio processore
T(2cpu) = T(cA)/2 + T(*)
Il termine T(*) e` diverso a seconda che si impongano delle condizioni su
T(cB), T(S1) e T(S2):
- Nel caso che T(cB) > T(S1) + T(S2) capita che la CPU 2 finisca prima
della CPU 1 ed a questa venga in soccorso per completare il lavoro:
T(2cpu) = T(cA)/2 + T(S1) + T(S2) + [ T(cB) - T(S1) - T(S2) ]/2
- Nel caso che T(cB) = T(S1) + T(S2) capita che la CPU 2 finisca
esattamente quando la CPU 1 e non vi sia alcuna collaborazione:
T(2cpu) = T(cA)/2 + T(S1) + T(S2) = T(cA)/2 + T(cB)
- Nel caso che T(cB) < T(S1) + T(S2) capita che la CPU 1 finisca prima
della CPU 2 a questo punto possono capitare ancora 3 cose:
- la CPU 2 non ha completato entrambi flussi ma ha completato quello
che serve:
T(2cpu) = T(cA)/2 + T(cB)
- la CPU 2 deve completare la sequenza che serve:
T(2cpu) = T(cA)/2 + T(cB) + [ T(cS) - T(cB) ]/2
- la CPU2 deve ancora iniziare il calcolo della sequenza che serve:
T(2cpu) = T(cA)/2 + T(cB) + T(cS)
Appare evidente che la prima di queste tre evenienze e` la piu` favorevole mentre nella terza il lavoro della CPU 2 e` andato totalmente perduto.
Per controllare l´esistenza deil limite teorico del 200% si esegue il controllo del segno sul seguente valore
DT = T(1cpu) - 2 T(2cpu) = T(cA) + T(cB) + Tmed(Sx) - T(cA) - 2 T(*)
Sostituendo il valore T(*) secondo i punti 1, 2 e il primo del 3 ottengo rispettivamente:
DT = Tmed(Sx) - T(S1) - T(S2) < 0 per la proprieta` della media
DT = Tmed(Sx) - T(cB) < 0 perche` T(cB) = T(S1) + T(S2)
DT = Tmed(Sx) - T(cB) con T(cB) < T(S1) + T(S2)
Quindi solo il punto 3 ha qualche speranza di superare il rendimento del 200% e questo si verifica per la seguente condizione:
ora il mssimo rendimento si ha quando T(cB) = T(cS). Ora accade che
Con questo si dimostra il limite teorico per cui due processori in parallelo non possono produrre un rendimento superiore al 200% di un singolo processore.
Poichè ci sono degli esempi pratici in cui il limite lineare del 200% è stato superato significa che le ipotesi da cui si è dedotto questo limite non valgono sempre.
Ad esempio quando il carico di lavoro è troppo pesante per essere affrontato da un'unica CPU, ma non da due, allora la prestazione risulta affetta da sovraccarico e il rapporto con questa misura esula dal limite teorico).
Quest'ultima considerazione puè essere paragonata a quanto previsto dalla legge di Ohm: per un generatore di tensione ideale ci si aspetta che la corrente sia linearmente proporzionale alla conduttanza.
Sappiamo bene invece che i generatori reali si comportano linearmente solamente entro un range di conduttanza al di fuori del quale perdono la capacità di fornire una prestazione lineare (corto circuito V->0, A->oo ma cmq Pw = VA = cost).
(continua...)
|