# data[].attributes.body
RISC:

Le prestazioni sono migliori grazie al set di istruzioni semplificato.

Le istruzioni RISC eseguono un’istruzione per ciclo di clock.

Ha un’unità separata per la memoria e quindi è possibile risparmiare spazio su disco.

CISC:

In genere è più facile scrivere codice assembly CISC rispetto al codice assembly RISC.

I CISC hanno un gran numero di istruzioni ben definite, un fattore che rende i linguaggi di alto livello facili da progettare e implementare.

# data[].attributes.body
CISC (Complex Instruction Set Computing): L’architettura CISC contiene un ampio set di istruzioni per computer che vanno da molto semplici a molto complesse e specializzate. Sebbene il progetto calcoli istruzioni complesse nel modo più efficiente, si è successivamente scoperto che molte istruzioni piccole e brevi potevano calcolare istruzioni complesse in modo più efficiente.

# data[].attributes.body
RISC (Reduced Instruction Set Computing): Il design dell’architettura RISC semplifica e accelera notevolmente l’elaborazione dei dati riducendo al minimo il numero di istruzioni memorizzate in modo permanente nel microprocessore e si basa maggiormente su istruzioni non residenti, ad esempio codice o programmi software. RISC è probabilmente la tecnologia a microprocessore più veloce ed efficiente disponibile oggi.

# data[].attributes.body
Un processore scalare: è un processore in grado di eseguire una sola istruzione per volta su un unico dato di tipo scalare (intero, reale booleano).

Un processore vettoriale: può eseguire un'unica istruzione su un'insieme di dati dello stesso tipo.

Un processore super scalare: è in grado di effettuare una corrispondenza eseguendo più istruzioni.

# data[].attributes.body
Alcune unità, potrebbero avere necessità di accedere alla stessa risorsa, per esempio la memoria in fase di fetch, in questo caso un'unità deve attendere, perdendo un ciclo macchina.

Si potrebbe verificare il caso in cui l'istruzione debba operare su un dato output di un'altra istruzione. Il dato viene letto prima che venga modificato dall'istruzione.

# data[].attributes.body
Le pipeline di dati possono essere strutturate in diversi modi. Devono tenere conto di almeno tre fattori: la velocità, l’affidabilità e la latenza.

Con velocità si intende la quantità di dati che una pipeline può elaborare in un determinato lasso di tempo.

L’affidabilità richiede che i singoli sistemi all’interno di una sequenza di dati siano tolleranti ai guasti. Una pipeline di dati affidabile contribuisce a garantire la qualità dei dati.

La latenza è il tempo di risposta, ovvero il tempo necessario affinché un’unità di dati passi attraverso la pipeline di dati.

# data[].attributes.body
Per poter eseguire contemporaneamente queste fasi, il processore deve essere suddiviso in 5 unità in grado di operare autonomamente. L'organizzazione è simile a una catena di montaggio e consente l'esecuzione di più istruzioni in un unico ciclo macchina; ogni stadio elabora i dati forniti dallo stadio precedente e al termine della propria elaborazione. passa i risultati allo stadio successivo.

# data[].attributes.body
L'elaborazione di un'istruzione da parte di un processore si compone di cinque passaggi fondamentali:

1. F: (Instruction Fetch) Lettura dell'istruzione da memoria

2. D: (Instruction Decode) Decodifica istruzione e lettura operandi da registri

3. EX: (Execute) Esecuzione dell'istruzione

4. MEM: (Memory) Attivazione della memoria (solo per determinate istruzioni)

5. WB: (Write Back) Scrittura del risultato nel registro opportuno

# data[].attributes.body
Una pipeline di dati è un mezzo per spostare i dati da una fonte di provenienza a una destinazione. Possiamo immaginarla proprio come un “tubo” attraverso cui i dati vengono raccolti, ingeriti, trasformati e ottimizzati, per arrivare a uno stato che può essere analizzato e utilizzato per sviluppare intuizioni di business.