====== 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