title: Explicit Data Graph Execution
text: # Explicit Data Graph Execution
  
  Explicit Data Graph Execution o EDGE è un instruction set che invece di utilizzare il tradizionale approccio istruzione/registro tipico delle architetture RISC e CISC segue una nuova strada. I processori basati su EDGE dividono i programmi in blocchi base, questi blocchi sono dei gruppi di istruzioni che lavorano su operandi comuni e che non hanno al loro interno condizioni di salto o altre condizioni che fermino il flusso di istruzioni. Questi blocchi vengono distribuiti all'interno di unità che li processano in modo indipendente, i risultati vengono passati ai blocchi che ne necessitano per continuare l'elaborazione. La distribuzione dei blocchi viene effettuata in modo dinamico e questa filosofia di esecuzione permette di sviluppare programmi che non devono costantemente accedere ai registri per scambiare dati tra i blocchi, questo elimina un collo di bottiglia presente nei microprocessori classici. Questa tipologia di processore dividendo il programma in blocchi indipendenti dimostra una maggior capacità di eseguire codice parallelo.
  
  Il set di istruzioni EDGE definisce una serie di istruzioni atte a gestire i singoli blocchi, il set di istruzione gestisce la codifica dei dati all'interno del blocco al fine di ridurre le dipendenze dai dati (tramite l'esecuzione predicativa) e permette di specificare le dipendenze tra i blocchi. I dati sono utilizzati per definire il flusso di controllo delle istruzioni, i dati definiscono un grafico delle dipendenze che il processore deve soddisfare durante l'esecuzione. Le singole istruzioni definite con EDGE sono mediamente più costose di quelle definite da un processore RISC o CISC ma il maggior costo viene mitigato con l'utilizzo di blocchi mediamente grandi (l'implementazione di EDGE utilizza blocchi di 1024 istruzioni) e con la possibilità di utilizzare molte unità parallele di calcolo.
  
  Il set di istruzioni EDGE utilizza come elemento base i blocchi e ogni blocco viene mappati in una singola unità di esecuzione. I singoli blocchi non hanno al loro interno istruzioni di controllo del flusso, queste intervengono solo tra i blocchi, comunque i blocchi possono avere delle istruzioni predicative al fine poter inserire all'interno dei blocchi le istruzioni di flusso più comuni (come gli IF). Il grafo che definisce l'esecuzione del programma è definito con le relazioni di concorrenza tra i blocchi, queste relazioni specificano il flusso dei dati da un blocco a un altro o da un blocco a un'area di memoria comune. Ogni blocco può essere un singolo programma sequenziale o un programma SIMD. Il compilatore raccoglie in blocchi le istruzioni che utilizzano gli stessi dati e pone le istruzioni che necessitano di risultato proveniente da altri blocchi vicino a questi al fine di ridurre al minimo il tempo di transito dei dati tra i blocchi.
  
  