Kernoscope 0.2.0 环境自检 (doctor)

[主机]
  ✓ Python                     3.12.3 on Linux 5.15.0-94-generic

[硬件与驱动]
  ✓ GPU                        NVIDIA GeForce RTX 4090 · driver 580.105.08 · sm_89 · 24564 MiB

[内核驱动策略]
  ! 内核驱动策略                     RmProfilingAdminOnly = 1（仅 admin 可用性能计数器）
      → ncu/DCGM PROF 等计数器类工具会报 ERR_NVGPUCTRPERM

[容器权限]
  ✓ 进程身份                       uid=0（root）
  ✗ CAP_SYS_ADMIN              生效集无，边界集也没有
      → 容器内无法获得硬件计数器权限（su/setuid/file-cap 都无法突破 CapBnd）
  ✗ CAP_PERFMON                生效集无，边界集也没有
      → 容器内无法获得硬件计数器权限（su/setuid/file-cap 都无法突破 CapBnd）

[工具链]
  ✓ nsys                       2025.3.1
      → 提供 exact 的 LaunchStats / 时长（CUPTI activity，不需要计数器）
  ✓ cuobjdump                  13.0
      → 提供静态寄存器/共享内存与 SASS 指令混合（exact，且不需要 GPU）
  ✓ nvidia-smi                 present
      → 提供设备级计数器：能耗/显存忙碌/时钟功耗（measured，无需 admin）
  ✓ pynvml                     已安装
      → 可读能量累加器 → 每 kernel 能耗
  ! CPU perf_event_paranoid    = 4
      → CPU 侧硬件计数器（perf）对非特权用户不可用

[可选后端]
  ✓ NVBit                      <workdir>/lab/nvbit_release_x86_64
      → 指令级归因 / 访存轨迹 / sectors-per-request / locality

[硬件计数器判定]
  ✗ 硬件计数器（ncu）                 /usr/local/cuda/bin/ncu 实测被拒：ERR_NVGPUCTRPERM
      → requires GPU hardware performance counters, which are restricted here (RmProfilingAdminOnly=1 and no CAP_SYS_ADMIN/CAP_PERFMON in the container); CUPTI reports ERR_NVGPUCTRPERM

[可交付的度量能力]
  exact       
      · kernel 时长与 launch 配置 (LaunchStats)
      · 同一 kernel 的多组 launch 配置（LaunchConfigs，形状扫描用）
      · 理论 occupancy 上界与限制因素
      · 静态寄存器/共享内存、SASS 指令混合
  measured    
      · NVML 原始读数：显存忙碌占比 / 时钟 / 功耗 / 能量（管理计数器）
      · 访存轨迹入口（NVBit 外部工具产出的 trace）：sectors/request、合并效率、工作集
  derived     
      · 采样窗口覆盖率（由 NVML 采样点统计）
      · 账本对拍误差与区间判词（由估算与你的账本推出）
  estimated   
      · DRAM 字节/吞吐代理（NVML 显存忙碌 × 本机实测峰值，误差带见 bench/artifacts）
      · roofline 与 SpeedOfLight（需 --ks-calibration 本机标定 + 你提供 FLOPs/bytes）
      · 访存轨迹的 L1/L2 命中率与 DRAM 字节（缓存模型，上界口径）
  unavailable 
      · MemoryWorkloadAnalysis（精确字节/命中率/sector 效率）
      · ComputeWorkloadAnalysis（各 pipe 动态利用率）
      · SchedulerStats / WarpStateStats（stall 周期归因）
      · SourceCounters（PC 采样）与 PmSampling
      原因: requires GPU hardware performance counters, which are restricted here (RmProfilingAdminOnly=1 and no CAP_SYS_ADMIN/CAP_PERFMON in the contai

[工具发现（多路径，不只看 PATH）]
  · nsys         /usr/local/bin/nsys
  · ncu          /usr/local/cuda/bin/ncu
  · cuobjdump    /usr/local/cuda/bin/cuobjdump
  · nvidia-smi   /usr/bin/nvidia-smi
  · 计数器结论: denied —— ncu 存在于 /usr/local/cuda/bin/ncu，实测被拒（ERR_NVGPUCTRPERM，policy）

[后端计划]
  · nsys → LaunchStats / 时长 / 时间线 (exact)
  · NVML/nvidia-smi → 设备级计数器 (measured)
  · cuobjdump → 静态资源与 SASS 混合 (exact)

[建议]
  · 首次使用先做一次机器标定：`uv run python tools/machine-profile.py --quick`，然后加 `--ks-calibration machine-profile.json` 得到可信 roofline（标定会同时记录累加口径与口径离散度；缺字段时 compute roof 会被拒绝，见 R-09）
  · 报告里出现 `n/a` 属预期：那是需要硬件计数器的指标，用 `--strict` 可让 CI 在请求这类数据时直接失败
  · 想拿账本对拍：`--ks-ledger-mb <每次 launch 的 MB>`（或 --ks-ledger-total-mb 总量口径），并让被测 kernel 在紧循环里跑满；默认 `--ks-window auto` 会自动裁掉 import/JIT 的启动开销
  · 代理口径不成立（显存忙碌读数为 0、窗口覆盖率不足）时，用 `--ks-memtrace <trace>` 换用访存轨迹口径做账本对拍（R-33）

结论: 核心路径可用   （用 --json 获取机器可读结果）
