Bombyx: OpenCilk Compilation for FPGA Hardware Acceleration
Shahawy, de Castelnau, Ienne
Task-level parallelism (TLP) is a widely used approach in software where independent tasks are dynamically created and scheduled at runtime. Recent systems have explored architectural support for TLP on field-programmable gate arrays (FPGAs), often leveraging high-level synthesis (HLS) to create processing elements (PEs). In this paper, we present Bombyx, a compiler toolchain that lowers OpenCilk programs into a Cilk-1-inspired intermediate representation, enabling efficient mapping of CPU-oriented TLP applications to spatial architectures on FPGAs. Unlike OpenCilk's implicit task model, which requires costly context switching in hardware, Cilk-1 adopts explicit continuation-passing - a model that better aligns with the streaming nature of FPGAs. Bombyx supports multiple compilation targets: one is an OpenCilk-compatible runtime for executing Cilk-1-style code using the OpenCilk backend, and another is a synthesizable PE generator designed for HLS tools like Vitis HLS. Additionally, we introduce a decoupled access-execute optimization that enables automatic generation of high-performance PEs, improving memory-compute overlap and overall throughput.
academic
Bombyx: Compilazione OpenCilk per l'Accelerazione Hardware FPGA
Questo articolo propone Bombyx, una toolchain che compila programmi OpenCilk in acceleratori hardware FPGA. Bombyx converte il modello di parallelismo implicito dei compiti di OpenCilk in una rappresentazione intermedia di trasmissione di continuazioni esplicita nello stile di Cilk-1, più adatta alle caratteristiche di streaming dell'FPGA. Lo strumento supporta molteplici target di compilazione: runtime compatibile con OpenCilk per la verifica, e generatori di unità di elaborazione sintetizzabili per strumenti di sintesi di alto livello come Vitis HLS. Inoltre, Bombyx introduce l'ottimizzazione Decoupled Access-Execution (DAE), che genera automaticamente unità di elaborazione ad alte prestazioni, migliorando la sovrapposizione memoria-calcolo e il throughput complessivo.
Il parallelismo a livello di compiti (TLP) è una tecnica di parallelizzazione ampiamente utilizzata nel software, in grado di creare e pianificare dinamicamente compiti indipendenti a runtime. Sebbene esistano framework hardware (come ParallelXL e HardCilk) che supportano TLP su FPGA, manca uno strumento automatizzato per estrarre e compilare automaticamente il codice delle unità di elaborazione (PE) dai framework software TLP. I framework esistenti richiedono tipicamente agli utenti di fornire manualmente il codice PE, il che è sia tedioso che soggetto a errori.
Necessità di Automazione: Portare applicazioni TLP orientate alla CPU su FPGA richiede un lavoro manuale considerevole, inclusa la ristrutturazione del codice, l'adattamento delle interfacce hardware e la generazione di file di configurazione
Ottimizzazione delle Prestazioni: Il codice scritto manualmente è difficile da sottoporre a ottimizzazioni hardware avanzate (come Decoupled Access-Execution)
Efficienza dello Sviluppo: L'assenza di una toolchain automatizzata ostacola l'adozione diffusa di TLP nell'accelerazione FPGA
Modello Implicito di OpenCilk: L'utilizzo di cilk_spawn e cilk_sync nel modello fork-join richiede commutazione di contesto nei punti di sincronizzazione. L'implementazione della commutazione di contesto in hardware richiede il salvataggio dell'intero stato del circuito, il che non è direttamente supportato dagli attuali strumenti HLS e richiede ingegneria RTL sostanziale
Rappresentazione Intermedia TAPIR: TAPIR, utilizzato da OpenCilk, impiega costrutti compilatori di basso livello, rendendo difficile generare codice C++ leggibile e vicino al codice originale per HLS
Scrittura Manuale di PE: Richiede la gestione manuale di allineamento di chiusure, interfacce di buffer di scrittura, generazione di file di configurazione e altri dettagli tediosi
Il modello di trasmissione di continuazioni esplicito di Cilk-1 è più adatto all'implementazione hardware, poiché divide le funzioni nei punti di sincronizzazione in funzioni di terminazione (eseguite atomicamente, senza necessità di commutazione di contesto). Sebbene questo modello non sia sufficientemente intuitivo per la programmazione software (e sia stato quindi abbandonato nell'evoluzione di Cilk), è naturale per l'implementazione hardware. L'obiettivo di Bombyx è automatizzare la conversione da OpenCilk a TLP esplicito e generare PE hardware ottimizzati.
Processo di Compilazione Automatizzato: Propone una toolchain di compilazione completa e automatizzata da OpenCilk a acceleratori hardware FPGA denominata Bombyx
Rappresentazione Intermedia Esplicita: Progetta IR implicita e esplicita basata su grafi di flusso di controllo, realizzando la conversione automatica dal modello fork-join al modello di trasmissione di continuazioni
Generazione di Codice Multi-Target:
Backend HardCilk: genera automaticamente codice C++ HLS sintetizzabile e file di configurazione
Livello di Simulazione Cilk-1: verifica la correttezza della conversione utilizzando il runtime OpenCilk
Ottimizzazione Decoupled Access-Execution: supporta l'ottimizzazione DAE tramite direttive di compilazione (pragma), separando accesso alla memoria e calcolo in compiti diversi, migliorando le prestazioni hardware
Verifica Sperimentale: Nei benchmark di attraversamento di grafi, l'ottimizzazione DAE realizza una riduzione del tempo di esecuzione del 26,5%
Utilizza il frontend Clang di OpenCilk per generare l'albero di sintassi astratta
Converte l'AST in una rappresentazione IR implicita espressa come grafo di flusso di controllo (CFG)
Ogni funzione corrisponde a un CFG, contenente:
Un unico blocco di ingresso (senza archi in ingresso)
Uno o più blocchi di uscita (senza archi in uscita)
Blocchi di base composti da istruzioni C sequenziali, terminati da istruzioni di flusso di controllo
Perché non utilizzare TAPIR: TAPIR utilizza costrutti di basso livello (come nodi φ, alloca, ecc.), rendendo difficile generare codice C++ leggibile e vicino al codice originale. L'IR di Bombyx preserva la struttura del codice originale.
Questo è il passo di conversione centrale di Bombyx, che trasforma il modello di sincronizzazione implicito di OpenCilk nel modello di trasmissione di continuazioni esplicito di Cilk-1.
Concetti Chiave:
Chiusura (Closure): Struttura dati che rappresenta un compito, contenente:
Parametri già pronti
Segnaposti in attesa di dipendenze
Puntatore di ritorno
spawn_next: Crea un compito di continuazione in attesa di dipendenze
send_argument: Scrive esplicitamente un parametro in una chiusura in attesa e notifica lo scheduler
Algoritmo di Conversione:
Partizione dei Percorsi: Attraversa il CFG, iniziando un nuovo percorso quando si incontra un blocco di terminazione della funzione (return) o un'operazione di sincronizzazione
Ogni percorso diventa una funzione di terminazione autocontenuta
Le aree grigie nella Figura 4(c) rappresentano due percorsi
Identificazione delle Dipendenze: Analizza le relazioni di dipendenza al confine della sincronizzazione
Identifica le variabili che devono essere utilizzate dopo la sincronizzazione (come x e y nella Figura 1)
Queste variabili devono essere archiviate esplicitamente nei campi della chiusura
Sostituzione di Parole Chiave:
Inserisce la dichiarazione di chiusura nella chiamata spawn
Sostituisce la sincronizzazione con una chiamata spawn_next alla funzione successiva
Modifica il valore di ritorno dello spawn per scrivere esplicitamente nei campi della chiusura
Preserva le istruzioni return, che possono essere successivamente convertite in send_argument
Esempio di Conversione (Figura 1 a Figura 2):
// Implicito (OpenCilk)
int x = cilk_spawn fib(n-1);
int y = cilk_spawn fib(n-2);
cilk_sync;
return x + y;
// Esplicito (Cilk-1)
cont int x, y;
spawn_next sum(k, ?x, ?y); // Crea compito di continuazione
spawn fib(x, n-1); // Scrive in segnaposto x
spawn fib(y, n-2); // Scrive in segnaposto y
// Funzione termina, nessuna sincronizzazione necessaria
HardCilk è un generatore di architettura TLP FPGA open source, fornendo uno scheduler di work-stealing hardware. Bombyx automatizza la generazione di tutti i componenti richiesti da HardCilk:
Compromesso Prestazioni-Risorse: Il miglioramento delle prestazioni del 26,5% comporta un overhead di risorse di circa il 50%, il che rappresenta un compromesso ragionevole per applicazioni intensive in memoria
Analisi della Dimensione del PE:
Spawner + Executor ≈ dimensione del singolo PE Non-DAE
Il compito di accesso consuma risorse aggiuntive
Raccomandazione: l'utilizzo di PE di parallelismo dati implementati in RTL può ammortizzare il costo del compito di accesso
Potenziale di Ottimizzazione: L'articolo indica che in futuro il compito di accesso potrebbe essere integrato come primitiva black-box, piuttosto che generato utilizzando HLS
Bombyx realizza con successo un processo di compilazione automatizzato da OpenCilk a hardware FPGA
Il modello di trasmissione di continuazioni esplicito è adatto alle caratteristiche di streaming dell'FPGA, evitando la commutazione di contesto costosa
L'ottimizzazione DAE realizza un miglioramento delle prestazioni del 26,5% nei benchmark di attraversamento di grafi
Lo strumento è estensibile ad altri framework hardware TLP
Strategia di Conversione Unica: Sfrutta ingegnosamente il modello di trasmissione di continuazioni esplicito di Cilk-1 per risolvere il difficile problema della commutazione di contesto hardware
Valore dell'Automazione: Realizza per la prima volta una toolchain completamente automatizzata da OpenCilk a FPGA, colmando un importante vuoto
Progettazione dell'IR Ragionevole: La progettazione dell'IR che preserva la struttura del codice originale rende il codice HLS generato più leggibile
Forte Praticità: Automatizza la gestione di dettagli tediosi come allineamento di chiusure, interfacce di buffer di scrittura, generazione di file di configurazione
Verificabilità: Fornisce un livello di simulazione Cilk-1 per verificare la correttezza della conversione, aumentando l'affidabilità dello strumento
Favorevole all'Open Source: Il target HardCilk è un sistema open source, favorendo la diffusione dello strumento
Benchmark Singolo: Valutazione solo su attraversamento di grafi, impossibile verificare completamente l'universalità dello strumento
Mancanza di Confronti: Nessun confronto con codice scritto manualmente, altri metodi di compilazione
Scala Limitata: Grafi di test relativamente piccoli (massimo 87K nodi)
Analisi delle Prestazioni Non Approfondita: Non analizza le fonti specifiche del miglioramento delle prestazioni (utilizzo della larghezza di banda, efficienza della pianificazione dei compiti, ecc.)
2 OpenCilk (PPoPP'23): Framework Cilk più recente, linguaggio di input di Bombyx
4 HardCilk (FCCM'24): Piattaforma target di Bombyx, lavoro precedente degli autori
5 Cilk-1 (SIGPLAN'95): Sistema TLP classico di trasmissione di continuazioni esplicita, fondamento teorico di Bombyx
6 Tesi di Dottorato di Joerg (1996): Prova la fattibilità teorica della conversione da implicito a esplicito
Valutazione Complessiva: Bombyx è un lavoro di ricerca di valore, che colma il vuoto di una toolchain automatizzata da OpenCilk a accelerazione hardware FPGA. La sua innovazione centrale consiste nello sfruttare il modello di trasmissione di continuazioni esplicito di Cilk-1 per evitare la commutazione di contesto hardware, fornendo un processo di compilazione completo. Tuttavia, come lavoro iniziale, l'articolo presenta evidenti insufficienze nella larghezza e profondità della valutazione sperimentale, e la semi-automazione dell'ottimizzazione DAE limita l'usabilità. Lo strumento ha valore diretto per gli utenti di HardCilk e i ricercatori di TLP, ma richiede ulteriore maturazione per un'applicazione diffusa. Si raccomanda che i lavori successivi si concentrino sull'identificazione automatica di ottimizzazioni, sull'estensione della valutazione dei benchmark e sul rilascio open source per promuovere la verifica e il miglioramento della comunità.