# SYCL

SYCL (pronuncia “sickle”) è un layer di astrazione gratuito e multipiattaforma progettato sui concetti di portabilità e di efficienza di OpenCL, che permette al codice di piattaforme eterogenee di essere scritto in uno stile “a sorgente singola”, utilizzando completamente lo standard C++. SYCL consente lo sviluppo di una sola sorgente in cui le funzioni di modello C ++ possono contenere sia il codice host (cpu) che quello per il dispositivo (gpu/fpga/arm) al fine di costruire algoritmi complessi che utilizzano l'accelerazione OpenCL e quindi poter riutilizzare tutto il loro codice sorgente su diversi tipi di hardware e di dati. La possibilità, per gli sviluppatori, di non essere costretti a tener conto del dispositivo su cui il programma girerà (necessario in OpenCL), rende molto più semplice e lineare la programmazione.

## Storia

Sviluppato dal consorzio Khronos Group, SYCL è pubblico dalla versione 1.2 (del 2014), basandosi sulla versione 1.2 di OpenCL, era limitato nello sviluppo dalle librerie C++ di quest’ultimo, mentre la versione provvisoria più recente (e provvisoria), la 2.2 (basata su OpenCL 2.2) ha molte più funzioni ed elasticità, come la memoria virtuale condivisa, i puntatori generici, ecc. L'ultima release stabile del braccio di sviluppo 1.2 (che è stato abbandonato) è la 1.2.1 release 7, dell'aprile 2020, che ha introdotto tutta una serie di funzionalità, come il supporto a piattaforme AI (Tensorflow, per esempio), il back-end con le librerie Cuda, il supporto a C++14 e quello iniziale a C++17 (prima supportava solo C++11) e molto altro ancora.
Il braccio attuale di sviluppo è stato denominato SYCL 2020, è giunto alla revisione 7 e presenta molte novità come, per esempio, il pieno supporto a C++17.

## Funzionamento

Gestione della memoria: in Sycl, la gestione della memoria è incapsulata in un layer di alto livello che separa lo storage e l’accesso ai dati. Come in Opencl, gli oggetti di buffer e di immagine vengono utilizzati per mantenere i dati che devono essere accodati a un dispositivo, tuttavia in SYCL, un oggetto buffer o immagine può mantenere più buffer e immagini OpenCL e l’accodamento viene eseguito da oggetti accessori. Ciò consente al runtime lato host di eseguire il monitoraggio delle dipendenze tra le funzioni del kernel e pertanto fornire una migliore sincronizzazione.
Gestione dei dispositivi: Il flusso di compilazione specifico è stato deliberatamente lasciato aperto per consentire agli implementatori di scegliere come implementare i compilatori di dispositivi SYCL: le specifiche suggeriscono due possibili soluzioni di compilazione, una a singolo compilatore e una a multi-compilatore. Nella soluzione di compilazione singola, il compilatore SYCL compilerebbe i file di origine per la CPU host e per il dispositivo in una sola passata e gestirebbe internamente la memorizzazione dei binari del kernel. Una soluzione multi-compilatore dividerebbe il flusso di lavoro in due fasi: nella prima SYCL compilerebbe un file di origine e produrrebbe un file di intestazione (stub) come output. Questo file di intestazione contiene i binari per tutte le funzioni del kernel in un formato supportato da OpenCL (come SPIR), nonché la funzionalità di collante per istruire il runtime dell'host lato SYCL su come impostare gli argomenti e eseguire le funzioni del kernel. In secondo luogo, lo stesso file di origine verrà compilato da un compilatore host standard come GCC o VisualC. Quando il file di origine viene compilato dal compilatore host, viene incluso il file di intestazione generato dallo stub, quindi incorporando i binari del kernel nell'applicazione finale e rendendoli disponibili al runtime lato host SYCL.
Ogni vendor hardware può mettere a disposizione estensioni specifiche per le proprie periferiche così da permettere una più veloce interfaccia con OpenCL/SYCL e per ottenere funzioni ed ottimizzazioni particolari. A tutt'oggi SYCL è supportato da Intel, Xilinx, Renesas, Imagination Technologies, AMD, Nvidia.

## Programmi

Alcuni programmi sono già stati convertiti per l'utilizzo con OpenCl grazie a SYCL, come Eigen (librerie matematiche), Tensorflow (Intelligenza Artificiale), Layar (Realtà aumentata) e Artsy (piattaforma web).