Un coarse-grained reconfigurable array o coarse-grained reconfigurable architecture (CGRA) è una classe di hardware di spatial computing costruita a partire da
Un coarse-grained reconfigurable array o coarse-grained reconfigurable architecture (CGRA) è una classe di hardware di spatial computing costruita a partire da un numero relativamente grande di processing elements (PEs) collegati tramite un'interconnessione on-chip programmabile, staticamente o dinamicamente reconfigurable. Riconfigurando sia l’operation di ciascun PE sia il routing tra i PEs, una CGRA può essere specializzata per implementare il dataflow graph di una computation, nella maggior parte dei casi il body di un loop performance-critical. Si colloca tra l’adattabilità dei software-programmable processors e l’efficienza energetica del hardware custom.[1][2][3]

I building blocks di una CGRA sono fissati a livello di word e riconfigurati a coarse granularity, il che la distingue da una field-programmable gate array (FPGA). Le FPGAs sono reconfigurable a livello di singoli bit e di singole porte logiche, offrendo grande flessibilità a costo di elevati overheads in termini di area, potenza e tempo di configurazione. Anche i general-purpose processors (CPUs e GPUs) sono highly flexible, ma pagano l’energy cost di fetching e decoding di un instruction stream per ogni operation, mentre un application-specific integrated circuit (ASIC) è l’opzione più energy-efficient proprio perché è specialized per una single application e quindi la meno flexible. Operando a word granularity, una CGRA conserva gran parte del spatial, energy-efficient parallelism del custom hardware pur rimanendo reprogrammable in software.[1]
Le CGRAs furono per la prima volta concepite nel 1960 e assunsero la loro forma moderna a metà degli anni 1990.[4] Da allora sono state applicate a signal processing, wireless communication e machine learning, e compaiono sia in academic prototypes sia in commercial silicon. Eseguire un programma su una CGRA richiede un compilatore specializzato che mappa il dataflow graph del programma sull’array, un passaggio che rimane uno dei principali ostacoli alla wider adoption.[5]
L’interesse per le CGRAs nasce da un divario nell’ecosistema hardware. Con la fine del Dennard scaling e il rallentamento della Moore’s law, che riducono i performance gains che i general-purpose processors un tempo fornivano automaticamente, la computer architecture si è orientata verso la specializzazione per continuare a migliorare le performance per watt, spinta in parte da demanding workloads come le neural networks. A un estremo, i fixed-function ASICs raggiungono la massima efficienza, ma comportano elevati costi di non-recurring engineering e non possono essere modificati dopo la fabbricazione. All’altro estremo, i von Neumann processors sono interamente riprogrammabili ma inefficienti dal punto di vista energetico, mentre le FPGAs rappresentano un flexible but costly middle ground. Poiché la dataflow architecture è reconfigurable a livello di parola, le CGRAs mirano a combinare l'efficienza vicina a quella degli ASIC con la programmabilità post-fabrication.[1]
L’idea di una macchina la cui struttura possa essere riconfigurata per un calcolo risale al "fixed-plus-variable structure computer" proposto da Gerald Estrin nel 1960.[4] Le coarse-grained arrays nel modern sense emersero a metà degli anni 1990, quando diversi gruppi sostituirono le bit-level cells di una FPGA con word-level processing elements.[5] Il KressArray introdusse una two-dimensional mesh di reconfigurable datapath units; MATRIX combinò un word-level datapath con una configurable interconnect; RaPiD e PipeRench organizzarono le loro cells come reconfigurable pipelines, con PipeRench che raggiunse il silicon; e MorphoSys accoppiò una reconfigurable-cell mesh con un control processor per data-parallel media workloads.[6]
Durante gli anni 2000, i design divennero più grandi e più integrati. ADRES accoppiò un VLIW processor con una reconfigurable matrix, TRIPS esplorò una polymorphous array capace di sfruttare instruction-, thread-, and data-level parallelism, e PACT XPP offrì una self-reconfiguring commercial fabric.[7][8][9] Dagli anni 2010 in poi, la research enfatizzò data movement e system integration: HyCUBE introdusse una single-cycle multi-hop interconnect, Plasticine organizzò la computation attorno a pattern compute e pattern memory units, e il modello stream-dataflow (Softbrain) decoupled memory streaming from the spatial datapath.[10][11][12] Lo stesso periodo vide prendere forma un open-source ecosystem, includendo ultra-low-power edge arrays come OpenEdgeCGRA, integrato con il RISC-V microcontroller X-HEEP nella HEEPsilon platform per dare un complete flow from C code to hardware.[13][14]
Una manciata di CGRAs ha raggiunto il commercial silicon. Il Reconfigurable Processor (SRP) di Samsung, derived from ADRES, è apparso in systems-on-chip e in ultra-low-power biomedical variants;[15][16] SambaNova ha commercializzato la sua reconfigurable dataflow unit (RDU), un large dataflow accelerator costruito da pattern compute e pattern memory units e orientato a machine-learning training and inference.[17]
Una CGRA fabric è tipicamente organizzata come una two-dimensional array di processing elements, ciascuno costruito attorno a una arithmetic logic unit (ALU) o functional unit, a un piccolo local register file o a un insieme di pipeline registers, e a uno o più configuration registers che determinano, on a per-PE basis, quale operation eseguire e come gli operands sono routed. I PEs sono collegati da una programmable interconnect, comunemente una mesh, un torus o, per arrays più piccoli, un crossbar switch, che permette agli operands prodotti da un PE di raggiungere i suoi neighbors o, in progetti più ricchi, PEs più distanti. La maggior parte delle CGRAs non è standalone; l’array è coupled a un host o a un control processor, un ruolo storicamente ricoperto da un VLIW o da un core ARM e, in molti recenti progetti open source, da un core RISC-V. A seconda di quanto strettamente l’array sia bound to the host, una CGRA è descritta come tightly coupled se si trova all'interno del processor datapath ed è invocata come istruzione personalizzata, oppure loosely coupled se agisce come acceleratore separato che comunica tramite un'interconnessione on-chip. Il layout a bassa coerenza è il più comune nei moderni sistemi di grandi dimensioni.[18]

