Programmieren mit Intrinsics: Code optimieren ohne Assembler

Keine Frage: Compiler erzeugen meist besseren Code als Menschen, doch manchmal muss man ihnen auf die Sprünge helfen. Das gilt besonders für die Verwendung von Vektoranweisungen. Auch hier sind Compiler zwar deutlich besser geworden, übersehen aber oft mögliche Optimierungen. Dann hilft alles nichts und man muss selbst ran und passenden Code schreiben. Da Hochsprachen wie C und C++ aber keine Vektorbefehle mitbringen, bedeutet das, Assembler-Code zu schreiben und mit Registern zu jonglieren. Es geht aber auch einfacher: Mit Intrinsics lassen sich Vektorbefehle und andere plattformspezifische Anweisungen auch ohne Assembler verwenden. Wir zeigen, wie das funktioniert.
Intrinsics sind architekturabhängige Funktionen, die der jeweils passende Compiler mitbringt. Um sie zu verwenden, muss eine Header-Datei eingebunden werden, beim gcc etwa avx2intrin.h für AVX 2 oder arm_neon.h für Anweisungen aus ARMs Vektorerweiterung Neon. Die definiert neben den Intrinsics oft auch noch passende Datentypen, denn besonders Vektoreinheiten erfordern häufig eine besondere Struktur der Daten im Speicher. Variablen müssen etwa oft an 16- oder 64-Byte-Adressen liegen, auch hierum müssen sich Programmierer nicht weiter kümmern. Wir beschränken uns hier auf Vektorerweiterungen, darüber hinaus können durchaus noch weitere Intrinsics für andere plattformspezifische Befehle existieren.