L'azienda Intel ha rilasciato il compilatore ISPC 1.31 (Implicit SPMD Program Compiler), progettato per la compilazione di codice in linguaggio C con estensioni per la programmazione parallela SPMD (Single Program, Multiple Data), che consentono l'esecuzione parallela di più istanze di un programma con set di dati di input diversi. Il codice del progetto è scritto in C++ e distribuito con licenza BSD. Sono supportati i sistemi 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.31:
- È stata aggiunta il supporto sperimentale per l'architettura PowerPC little-endian a 64 bit (ppc64le). Di default, la compilazione avviene per POWER ISA 2.7 (POWER8+) con estensioni VSX (Vector Scalar Extension).
- Sono stati aggiunti nuovi obiettivi di compilazione avx10.2nvl-x4, avx10.2nvl-x8, avx10.2nvl-x16, avx10.2nvl-x32 e avx10.2nvl-x64, che implementano il supporto per i set di istruzioni AVX10.2 (Advanced Vector Extensions) e APX (Advanced Performance Extensions) per i processori basati sull'architettura microarchitetturale Intel Nova Lake.
- Nel gestore delle build è stata fornita la selezione delle opzioni per gli obiettivi di build con supporto AMX (avx512spr, avx512gnr, avx10.2dmr) solo con il reale supporto delle estensioni AMX (Advanced Matrix Extensions) nel sistema operativo e nella CPU.
- È stata aggiunta l'opzione «—opt=disable-apx» per disabilitare selettivamente singole funzionalità x86 APX (egpr, ndd, push2pop2, ppx, ccmp, cf, nf, zu e jmpabs), che sono abilitate di default negli obiettivi di build che supportano APX, come avx10.2dmr e avx10.2nvl.
- Sono stati aggiunti i regimi di ottimizzazione dei calcoli matematici 'bilanciato' ('balanced') e 'aggressivo' ('aggressive'), attivabili tramite l'opzione «—opt=fast-math» e più aggressivi rispetto alla modalità di ottimizzazione utilizzata di default.
- Sono state aggiunte nuove funzioni matematiche alla libreria standard:
erf, erfc (funzioni di errore di Gauss), expm1 (calcolo esatto di «exp(x)-1»), log1p («log(1+x)»), sinh, cosh e tanh (seno iperbolico, coseno iperbolico e tangente iperbolica). È stata migliorata la precisione e le prestazioni delle funzioni asin, acos, atan e log. - Significativamente migliorata la performance delle operazioni di permutazione a 32 bit (shuffles) per l'obiettivo di build avx2-i32x16 e di calcolo popcnt per gli obiettivi avx2-i8x32, avx512skx-x32 e avx512skx-x64.
- Il toolkit LLVM è stato aggiornato alla versione in fase di sviluppo 23.
Fonte: opennet.ru
