====== 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. → [[lyx_-_programmiersprache:units|Standard Library]] · [[lyx_-_programmiersprache:units:cpu:dispatch|std.cpu.dispatch]] · [[lyx_-_programmiersprache:start|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 keine ''pub''-Deklarationen; die Import-Pfade verwenden den Dev-Präfix ''src.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 erneutes ''Open'' / ''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 beim ''Open'' fehl). * **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