Prestazioni

Le prestazioni di un sistema di calcolo derivano dall’equilibrio di tutte le componenti

Quando si parla di prestazioni si intende il tempo di esecuzione di un determinato programma. La velocità di esecuzione non è determinata solo dalla CPU, ma bisogna considerare ogni singola componente e ragionare su ognuna di esse (com’è fatta, tipo di linguaggio) → caratteristiche hardware. Anche i dispositivi di I/O: se hanno accesso diretto dalla memoria oppure si prendono le istruzioni autonomamente Anche i bus: protocollo di arbitraggio, linee di bus, indirizzi di memoria (architettura di sistema, word)

Aumentare le prestazioni a livello di organizzazione della CPU, si parla di diminuire il tempo effettivo di esecuzione di un’istruzione e introdurre forme di parallelismo sulle istruzioni. per quanto riguarda la memoria, si introduce un sistema di collegamento a cascata tra i diversi tipi di memoria che collega quella più veloce (meno capiente poiché più cara) a quelle meno veloci.

CPU

Overclocking: aumentare la frequenza del clock, ovvero il numero di segnali dati in un determinato periodo di tempo. Più è veloce più aumenta il numero di cicli fetch/execute. Progettare una CPU di questo tipo implica l’aumentare delle porte logiche, il ridurre le dimensioni, miniaturizzare (problemi di dissipazione del calore). La miniaturizzazione porta ad un limite fisico → si parla di parallelismo: collegare più CPU insieme. Inoltre devo ragionare sulle componenti che si interfacciano con la CPU: intramezziamo il percorso tra CPU e memoria con delle memorie più veloci → cache a 2/3 livelli

Parallelismo

Screenshot 2024-05-02 at 5.11.04 PM.png

In questo caso, in ogni ciclo ogni “stazione di lavoro” ha sempre qualcosa da fare: nel caso dello fase S1, una volta conclusa l’operazione del primo ciclo di clock, al successivo ciclo gli do un’altra operazione da svolgere. Questo modo di sovrapporre le varie fasi non è tuttavia sempre possibile, poiché alcune fasi devono accedere alla memoria e richiedono più cicli di clock (BUS).

Un parallelismo a livello di istruzione si può implementare anche in forma scalare: introduco la ridondanza su alcune “stazioni di lavoro”. In questo caso, per il primo stadio ho una componente in comune, mentre per ogni altro stadio ho una doppia componente che mi svolge la stessa operazione.

Screenshot 2024-05-02 at 5.11.56 PM.png

Screenshot 2024-05-02 at 5.12.19 PM.png

Screenshot 2024-05-02 at 5.13.25 PM.png

Posso implementare una forma di parallelismo anche a livello di CPU → Array di processori: unità di controllo (decodifica e realizza ogni istruzione) è asportata che fa riferimento (in comune) a molti processori. Arriva un’istruzione all’unità di controllo che decide chi la deve eseguire, attuando istruzioni in parallelo (una per ogni processore).

Anche questo è un parallelismo molto “spinto” che implica un multiprocessore collegato tramite bus ad una memoria condivisa. Tuttavia questo è un parallelismo lento poiché il bus implica un arbitraggio master/slave che rallenta l’accesso alla memoria poiché tutti i moduli CPU necessitano l’acceso in maniera prioritaria per svolgere le istruzioni (tutti master).

Screenshot 2024-05-02 at 5.14.40 PM.png

CPU-Memoria

Ridurre accessi alla memoria durante l’esecuzione del programma: cioè con lo stesso accesso devo cercare di raccogliere più informazioni possibili → locazioni di memoria “wider rather than diper”: quindi poche locazioni ma molto lunghe. Ovviamente devo avere un bus data che mi permette il trasporto di un determinato numero di dati anche molto ampio: nel caso centrale ho 8 indirizzi (locazioni) che implicano 4 linee (2alla3) e 12 linee data, cioè il numero di bit.

Screenshot 2024-05-02 at 5.16.39 PM.png

Caching: cioè interporre una memoria con velocità intermedia tra quella della CPU e quella principale, non soffermandosi ad un solo livello. Infatti con il passare del tempo il processore diventa sempre più compatto e avanza sempre più spazio nel chip permettendo l’inserimento di un’altra cache (secondo livello). Un ulteriore livello (terzo ed ultimo) viene spesso messo sulla scheda madre tra quella di secondo e la RAM.

I/O: ogni componente ha un suo tempo di trasferimento dati specifico. Si possono considerare diversi BUS specifico per delle componenti con velocità simili (dalle più veloci alle più lente) collegate da bridge. Un altro modo è quello di applicare una gerarchia di memoria: si creano per mitigare le differenze di tempo di accesso, minimizzare gli accessi tra livelli di memoria diversi.

Equilibrio: per un calcolatore è opportuno cercare un equilibrio tra le componenti in modo da non avere differenze di velocità enormi poiché inutili e dispendiose