Programmare una CGRA significa caricare una 'configuration' nella configuration memory dell’array: per ciascun PE, la configuration specifica l’operazione (ad esempio add, multiply, shift o compare) e il routing degli input e degli output. Poiché questa configurazione è coarse-grained, una dedicated CGRA può passare a una nuova configurazione in nanosecondi, a un ordine di grandezza più rapidamente di quanto una FPGA possa riconfigurarsi. Una single configuration produce una single spatial "snapshot" del dataflow graph (DFG) in esecuzione. Nelle CGRAs spatial-only, il DFG di un kernel viene unrolled una sola volta sull’array e ciascun PE mantiene la stessa configurazione per tutta l’esecuzione, in modo simile a un systolic array. Nelle temporal o spatio-temporal CGRAs, invece, ciascun PE cycles through una breve sequence of configurations conservate nella local configuration memory, time-multiplexing diversi DFG nodes sullo stesso physical PE attraverso successive cycles.[1][2][5]
La letteratura classifica ulteriormente l'esecuzione della CGRA in base al numero di configurazioni e di data streams che un PE array gestisce contemporaneamente: single-configuration, single-data (SCSD); single-configuration, multiple-data (SCMD), in cui una configurazione viene applicata su tutto l'array; e multiple-configuration, multiple-data (MCMD), in cui diverse configurazioni vengono eseguite in parallelo.[1]
Notes:

Un’ulteriore distinzione architettonica riguarda se i PEs across the array siano identici o specializzati. In una CGRA omogenea, ogni PE supporta lo stesso insieme di operazioni, il che semplifica il placement and routing durante la compilazione. In una CGRA eterogenea, i PEs sono specializzati: per esempio, solo alcuni implementano un moltiplicatore o un'unità di caricamento/salvataggio della memoria, mentre gli altri gestiscono operazioni aritmetiche e logiche più semplici. Questo riduce l'area e il power per un dato target workload, ma comporta un problema di mapping più complesso, poiché il compiler deve posizionare ciascuna operation su un PE che effettivamente la supporti. L’homogeneous-versus-heterogeneous axis è independent dalla spatial-versus-spatio-temporal distinction, dando un two-dimensional design space che va da simple, easy-to-compile homogeneous-spatial arrays a complex, highly specialized heterogeneous-spatio-temporal ones.[19]

