schiumacal ha scritto:Ragiono su una questione.
La questione mi piace, perciò ragioniamoci insieme :-)
Le CPU non riescono ad andare oltre un certo numero di Ghz, questo per un limite fisico dei materiali utilizzati oggi, quindi aziende produttrici hanno ben pensato di colmare questa lacuna aumentando il numero dei core interni.
Esatto. Tra I processori con la frequenza più alta in commercio sono i POWER6 IBM che arrivano a 5.0 GHz, con alcuni prototipi che arrivano fino a 6.0GHz. Oppure i z196 sempre della IBM, che girano a 5,2GHz.
Nonostante l'alta frequenza, però, questi processori sono relativamente lenti, perchè in un ciclo di clock eseguono 2 istruzioni e mezzo (per core), in media, mentre una cpu di tipo Sandybridge (Core i7 di nuova generazione) ne esegue circa 6 per ciclo di clock (per core).
Teoricamente i Sistemi Operativi dovrebbero sfruttare questa soluzione.
E anche in pratica. Unix ha da sempre sfruttato i sistemi multiprocessore.
Windows li sfrutta dalla serie NT in poi (quindi anche 2000, XP e successivi).
Quando non c'erano ancora CPU multicore si potevano comunque costruire Workstation con schede madri dotate di 2-4 socket per montare tante CPU single core da far lavorare in parallelo.
Ad esempio: la Microsoft dovrebbe realizzare Windows sfruttando queste nuove CPU.
In parole povere Windows7 dovrebbe, teoricamente lavorare a pieno regime perche' sfrutterebbe il parallelismo di piu' core.
e in pratica succede proprio così.
Se Windows fa' questo, i software che lavorano in ambiente Windows, quali WinUAE, sfruttando le API di Windows dovrebbero anch'essi lavorare in parallelo.
il ragionamento fila, e inoltre è perfettamente in linea con quello che succede in pratica.
Ora se questo non avviene, sono due i casi:
- Windows non sfrutta il parallelismo, quindi e' inutile produrre CPU con piu' core, almeno per quanto riguarda i PC di base.
- Non e' Windows il problema, ma il vero problema sono i software che girano sotto Windows e che non sfruttando le API di Windows stesso, sono mal programmati.
Qui viene il bello!
Un programma può essere parallelizzato sfruttando le API di Windows, questo è poco ma sicuro. Il problema è che gli algoritmi facilmente parallelizzabili sono relativamente pochi, rispetto all'insieme di tutti gli algoritmi possibili.
Ciò significa, in pratica, che non sempre è facile "spezzare" il proprio programma in unità di esecuzione parallele a causa di problemi intrinseci. A volte è addirittura impossibile.
Nel caso specifico di WinUAE, trattandosi di un emulatore si potrebbe in teoria parallelizzare su thread diversi la simulazione dei vari componenti dell'Amiga, ad esempio un thread per la CPU, uno per il video, uno per l'audio, ecc...
In questo modo, però, il thread della CPU eseguendo i calcoli più grossi, sarà quello predominante, dominando più o meno l'80% delle risorse di calcolo, e il restante 20% sarebbe occupato da tutti gli altri thread messi insieme. In sostanza non cambierebbe niente.
In pratica avresti un core sfruttato al 100% e l'altro core (o gli altri core, se sono più di due) quasi in standby, esattamente come fa adesso.
Per avere la prova empirica che il problema non sia di Windows, basta avviare 2 volte WinUAE.
Su una macchina Dual Core, come la mia, Windows ridistribuirà il carico in maniera equa, facendo in modo che le due istanze di WinUAE girino ognuna su un core separato, in modo da massimizzare l'efficienza.
Sostanzialmente, per chi ha 2 core, far girare una istanza o due di WinUAE non fa nessuna differenza. I rallentamenti si misurano dalla terza istanza in poi.
Anche se tutti i programmi fossero studiati per i single core, avremmo comunque dei vantaggi perchè Windows (ma come lui, tutti i sistemi operativi moderni) bilancia i vari programmi sui core disponibili, facendoli lavorare tutti in modo equo, e consentendoci quindi di avere tanti programmi aperti contemporaneamente senza subire rallentamenti.