Intel ha publicat ISPC 1.26 (Implicit SPMD Program Compiler), dissenyat per muntar codi C amb extensions de programació paral·lela SPMD (Single Program, Multiple Data), que permeten l'execució paral·lela de diverses instàncies del mateix programa amb diferents conjunts de dades d'entrada. El codi del projecte està escrit en C++ i distribuït sota la llicència BSD. Admet el treball a Linux, Windows, macOS i FreeBSD.
Els programes C amb extensions SPMD es compilen per a l'execució en unitats computacionals SIMD proporcionades per la CPU i la GPU, la qual cosa us permet utilitzar mecanismes de vectorització SIMD sense optimitzacions de baix nivell i l'ús explícit d'instruccions SIMD al codi. Per escriure funcions paral·lelitzables, s'utilitzen la sintaxi i els idiomes familiars del llenguatge C: les funcions SPMD interactuen directament amb funcions i estructures escrites en C/C++. Els depuradors existents es poden utilitzar per depurar programes.
ISPC utilitza la infraestructura LLVM com a backend per a la generació i optimització de codi. S'admeten instruccions vectorials x86 (SSE2, SSE4, AVX, AVX2, AVX512) i ARM (NEON), així com la descàrrega de càlculs al costat de la GPU (Intel Gen9 i Xe). En arquitectures amb blocs vectorials SSE que processen 4 elements alhora, l'ús d'ISPC permet aconseguir una acceleració d'execució del programa 3 o més vegades, i en arquitectures amb blocs vectorials AVX que processen 8 elements alhora, l'acceleració pot arribar a 5- 6 vegades. A més, a més de la mida del bloc vectorial, l'escalat també està garantit mitjançant l'execució en diferents nuclis de processador.
Innovacions clau afegides a ISPC versió 1.26:
- Suport millorat per a l'arquitectura ARM:
- S'ha canviat el comportament del senyalador "--arch=arm", que ara està associat amb l'arquitectura ARMv8 (32 bits), no amb ARMv7 (per a ARMv8 en mode de 64 bits, encara s'hauria d'utilitzar el senyalador "--arch=aarch64").
- El suport per als processadors ARMv7 Cortex-a9 i Cortex-a15 s'ha interromput.
- S'ha afegit suport per als processadors Cortex-a55, Cortex-a78, Cortex-a510, Cortex-a520, així com nous processadors Apple ARM.
- S'han afegit nous objectius de construcció: neon-i16x16 i neon-i8x32.
- S'ha afegit suport per a operacions basades en instruccions vectorials ARM SDOT i UDOT.
- S'ha realitzat l'optimització, el rendiment d'ARMv8 ha augmentat un 13% de mitjana.
- S'ha afegit un nou tipus d'objectius de compilació: "genèrics", que permet optimitzar l'arquitectura interna del compilador i simplificar l'addició de nous objectius de compilació. La idea és donar suport a objectius bàsics per a capacitats de maquinari específiques, a sobre dels quals es poden construir fàcilment objectius amb optimitzacions específiques. El suport per a l'arquitectura ARM s'ha canviat per utilitzar objectius genèrics.
- El generador de codi s'ha ajustat el bucle i el desenrotllament de la funció per reduir la mida del codi resultant en el mode d'optimització "-O1". Generació de codi millorada per a les funcions integrades count_leading_zeros i count_trailing_zeros, així com quan es retornen estructures de funcions i quan es desa o es carreguen dades amb tipus int8/int16.
- Suport ampliat per a LLVM intrínsics, activat especificant la marca "--enable-llvm-intrinsics".
- Cadena d'eines LLVM actualitzada a la versió 18.1.8 amb pedaços. S'ha afegit una macro per detectar la versió LLVM utilitzada a ISPC.
- Es permet aplicar l'atribut "__attribute__((obsolet))" a les funcions per imprimir un avís quan es crida la funció.
- S'ha eliminat l'objectiu de compilació avx512knl-x16 (KNL).
- S'ha afegit l'opció "--darwin-version-min" per especificar la versió mínima admesa de la plataforma de destinació per a macOS i iOS.
Font: opennet.ru
