La società Intel ha pubblicato il compilatore ISPC 1.26 (Implicit SPMD Program Compiler), progettato per assemblare codice in linguaggio C con estensioni di programmazione parallela SPMD (Single Program, Multiple Data), che consentono l'esecuzione parallela di più istanze di un singolo programma con set di dati in ingresso diversi. Il codice del progetto è scritto in C++ ed è distribuito con licenza BSD. È supportato l'uso su Linux, Windows, macOS e FreeBSD.
I programmi in C con estensioni SPMD vengono compilati per l'esecuzione su blocchi di calcolo SIMD forniti da CPU e GPU, permettendo di sfruttare i meccanismi di vettorizzazione SIMD senza ottimizzazioni a basso livello e senza l'uso esplicito delle istruzioni SIMD nel codice. Per scrivere funzioni parallele si utilizza la sintassi e le idiome familiari del linguaggio C; le funzioni SPMD interagiscono direttamente con le funzioni e le strutture scritte in C/C++. Per il debug dei programmi possono essere utilizzati i debugger esistenti.
Per la generazione del codice e l'ottimizzazione in ISPC viene utilizzata l'infrastruttura LLVM. Sono supportate le istruzioni vettoriali x86 (SSE2, SSE4, AVX, AVX2, AVX512) e ARM (NEON), oltre all'allocazione dei calcoli su GPU (Intel Gen9 e Xe). Su architetture con blocchi vettoriali SSE, che elaborano 4 elementi alla volta, l'utilizzo di ISPC permette di ottenere un'accelerazione delle prestazioni del programma di 3 volte o più, mentre su architetture con blocchi vettoriali AVX, che elaborano 8 elementi alla volta, l'accelerazione può raggiungere 5-6 volte. Oltre alla dimensione del blocco vettoriale, la scalabilità è garantita anche grazie all'esecuzione su diversi core del processore.
Le principali novità introdotte nella versione ISPC 1.26:
- Migliorato il supporto per l'architettura ARM:
- Modificato il comportamento del flag "—arch=arm", ora associato all'architettura ARMv8 (32-bit), mentre per ARMv8 in modalità 64-bit, come prima, si deve utilizzare il flag "—arch=aarch64".
- Interrotta la supporto per i processori ARMv7 Cortex-a9 e Cortex-a15.
- Aggiunto il supporto per i processori Cortex-a55, Cortex-a78, Cortex-a510, Cortex-a520, e per i nuovi processori ARM di Apple.
- Aggiunti nuovi obiettivi di compilazione: neon-i16x16 e neon-i8x32.
- Aggiunto il supporto per operazioni basate su istruzioni vettoriali ARM SDOT e UDOT.
- Ottimizzazione effettuata, le prestazioni per ARMv8 sono aumentate in media del 13%.
- È stata aggiunta una nuova tipologia di obiettivi di compilazione — «generic», che ha permesso di ottimizzare l'architettura interna del compilatore e semplificare l'aggiunta di nuovi obiettivi di compilazione. L'idea è di supportare obiettivi di base per capacità hardware specifiche, sopra le quali è facile creare obiettivi con ottimizzazioni specifiche. Il supporto per l'architettura ARM è stato trasferito agli obiettivi generic.
- Nel generatore di codice è stata effettuata una correzione nel dispiegamento di cicli e funzioni per ridurre la dimensione del codice risultante in modalità ottimizzazione «-O1». È migliorata la generazione di codice per le funzioni integrate count_leading_zeros e count_trailing_zeros, oltre a quando si restituiscono strutture da funzioni e durante il salvataggio o il caricamento di dati con tipi int8/int16.
- È stata ampliata la supporto per le funzioni incorporate (intrinsics) LLVM, attivabile specificando il flag «—enable-llvm-intrinsics».
- Il toolkit LLVM è stato aggiornato alla versione 18.1.8 con patch. È stato aggiunto un macro per determinare la versione di LLVM utilizzata in ISPC.
- È consentito applicare l'attributo «__attribute__((deprecated))» alle funzioni per generare un avviso quando viene chiamata una funzione.
- È stato rimosso l'obiettivo di compilazione avx512knl-x16 (KNL).
- È stata aggiunta l'opzione «—darwin-version-min» per specificare la versione minima supportata della piattaforma target per macOS e iOS.
Fonte: opennet.ru
