Un compilador mínimo para entender cómo se paralelizan los kernels de datos

Fuentes: A Tiny Compiler for Data-Parallel Kernels

El artículo describe un compilador experimental de unas 180 líneas de Python, disponible en GitHub, que realiza una fase de "lowering" sobre kernels: transforma bucles for convencionales en bucles vector_for en los que el paralelismo de datos queda explícito. La entrada es un AST pequeño escrito a mano y la salida es una representación intermedia que el propio compilador imprime como pseudocódigo.

La pieza central del compilador es un clasificador que recorre el AST y etiqueta cada valor como uniforme o variable. Los parámetros del kernel se asumen uniformes; el índice del bucle se marca como variable, y esa propiedad se propaga por las expresiones: si i es variable, samples[i] también, y samples[i] * volume resulta variable aunque volume no lo sea. Con esa información, el compilador decide qué operación emitir: un acceso contiguo con índice variable se convierte en una carga con máscara (masked_load), mientras que un acceso variable sobre otro índice variable se transforma en un gather, donde cada carril lee desde su propia dirección.

El texto explica conceptos clave como lane, máscara activa y la diferencia entre cargas contiguas y gathers, e ilustra la transformación con ejemplos de escalado de audio y de colorización por número. Una fase posterior de generación de código podría traducir estas operaciones en instrucciones SIMD o SIMT reales, con mejoras de rendimiento teóricas de hasta un factor igual al número de carriles.

El autor presenta la herramienta como un ejercicio pedagógico para desmitificar el análisis de dependencias y la fase de lowering, sin pretender cubrir todo lo que un compilador real aborda: tipos, aliasing, flujo de control o garantías de independencia entre iteraciones.