std.cpu.features — CPU-Feature-Erkennung
Erkennt zur Laufzeit, welche SIMD-Erweiterungen die aktuelle CPU unterstützt (SSE2, SSE4.1, AVX2). Das Ergebnis wird beim ersten Aufruf gecacht und dann ohne erneuten Syscall zurückgegeben.
→ Standard Library · std.cpu.dispatch · Lyx-Dokumentation
Implementierungsstand: Diese Unit ist Teil von WP-GPU-02 des internen SIMD/GPU-Fahrplans und befindet sich in aktiver Entwicklung. Konstanten und Funktionen tragen noch keinepub-Deklarationen; die Import-Pfade verwenden den Dev-Präfixsrc.std.*.
Import
import std.cpu.features;
Konstanten
Die Feature-Flags sind Bits einer int64-Maske:
| Konstante | Wert | Bedeutung |
|---|---|---|
CPU_FEAT_SSE2 | 1 | Streaming SIMD Extensions 2 (128-Bit, 2001+) |
CPU_FEAT_SSE41 | 2 | SSE4.1 (Blend, DotProduct, Muxer-Ops) |
CPU_FEAT_AVX2 | 4 | Advanced Vector Extensions 2 (256-Bit, Haswell+) |
Funktionen
CpuFeatureDetect
fn CpuFeatureDetect(): int64
Liest /proc/cpuinfo (max. 8 192 Byte), sucht nach den Token `` sse2``, `` sse4_1`` und `` avx2`` und gibt die kombinierte Feature-Maske zurück. Das Ergebnis wird in einem Modul-Global gecacht — /proc/cpuinfo wird nur beim ersten Aufruf gelesen.
| Rückgabe | Bedeutung |
|---|---|
| Bitmask (int64) | OR-Verknüpfung aller erkannten CPU_FEAT_*-Flags |
| 0 | Keine erkannten Features oder /proc/cpuinfo nicht lesbar |
CpuHasSSE2 / CpuHasSSE41 / CpuHasAVX2
fn CpuHasSSE2(): int64 // 1 wenn SSE2 verfügbar, sonst 0
fn CpuHasSSE41(): int64 // 1 wenn SSE4.1 verfügbar, sonst 0
fn CpuHasAVX2(): int64 // 1 wenn AVX2 verfügbar, sonst 0
Convenience-Wrapper über CpuFeatureDetect(). Jeder Aufruf prüft die gecachte Maske mit dem entsprechenden CPU_FEAT_*-Bit.
Interne Helfer
| Funktion | Signatur | Zweck |
|---|---|---|
cpu_memmem | (haystack: pchar, hlen: int64, needle: pchar, nlen: int64): int64 | Sucht needle in haystack; gibt 1 zurück wenn gefunden, sonst 0 |
cpu_memmem ist modul-intern und nicht von außen aufrufbar.
Verhalten und Caching
- Einmaliger Syscall: Nach dem ersten
CpuFeatureDetect()-Aufruf werden alle weiteren Aufrufe aus dem Cache bedient — kein erneutesOpen/Read. - Linux only: Die Erkennung basiert ausschließlich auf
/proc/cpuinfo. Auf macOS, Windows oder Bare-Metal ist die Funktion nicht verwendbar (gibt 0 zurück oder schlägt beimOpenfehl). - Kein cpuid-Instruktionsaufruf: Die Implementierung verwendet keinen direkten x86-
cpuid-Befehl, sondern den Kernel-seitigen/proc-Eintrag. - Kein Reset: Der Cache kann nicht zurückgesetzt werden. Ein dynamischer CPU-Wechsel (Hotplug, Migration) wird nicht erkannt.
Codebeispiel
import std.cpu.features;
import std.io;
fn main() {
var level: int64 := CpuFeatureDetect();
if (CpuHasAVX2() != 0) {
PrintLn("CPU: AVX2 verfügbar (256-Bit SIMD)");
} else if (CpuHasSSE2() != 0) {
PrintLn("CPU: SSE2 verfügbar (128-Bit SIMD)");
} else {
PrintLn("CPU: Kein SIMD — Scalar-Pfad aktiv");
}
// Direkte Bitmask-Auswertung
if ((level & CPU_FEAT_SSE41) != 0) {
PrintLn("SSE4.1 erkannt");
}
}
Einschränkungen
| Thema | Details |
|---|---|
| Plattform | Nur Linux (proc/cpuinfo vorausgesetzt) |
| Keine cpuid | Kernel-seitiger Eintrag, kein direkter cpuid-Befehl |
| Kein Cache-Reset | Einmal erkannte Features bleiben für die gesamte Laufzeit gecacht |
| Kein AVX-512 | Nur SSE2, SSE4.1, AVX2 werden geprüft |
| Entwicklungsstand | WP-GPU-02; keine pub-Deklarationen; Import-Pfad src.std.* |
| GPU-Units | std.gpu.* existiert noch nicht (WP-GPU-07–09, geplant) |
Letzte Aktualisierung: 2026-06-13
