Das Unternehmen Intel hat den Compiler ISPC 1.31 (Implicit SPMD Program Compiler) veröffentlicht, der zum Kompilieren von C-Code mit Erweiterungen für paralleles SPMD-Programmieren (Single Program, Multiple Data) dient. Dies ermöglicht die parallele Ausführung mehrerer Instanzen eines Programms mit unterschiedlichen Eingabewerten. Der Quellcode des Projekts ist in C++ geschrieben und wird unter der BSD-Lizenz verteilt. Es wird Unterstützung für Linux, Windows, macOS und FreeBSD geboten.
C-Programme mit SPMD-Erweiterungen werden für die Ausführung auf SIMD-Recheneinheiten, die von CPU und GPU bereitgestellt werden, kompiliert. Dies ermöglicht die Nutzung der SIMD-Vektorisierungsmechanismen ohne niedrigstufige Optimierungen und die explizite Verwendung von SIMD-Anweisungen im Code. Zum Schreiben von parallelisierbaren Funktionen wird die vertraute Syntax und Idiomatik der Programmiersprache C verwendet — SPMD-Funktionen interagieren direkt mit Funktionen und Strukturen, die in C/C++ geschrieben sind. Für das Debuggen von Programmen können vorhandene Debugger verwendet werden.
Für die Codegenerierung und Optimierung in ISPC wird die LLVM-Infrastruktur als Backend verwendet. Es werden vektorielle x86-Instruktionen (SSE2, SSE4, AVX, AVX2, AVX512) und ARM (NEON) sowie die Auslagerung von Berechnungen auf die GPU (Intel Gen9 und Xe) unterstützt. Auf Architekturen mit SSE-Vektorblöcken, die 4 Elemente gleichzeitig verarbeiten, ermöglicht die Nutzung von ISPC eine Beschleunigung der Programmausführung um das 3-fache oder mehr, während auf Architekturen mit AVX-Vektorblöcken, die 8 Elemente gleichzeitig verarbeiten, eine Beschleunigung von 5-6-fach erreicht werden kann. Neben der Größe des Vektorblocks wird die Skalierung auch durch die Ausführung auf verschiedenen Prozessorkernen unterstützt.
Die wichtigsten Neuerungen in Version ISPC 1.31:
- Es wurde experimentelle Unterstützung für die 64-Bit-Little-Endian-Architektur PowerPC (ppc64le) hinzugefügt. Standardmäßig erfolgt der Build für POWER ISA 2.7 (POWER8+) mit VSX-Erweiterungen (Vector Scalar Extension).
- Neue Build-Ziele avx10.2nvl-x4, avx10.2nvl-x8, avx10.2nvl-x16, avx10.2nvl-x32 und avx10.2nvl-x64 wurden hinzugefügt, die die Unterstützung für die erweiterten Befehls- sätze AVX10.2 (Advanced Vector Extensions) und APX (Advanced Performance Extensions) für Prozessoren auf Basis der Mikroarchitektur Intel Nova Lake implementieren.
- Im Dispatcher steht eine Auswahl an Build-Zielvarianten mit Unterstützung für AMX (avx512spr, avx512gnr, avx10.2dmr) nur bei tatsächlicher Unterstützung der AMX-Erweiterungen (Advanced Matrix Extensions) im Betriebssystem und der CPU zur Verfügung.
- Die Option „—opt=disable-apx“ wurde hinzugefügt, um bestimmte Funktionen von x86 APX (egpr, ndd, push2pop2, ppx, ccmp, cf, nf, zu und jmpabs) selektiv zu deaktivieren, die standardmäßig in den APX unterstützenden Build-Zielen wie avx10.2dmr und avx10.2nvl aktiviert sind.
- Die Modi „balanced“ und „aggressive“ zur Optimierung mathematischer Berechnungen wurden hinzugefügt und können über die Option „—opt=fast-math“ aktiviert werden, wobei sie aggressiver sind als der standardmäßig verwendete Optimierungsmodus.
- Neue mathematische Funktionen wurden zur Standardbibliothek hinzugefügt:
erf, erfc (Fehlerfunktionen von Gauss), expm1 (exakte Berechnung von „exp(x)-1“), log1p („log(1+x)“), sinh, cosh und tanh (hyperbolischer Sinus, Kosinus und Tangens). Die Genauigkeit und Leistung der Funktionen asin, acos, atan und log wurden erheblich gesteigert. - Die Leistung der 32-Bit-Shuffle-Operationen wurde für das Build-Ziel avx2-i32x16 und die popcnt-Berechnungen für die Ziele avx2-i8x32, avx512skx-x32 und avx512skx-x64 erheblich verbessert.
- Das LLVM-Toolset wurde auf die in Entwicklung befindliche Version 23 aktualisiert.
Quelle: opennet.ru
