Das Unternehmen Intel hat den Compiler ISPC 1.26 (Implicit SPMD Program Compiler) veröffentlicht, der zur Kompilierung von C-Code mit Erweiterungen für paralleles Programmieren SPMD (Single Program, Multiple Data) dient. Diese Erweiterungen ermöglichen die parallele Ausführung mehrerer Instanzen eines Programms mit unterschiedlichen Datensätzen. Der Projektcode ist in C++ geschrieben und wird unter der BSD-Lizenz bereitgestellt. Es wird die Nutzung unter Linux, Windows, macOS und FreeBSD unterstützt.
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 der Version ISPC 1.26:
- Verbesserte Unterstützung für die ARM-Architektur:
- Das Verhalten des Flags „—arch=arm“ wurde geändert, das jetzt mit der ARMv8-Architektur (32-Bit) verknüpft ist, und nicht mehr mit ARMv7 (für ARMv8 im 64-Bit-Modus sollte wie zuvor das Flag „—arch=aarch64“ verwendet werden).
- Die Unterstützung für ARMv7 Cortex-a9 und Cortex-a15-Prozessoren wurde eingestellt.
- Unterstützung für Cortex-a55, Cortex-a78, Cortex-a510, Cortex-a520 sowie neue ARM-Prozessoren von Apple hinzugefügt.
- Neue Build-Ziele hinzugefügt: neon-i16x16 und neon-i8x32.
- Unterstützung für Operationen basierend auf ARM-Vektorinstruktionen SDOT und UDOT hinzugefügt.
- Optimierungen wurden durchgeführt, die Leistung für ARMv8 wurde im Durchschnitt um 13 % gesteigert.
- Ein neuer Typ von Build-Zielen wurde hinzugefügt – „generic“, der es ermöglicht, die interne Architektur des Compilers zu optimieren und das Hinzufügen neuer Build-Ziele zu vereinfachen. Die Idee besteht darin, grundlegende Ziele für spezifische Hardwaremerkmale zu unterstützen, auf denen leicht Ziele mit spezifischen Optimierungen erstellt werden können. Die Unterstützung für die ARM-Architektur wurde auf die Verwendung von Generic-Zielen umgestellt.
- Im Code-Generator wurde die Schleifen- und Funktionsentfaltung angepasst, um die Größe des resultierenden Codes im Optimierungsmodus „-O1“ zu reduzieren. Die Code-Generierung für die eingebetteten Funktionen count_leading_zeros und count_trailing_zeros sowie beim Rückgeben von Strukturen aus Funktionen und beim Speichern oder Laden von Daten mit den Typen int8/int16 wurde verbessert.
- Die Unterstützung für LLVM-Befehlsfunktionen (Intrinsics) wurde erweitert, die aktiviert werden kann, indem das Flag „—enable-llvm-intrinsics“ angegeben wird.
- Das LLVM-Toolkit wurde auf Version 18.1.8 mit Patches aktualisiert. Ein Makro zur Bestimmung der in ISPC verwendeten LLVM-Version wurde hinzugefügt.
- Die Verwendung des Attributs „__attribute__((deprecated))“ für Funktionen wurde erlaubt, um bei einem Funktionsaufruf eine Warnung auszugeben.
- Das Build-Ziel avx512knl-x16 (KNL) wurde entfernt.
- Die Option „—darwin-version-min“ wurde hinzugefügt, um die minimal unterstützte Version der Zielplattform für macOS und iOS anzugeben.
Quelle: opennet.ru
