Halide
# Halide

Halide è un linguaggio di programmazione di dominio specifico (DSL) progettato per l'elaborazione digitale delle immagini e l'elaborazione numerica dei segnali che consente di sfruttare nativamente località della memoria, vettorizzazione, calcolo parallelo su CPU, DSP e GPU.

## Caratteristiche

Halide non è un linguaggio stand-alone e non ha una propria sintassi. Un programma in Halide (chiamato pipeline) è definito tramite un'API in C++. Le funzioni di tale API consentono di costruire dinamicamente una rappresentazione di una pipeline in memoria, che può essere compilata just-in-time (JIT) oppure compilata in un file oggetto.

Caratteristica saliente di Halide è la separazione tra l'algoritmo, ovvero la logica del programma implementato, e lo scheduling usato per la sua esecuzione, ovvero il modo in cui le diverse parti sono eseguite in maniera sequenziale o parallela. Mentre in un linguaggio di programmazione tradizionale questi due aspetti sono interconnessi nella struttura del codice sorgente, Halide ha dei costrutti che permettono di specificare separatamente la logica dell'algoritmo e il suo scheduling di esecuzione.

Tra i vantaggi di questo approccio vi sono portabilità, in quanto un'unica implementazione dell'algoritmo può essere transpilata per diverse piattaforme hardware e API, semplificazione dell'implementazione, in quanto la cui logica di un algoritmo è implementata in maniera funzionale e non è mischiata con costrutti specifici alla sua struttura di esecuzione, e la possibilità di ottenere implementazioni ottimizzate in maniera automatica, senza richiedere conoscenza specifica dell'architettura e dell'API delle piattaforme di destinazione da parte del programmatore o della programmatrice.

Halide supporta nativamente l'emissione di codice oggetto per diverse architetture CPU, tra le quali x86-64, ARM, MIPS, Hexagon, PowerPC e RISC-V, e diverse interfacce GPU, tra le quali CUDA, OpenCL, shader OpenGL, Metal e DirectX. I sistemi operativi supportati includono Linux, Windows, macOS, Android e iOS.

## Esempio

La seguente funzione implementa un box filter con un kernel di dimensione $3\times 3$, decomposto in due passi di dimensione $3\times 1$ e $1\times 3$ rispettivamente.

## Applicazioni

Google ha usato Halide nell'implementazione della camera pipeline dei telefoni Google Pixel. Adobe usa Halide nell'implementazione di Photoshop. Google e Adobe hanno contribuito alla ricerca alla base di Halide.