Poiché una CGRA esegue un spatial dataflow graph invece di un sequential instruction stream, il suo compiler deve trasformare un programma in una placed-and-routed configuration anziché in istruzioni macchina. Un typical flow parte da un high-level language, solitamente C o C++, identifica i performance-critical loops e lowers ciascuno di essi a un dataflow graph, comunemente attraverso un LLVM-based front end, nonostante alcune novel methodology usino MLIR[20][21]. I loops che contengono conditionals vengono resi spatial convertendo control dependencies in data dependencies tramite predication, whether partial or full, in modo che entrambi i sides di un branch siano computed, e il correct result venga poi selected.[1]
Il core del flow è il mapping problem: binding ogni DFG node a un PE e routing ogni data dependency attraverso l’interconnect, subject alle operational capabilities dei PEs, all’interconnect topology e alle timing constraints.[2][10][20][22] Questo problema è NP-complete ed è solitamente diviso in due sottoproblemi collegati: scheduling, che assegna a ciascuna operation un time slot, e placement-and-routing, che bind operations a PEs e riserva risorse di interconnect. Per i loop pipelined, la key quality metric è l’initiation interval (II), ovvero il numero di cicli tra lo start di due iterazioni successive del loop, che determina il throughput. Software pipelining tramite modulo scheduling cerca un mapping valido al II minimo raggiungibile, aumentando l'II e rescheduling ogni volta che il mapping non è valido. I mappers descritti nella literature usano heuristics, simulated annealing, integer linear programming, graph-theoretic formulations come maximal-clique search, e, più recentemente, learning-based e hierarchical methods.[22][23]
| Framework | First release | Origin | Input / front end | Mapping | RTL generation | Simulation | Distinguishing features |
|---|---|---|---|---|---|---|---|
| CGRA-ME[24][25] | 2017 (v2.0, 2024) | University of Toronto | C via LLVM; custom architecture description | Architecture-adaptive; ILP and simulated annealing | Verilog | Si (from v2.0) | Models homogeneous spatio-temporal CGRAs; limited handling of control divergence |
| CCF | 2018 | Arizona State University | C with #pragma CGRA (Clang/LLVM) |
Graph-based; partial predication | No | Cycle-accurate (gem5, CPU + CGRA) | CPU-coupled accelerator; MiBench, Parboil and Rodinia benchmarks |
| OpenCGRA / CGRA-Flow[26] | 2021 | Pacific Northwest National Laboratory / Northeastern University | C/C++ loop; optional GUI | Operation-centric; supports control divergence, recurrences, multidimensional loops | Verilog (FPGA-synthesizable) | Si (user-provided test benches) | GUI front end (CGRA-Flow); parameterizable interconnect generator |
| Morpher | 2022 | National University of Singapore | C via LLVM | Architecture-adaptive; heuristic, simulated annealing, and learning-based (LISA) | Si (via Pillars/Chisel) | Cycle-accurate with automated validation | Learning-based (LISA) mapping; automated validation flow |
Questi frameworks differiscono principalmente lungo quattro assi: se generano automaticamente un DFG a partire da una source o richiedono all’user di fornirne uno; se il loro mapper è "architecture-adaptive", cioè in grado di retargettizzare una nuova interconnect o un mix di PE senza code changes; se emettono RTL sintetizzabile; e se includono un integrated cycle-accurate simulator. Comparative studies typically report achievable initiation interval, mapping success rate e compilation time across standard loop-kernel benchmark suites come PolyBench.[27]
Nonostante i loro vantaggi in termini di efficienza, le CGRAs rimangono un'open research question, con limitazioni di programmabilità e di produttività ancora da risolvere.[1]
Mappare il dataflow graph di un kernel sull’array e il routing delle sue dipendenze attraverso l’interconnect è un problema combinatorio difficile. Il compiler deve soddisfare simultaneamente le constraints di PE-capability, di routing/adjacency e di timing, e la difficoltà aumenta quando i PEs sono eterogenei o la topologia di interconnessione è irregolare. Un mapping che funziona con un kernel può non funzionare con un kernel leggermente diverso sulla stessa fabric.[2]
Le CGRAs si mappano più naturalmente su kernel affini, loop-dominated e data-parallel espressi come grafi di dataflow. Irregular control flow, come data-dependent branches, function calls e pointer chasing, non si traduce cleanly su una spatial fabric, sia che quella fabric sia statically o dynamically scheduled, e gestirlo efficiently rimane un active research problem.[28]
I design temporali e spatio-temporali richiedono abbastanza memoria di configurazione (context) on-chip per mantenere ogni configurazione attraverso cui un PE dovrà passare.[1] Tenere more than one distinct configuration resident at once, cioè il multiple-configuration, multiple-data, o MCMD, execution model, costa più di questa memory rispetto alla condivisione di una single configuration across the array, come nel single-configuration, multiple-data (SCMD) model. Tale capacità si traduce direttamente in area e power, un costo da valutare rispetto al modello di esecuzione di cui un dato workload ha effettivamente bisogno.
A differenza di CPU e GPU, le CGRAs non hanno uno standard, un compiler ampiamente adottato né un ecosistema di descrizione hardware. La maggior parte degli academic e industrial designs si basa ancora su bespoke, architecture-specific toolchains, che limitano reproducibility e rallentano adoption oltre il gruppo che ha costruito una data fabric.[1][26]
Le CGRAs sono progettate per compute-intensive, loop-dominated kernels con dataflow regolare, e la loro storia di applicazione riflette questo.[3] Le early arrays puntavano a digital signal processing, multimedia, e image and video processing, dove le stesse operations sono applicate a streams of data. Lavori correlati li hanno applicati alla wireless baseband e alla software-defined radio, sfruttando la reconfigurabilità per lo switching tra gli standard.[1]
Più recentemente, il driver dominante è stato il machine learning.[3] CGRAs e CGRA-like dataflow accelerators sono usati per deep neural network inference and training, da large commercial systems che eseguono transformer e large-language-model workloads fino a ultra-low-power arrays at the edge. Altri domains includono scientific and high-performance computing, embedded bio-signal processing per wearable and near-sensor devices,[29] e error-tolerant workloads affrontati tramite approximate computing variants che trade accuracy for energy.[30]
La seguente tabella elenca representative CGRA and CGRA-like designs dall'accademia e dall'industria, coprendo le ere descritte nella sezione Storia.
| System | Year | Origin | Type | Notable for |
|---|---|---|---|---|
| RaPiD[31] | 1996 | University of Washington | Academic | Linear, pipelined reconfigurable datapath |
| ADRES[7] | 2003 | IMEC | Academic | VLIW host tightly coupled to a reconfigurable matrix |
| PACT XPP[9] | 2003 | PACT XPP Technologies | Commercial | Self-reconfiguring dataflow fabric |
| TRIPS[8] | 2004 | University of Texas at Austin | Academic | Polymorphous array (ILP/TLP/DLP) |
| Samsung SRP[15] | 2010s | Samsung | Commercial | ADRES-derived; used in systems-on-chip |
| DySER[32] | 2012 | University of Wisconsin – Madison | Academic | Reconfigurable array embedded in a processor pipeline |
| HyCUBE[10] | 2017 | National University of Singapore | Academic | Single-cycle multi-hop interconnect |
| Plasticine[11] | 2017 | Stanford University | Academic | Pattern compute and pattern memory units |
| Renesas DRP[33] | 2018 | Renesas | Commercial | Dynamically reconfigurable processor for embedded AI |
| SambaNova RDU[17] | 2021 | SambaNova | Commercial | Plasticine-derived AI dataflow accelerator |
| OpenEdgeCGRA[14] | 2023 | EPFL | Academic | Resizable ultra-low-power edge array (HEEPsilon / X-HEEP) |
| UbitiumCGRA[34] | 2026 | Ubitium | Commercial | First CGRA to run linux without a processor as controller |
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.