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