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: Compilación OpenCilk para Aceleración de Hardware FPGA
Este artículo propone Bombyx, una cadena de herramientas que compila programas OpenCilk en aceleradores de hardware FPGA. Bombyx convierte el modelo de paralelismo de tareas implícito de OpenCilk en una representación intermedia de paso de continuaciones explícita al estilo de Cilk-1, más adecuada para las características de flujo de datos de FPGA. La herramienta admite múltiples objetivos de compilación: tiempo de ejecución compatible con OpenCilk para verificación, así como generadores de unidades de procesamiento sintetizables para herramientas de síntesis de alto nivel como Vitis HLS. Además, Bombyx introduce la optimización de Acceso a Memoria-Ejecución Desacoplada (DAE), que genera automáticamente unidades de procesamiento de alto rendimiento, mejorando la superposición memoria-cómputo y el rendimiento general.
El paralelismo a nivel de tareas (TLP) es una técnica de paralelismo ampliamente utilizada en software que permite crear y programar dinámicamente tareas independientes en tiempo de ejecución. Aunque existen marcos de hardware (como ParallelXL y HardCilk) que admiten TLP en FPGA, carece de herramientas automatizadas para extraer y compilar automáticamente código de unidades de procesamiento (PE) a partir de marcos de software TLP. Los marcos existentes generalmente requieren que los usuarios proporcionen manualmente el código PE, lo cual es tedioso y propenso a errores.
Necesidad de Automatización: Portar aplicaciones TLP orientadas a CPU a FPGA requiere un trabajo manual considerable, incluyendo reestructuración de código, adaptación de interfaces de hardware y generación de archivos de configuración
Optimización de Rendimiento: El código escrito manualmente es difícil de aplicar optimizaciones de hardware avanzadas (como Acceso a Memoria-Ejecución Desacoplada)
Eficiencia de Desarrollo: La falta de cadenas de herramientas automatizadas obstaculiza la adopción generalizada de TLP en aceleración FPGA
Modelo Implícito de OpenCilk: El modelo fork-join que utiliza cilk_spawn y cilk_sync requiere cambio de contexto en puntos de sincronización. Implementar cambio de contexto en hardware requiere guardar el estado completo del circuito, lo cual no es directamente soportado por herramientas HLS actuales y requiere ingeniería RTL extensiva
Representación Intermedia TAPIR: TAPIR, utilizada por OpenCilk, emplea construcciones de compilador de bajo nivel que dificultan generar código C++ legible cercano al código original para HLS
Escritura Manual de PE: Requiere manejar manualmente alineación de clausuras, interfaces de búfer de escritura, generación de archivos de configuración y otros detalles tediosos
El modelo explícito de paso de continuaciones de Cilk-1 es más adecuado para implementación en hardware, ya que divide funciones en puntos de sincronización en funciones terminales (que se ejecutan atómicamente sin necesidad de cambio de contexto). Aunque este modelo no es suficientemente intuitivo para programación de software (razón por la cual fue abandonado en la evolución de Cilk), es natural para implementación en hardware. El objetivo de Bombyx es automatizar la conversión de OpenCilk a TLP explícito y generar PE de hardware optimizados.
Proceso de Compilación Automatizado: Propone una cadena de herramientas de compilación completa y automatizada de OpenCilk a aceleradores de hardware FPGA llamada Bombyx
Representación Intermedia Explícita: Diseña IR implícita y explícita basada en grafos de flujo de control, implementando conversión automática del modelo fork-join al modelo de paso de continuaciones
Generación de Código Multi-Objetivo:
Backend HardCilk: Genera automáticamente código C++ HLS sintetizable y archivos de configuración
Capa de Simulación Cilk-1: Utiliza tiempo de ejecución OpenCilk para verificar la corrección de la conversión
Optimización de Acceso a Memoria-Ejecución Desacoplada: Soporta optimización DAE mediante directivas de compilación (pragma), separando acceso a memoria y cómputo en tareas diferentes, mejorando rendimiento de hardware
Verificación Experimental: En pruebas de referencia de recorrido de grafos, la optimización DAE logra una reducción de tiempo de ejecución del 26.5%
Utiliza el frontend Clang de OpenCilk para generar árbol de sintaxis abstracta
Convierte AST a representación de grafo de flujo de control (CFG) de IR implícita
Cada función corresponde a un CFG que contiene:
Bloque de entrada único (sin aristas de entrada)
Uno o más bloques de salida (sin aristas de salida)
Bloques básicos compuestos de sentencias C secuenciales, terminados por sentencias de flujo de control
Por qué no usar TAPIR: TAPIR utiliza construcciones de bajo nivel (como nodos φ, alloca, etc.), lo que dificulta generar código C++ legible cercano al código original. La IR de Bombyx preserva la estructura del código original.
Este es el paso de conversión central de Bombyx, que transforma el modelo de sincronización implícita de OpenCilk al modelo explícito de paso de continuaciones de Cilk-1.
Conceptos Clave:
Clausura (Closure): Estructura de datos que representa una tarea, conteniendo:
Parámetros ya disponibles
Marcadores de posición esperando dependencias
Puntero de retorno
spawn_next: Crea una tarea de continuación esperando dependencias
send_argument: Escribe explícitamente un parámetro en una clausura esperante y notifica al programador
Algoritmo de Conversión:
Partición de Rutas: Recorre el CFG, iniciando una nueva ruta al encontrar bloques terminales de función (return) u operaciones de sincronización
Cada ruta se convierte en una función terminal autónoma
Las regiones grises en la Figura 4(c) representan dos rutas
Identificación de Dependencias: Analiza relaciones de dependencia en límites de sincronización
Identifica variables necesarias después de sincronización (como x e y en la Figura 1)
Estas variables deben almacenarse explícitamente en campos de clausura
Reemplazo de Palabras Clave:
Inserta declaración de clausura en llamadas spawn
Reemplaza sincronización con llamadas spawn_next a funciones sucesoras
Cambia valores de retorno de spawn a escritura explícita en campos de clausura
Preserva sentencias return, que se pueden convertir posteriormente a send_argument
Ejemplo de Conversión (Figura 1 a Figura 2):
// Implícita (OpenCilk)
int x = cilk_spawn fib(n-1);
int y = cilk_spawn fib(n-2);
cilk_sync;
return x + y;
// Explícita (Cilk-1)
cont int x, y;
spawn_next sum(k, ?x, ?y); // Crea tarea de continuación
spawn fib(x, n-1); // Escribe en marcador x
spawn fib(y, n-2); // Escribe en marcador y
// Función termina, sin necesidad de sincronización
HardCilk es un generador de arquitectura TLP FPGA de código abierto que proporciona un programador de robo de trabajo de hardware. Bombyx automatiza la generación de todos los componentes requeridos por HardCilk:
Compensación Rendimiento-Recursos: La mejora de rendimiento del 26.5% a costa de aproximadamente 50% de sobrecarga de recursos es una compensación razonable para aplicaciones intensivas en memoria
Análisis de Tamaño de PE:
Spawner + Executor ≈ tamaño de PE único sin DAE
Tarea de acceso consume recursos adicionales
Recomendación: Usar PE de paralelismo de datos implementado en RTL puede amortizar costo de tarea de acceso
Potencial de Optimización: El artículo señala que en el futuro se puede integrar tarea de acceso como primitiva de caja negra, en lugar de generarla con HLS
Identificación Automática de DAE: Desarrollar análisis de compilador para identificar automáticamente patrones de código adecuados para optimización DAE
Unidades de Acceso RTL: Integrar implementaciones RTL eficientes de unidades de acceso de paralelismo de datos
Más Optimizaciones: Explorar otras optimizaciones específicas de hardware (como reutilización de datos, optimización de localidad)
Extensión de Objetivos: Soportar más marcos de hardware TLP y herramientas HLS
Evaluación Completa: Evaluar en más pruebas de referencia, incluyendo diferentes tipos de aplicaciones TLP
Estrategia de Conversión Única: Utiliza ingeniosamente el modelo explícito de paso de continuaciones de Cilk-1 para resolver el difícil problema de cambio de contexto en hardware
Valor de Automatización: Primera herramienta que implementa cadena de herramientas automatizada completa de OpenCilk a FPGA, llenando un vacío importante
Diseño de IR Razonable: El diseño de IR que preserva estructura de código original hace que código HLS generado sea más legible
Fuerte Practicidad: Automatiza manejo de detalles tediosos como alineación de clausuras, interfaces de búfer de escritura, generación de archivos de configuración
Verificabilidad: Proporciona capa de simulación Cilk-1 para verificar corrección de conversión, aumentando confiabilidad de herramienta
Amigable con Código Abierto: HardCilk objetivo es sistema de código abierto, favorable para promoción de herramienta
Prueba de Referencia Única: Solo evalúa recorrido de grafos, incapaz de verificar completamente generalidad de herramienta
Falta de Comparación: Sin comparación con código escrito manualmente, otros métodos de compilación
Escala Limitada: Grafos de prueba relativamente pequeños (máximo 87K nodos)
Análisis de Rendimiento No Profundo: Sin análisis de fuentes específicas de mejora de rendimiento (utilización de ancho de banda, eficiencia de programación de tareas, etc.)
2 OpenCilk (PPoPP'23): Marco Cilk más reciente, lenguaje de entrada de Bombyx
4 HardCilk (FCCM'24): Plataforma objetivo de Bombyx, trabajo anterior de autores
5 Cilk-1 (SIGPLAN'95): Sistema TLP clásico de paso de continuaciones explícito, fundamento teórico de Bombyx
6 Tesis Doctoral de Joerg (1996): Demuestra viabilidad teórica de conversión implícita a explícita
Evaluación General: Bombyx es un trabajo de investigación valioso que llena el vacío de cadena de herramientas automatizada de OpenCilk a aceleración de hardware FPGA. Su innovación central radica en utilizar el modelo explícito de paso de continuaciones de Cilk-1 para evitar cambio de contexto costoso en hardware, proporcionando un proceso de compilación completo. Sin embargo, como trabajo inicial, el artículo presenta deficiencias evidentes en amplitud y profundidad de evaluación experimental, y la semi-automatización de optimización DAE también limita la facilidad de uso. La herramienta tiene valor directo para usuarios de HardCilk e investigadores de TLP, pero requiere maduración adicional para aplicación generalizada. Se recomienda que trabajo posterior se enfoque en identificación automática de optimización, expansión de evaluación de pruebas de referencia y lanzamiento de código abierto para promover verificación y mejora comunitaria.