On Fri, 18 Jan 2013 23:59:48 +0100, Cristiano wrote:
> Qualcuno di voi che usa una CPU quad-core 8 thread ha mai scritto un
> programma con 8 o più thread per verificare se la velocità di esecuzione
> rispetto al single-thread aumenta di 8 volte?
>
> Grazie Cristiano
Sì, provato anche con molti più flussi.
E non è detto che con 8 thread paralleli la velocità di esecuzione sia 8
volte tanto.
Ci sono molte variabili in gioco che possono portare variazioni drastiche
(fino al blocco dell'applicazione) con cause sia interne che esterne al
programma.
Per farla semplice, cosa fa il programma?
Se questo dovesse generare informazioni dal nulla e buttarle nel nulla, 8
thread arriverebbero a generare 8 volte le informazioni generate da un
singolo thread (è come avere 8 programmi separati).
Se questo programma deve prendere i dati da una fonte comune e buttarli
in una destinazione comune, dovrebbero gestire l'accesso concorrente alle
risorse condivise, il che porterebbe ad avere dei momenti in cui uno o più
thread sono in attesa del proprio turno.
Più generalmente, se esistono risorse condivise, si applica il secondo
caso.
Una gestione non corretta delle risorse condivise (o delle priorità di
esecuzione) porta a situazioni di visibile degradazione o anche di
deadlock dove due o più entità sono in mutua attesa.
Altro fattore fondamentale è riassumibile con una frase che viene (o
dovrebbe) essere insegnata agli ingenieri gestionali: se una donna impiega
9 mesi per fare un bambino, 9 donne non impiegano 1 mese per fare un
bambino. (tipico esempio di lavoro non parallelizzabile)
Quindi non sempre l'approccio parallelo è applicabile o applicabile con
vantaggi.
In taluni casi, un algoritmo che gira mono-thread necessita di pesanti
modifche (finanche alla riprogettazione) per poter essere eseguito in un
contesto parallelo.
E tutto questo parlando di fattori interni.
Come fattori esterni, ci sono diverse cose che possono mettere i bastoni
tra le ruote.
Intanto sei su un sistema operativo che fa delle cose. Quindi se hai 8 cpu
a disposizione, alcune possono anche essere impegnate per fare altro.
Potresti avere delle politiche di risparmio energetico che modificano la
velocità dei processori in base a carico di lavoro e temperature,
potresti avere dei rallentamenti dovuti a letture e scritture su disco, o
scambio dati con la rete, e molto altro ancora.
Comunque il punto fondamentale è che un multithread progettato male può
essere molto inefficente, e avere prestazioni peggiori di un single
thread progettato bene. Ed è semplice progettare male un multithread.
Quindi conviene sempre chiederti: ma ti serve realmente?
PSK