Intel published compiler ISPC 1.32 (Implicit SPMD Program Compiler), designed for assembling C code with parallel programming extensions SPMD (Single Program, Multiple Data), allowing for parallel execution of several instances of the same program with different sets of input data. The project code is written in C++ and distributed under the BSD license. Supports work on Linux, Windows, macOS and FreeBSD.
C programs with SPMD extensions are compiled for execution on SIMD computational units provided by the CPU and GPU, which allows you to use SIMD vectorization mechanisms without low-level optimizations and explicit use of SIMD instructions in the code. To write parallelizable functions uses the familiar syntax and idioms of the C language – SPMD functions directly interact with functions and structures written in C/C++. Existing debuggers can be used to debug programs.
The LLVM infrastructure is used as a backend for code generation and optimization in ISPC. x86 (SSE2, SSE4, AVX, AVX2, AVX512) and ARM (NEON) vector instructions are supported, as well as offloading calculations to the GPU side (Intel Gen9 and Xe). On architectures with SSE vector blocks that process 4 elements at a time, the use of ISPC makes it possible to achieve program execution acceleration by 3 or more times, and on architectures with AVX vector blocks that process 8 elements at a time, the acceleration can reach 5-6 times. Moreover, in addition to the size of the vector block, scaling is also ensured by execution on different processor cores.
Main innovations added in version ISPC 1.32:
- Full support for the AVX10.2 and APX (Advanced Performance Extensions) extensions is provided, used when generating code for assembly purposes avx10.2dmr (Intel Diamond Rapids CPU) and avx10.2nvl (Intel Nova Lake CPU).
- Added support for processors based on the AMD Zen 6 microarchitecture, enabled via the “–cpu=znver6” option.
- Added functions pdep32(), pext32(), pdep64() and pext64() to the standard library to perform operations on the “parallel fetch” and “parallel” bits placement.”
- The ISPC Runtime implements the ispcrtLoadModuleFromMemory() and ispcrtLoadModuleFromMemoryWithOptions() functions, with which you can load a GPU module from the SPIR-V buffer located in RAM.
- The LLVM toolkit has been updated to version 23.1.2. Added initial support for building with the in-development LLVM 24 branch.