Intel hat den Compiler ISPC 1.24 (Implicit SPMD Program Compiler) veröffentlicht, der die Kompilierung von C-Code mit Erweiterungen für die Unterstützung der parallelen Programmierungsmethode SPMD (Single Program, Multiple Data) ermöglicht, bei der mehrere Instanzen eines Programms parallel mit unterschiedlichen Datensätzen ausgeführt werden. Der Projektcode ist in C++ geschrieben und unter der BSD-Lizenz erhältlich. Die Nutzung wird in Linux, Windows, macOS und FreeBSD unterstützt.
Das C-Programm mit SPMD-Erweiterungen wird für die Ausführung auf den SIMD-Berechnungsblöcken bereitgestellt, die von CPU und GPU angeboten werden, wodurch die Mechanismen der SIMD-Vektorisierung in Programmen ohne tiefgreifende Optimierungen und die explizite Verwendung von SIMD-Befehlen im Code genutzt werden können. Zum Schreiben von parallelisierbaren Funktionen wird die vertraute Syntax und Idiomatik der Programmiersprache C verwendet. Diese SPMD-Funktionen können in Anwendungen auf C/C++ integriert werden und direkt mit deren Funktionen und Strukturen interagieren. Zur Fehlersuche können bestehende Debugger eingesetzt werden.
Als Backend für die Codegenerierung und -optimierung wird die LLVM-Infrastruktur verwendet. Die Verwendung von Vektorbefehlen sowohl für x86 (SSE2, SSE4, AVX, AVX2, AVX512) als auch für ARM (NEON) wird unterstützt, ebenso wie die Auslagerung von Berechnungen auf die GPU (Intel Gen9 und Xe). Auf Architekturen mit SSE-Vektorblöcken, die vier Elemente gleichzeitig verarbeiten, ermöglicht der Einsatz von ISPC eine Beschleunigung der Programmausführung um das 3-fache oder mehr, während bei Architekturen mit AVX-Vektorblöcken, die acht Elemente pro Durchgang verarbeiten, eine Beschleunigung von 5-6 mal erreicht werden kann. Neben der Größe des Vektorblocks wird die Skalierung auch durch die Ausführung auf verschiedenen Prozessorkernen erreicht.
Die wichtigsten Neuerungen in der Version ISPC 1.24:
- Die Unterstützung für untypisierte Parameter in Funktionstemplates wurde hinzugefügt. In Funktionstemplates können jetzt einheitliche Ganzzahlen und Enumerationen (mit dem „uniform“-Flag) als Parameter verwendet werden.
- Es wurden Dot-Funktionen für die vorzeichenbehafteten und vorzeichenlosen Typen int8 und int16 hinzugefügt, bei denen die Befehle AVX-VNNI und AVX512-VNN verwendet werden.
- Definitionen von Makros wurden hinzugefügt, die die Größenbeschränkungen von Zahlen festlegen.
- Neue Zielplattformen hinzugefügt: avx2vnni-i32x4, avx2vnni-i32x8, avx2vnni-i32x16 mit Unterstützung für den AVX-VNNI-Befehl, sowie avx512icl-x4, avx512icl-x8, avx512icl-x16, avx512icl-x32, avx512icl-x64 mit Unterstützung für den AVX512-VNNI-Befehl.
- Probleme mit der Nutzung überflüssiger Vektorbefehle bei der Codegenerierung für GPU wurden behoben.
- Die Befehlszeilenflagge „—pic“ wurde mit dem Flag „-fpic“ in Clang und GCC übereingestimmt, und das Flag „—PIC“ mit „-fPIC“.
Quelle: opennet.ru
