CommunityCodierung & Entwicklunggithub.com

Nsight Compute Analyse

Analysiere `ncu` Profiling-Output (NVIDIA Nsight Compute): SOL%-Engpassklassifizierung, Roofline-Analyse, Belegungsdiagnose, Speicherhierarchie-Analyse, Warp-Stall-Analyse, Metrikinterpretation und programmatische .ncu-rep Berichtsanalyse. NICHT zum Schreiben von Kerneln oder zur Codegenerierung, Nsight Systems (nsys), Host-seitigem Profiling oder Systemlevel-Profiling.

Was ist Nsight Compute Analyse?

Dieses Skill ermöglicht KI-Agenten eine systematische und datengesteuerte Analyse von CUDA-Kerneln mithilfe von NVIDIA Nsight Compute (ncu). Es hilft, Leistungsengpässe zu klassifizieren – rechnergebunden, speichergebunden oder latenzgebunden –, indem es die Speed-of-Light (SOL%)-Durchsätze von Compute (SM) und Memory interpretiert. Der Anwender wird schrittweise durch die Diagnose geführt: von einer initialen SOL%-Klassifizierung über gezielte, abschnittsbasierte Profilierung mit den entsprechenden `--section`-Flags bis hin zu tiefergehenden Analysen wie Roofline-Charts, Belegungsbewertung und Warp-Stall-Untersuchungen. Es kann in Umgebungen mit CUDA Toolkit (>=11.0) und einer kompatiblen NVIDIA Turing+-GPU eingesetzt werden. Es wertet die Ergebnisse direkt aus den CSV-Ausgaben von ncu aus und extrahiert bei Bedarf Metriken programmatisch aus `.ncu-rep`-Dateien. Das Skill betont Datenintegrität: Jede präsentierte Zahl muss auf einer autoritativen ncu-Quelle basieren. Es deckt auch spezielle Fälle ab, darunter JIT-kompilierte Kernel (z. B. Triton) und die direkte Berichtsanalyse mit dem Python-Modul `ncu_report`. Es ist nicht für das Verfassen von Kerneln, Systemlevel-Profiling (nsys) oder GPU-Monitoring (nvidia-smi) gedacht.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jiweibo/skills/tree/HEAD/perf-nsight-compute-analysis

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Nsight Compute Analyse?

NVIDIA Nsight Compute (ncu) profiliert einzelne CUDA-Kernel, um herauszufinden, warum sie langsam sind und was optimiert werden kann. Es misst den GPU-Durchsatz als Prozentsatz des theoretischen Spitzenwerts (Speed of Light / SOL%), was eine systematische Engpassklassifizierung und gezielte Optimierung ermöglicht.

Wann verwenden

Greifen Sie auf dieses Skill zu, wenn Sie auf Folgendes stoßen:

  • Auslöser: Benutzer möchte einen CUDA-Kernel profilieren, ncu-Ausgabe analysieren, .ncu-rep-Berichte interpretieren oder die GPU-Kernel-Leistung optimieren
  • Symptome: Kernel läuft langsamer als erwartet, geringe GPU-Auslastung, Bedarf, rechnergebundene vs. speichergebundene Engpässe zu klassifizieren, Belegungsprobleme
  • Schlüsselwörter: "ncu", "nsight compute", "SOL%", "speed of light", "Kernel- Profiling", "rechnergebunden", "speichergebunden", "latenzgebunden", "Belegung", "Roofline", "Warp-Stalls", "Cache-Trefferquote", "ncu-rep"

Verwenden Sie dieses Skill NICHT für:

  • Systemlevel-Profiling (verwenden Sie stattdessen Nsight Systems / nsys)
  • CUDA-API-Tracing oder CPU-GPU-Zeitleistenanalyse (verwenden Sie nsys)
  • GPU-Überwachung ohne Profiling (verwenden Sie nvidia-smi)

Anforderungen

AbhängigkeitVersionHinweise
CUDA Toolkit>=11.0Enthält ncu
ncu-BinärdateiEine, die der Treiber unterstütztNsight Compute 2026.3 benötigt einen Treiber, der mit CUDA 13 kompatibel ist. Oder setzen Sie die Umgebungsvariable $NCU
NVIDIA GPUTuring+Volta benötigt Nsight Compute 2025.2 oder älter

Berechtigungen: ncu erfordert möglicherweise sudo, CAP_SYS_ADMIN oder --privileged in Containern. ncu -v gibt nur die Version aus; fehlende Berechtigungen zeigen sich als ERR_NVGPUCTRPERM, wenn der erste Kernel profiliert wird.

Prinzipien

Datenintegrität

Dies ist ein datengesteuertes Analysesystem. Jede Zahl, die Sie präsentieren, muss eine autoritative Quelle haben. Befolgen Sie diese Regeln ausnahmslos:

  1. Zitieren Sie, bevor Sie interpretieren. Wenn Sie Metriken aus der ncu-Ausgabe präsentieren, zeigen Sie immer den tatsächlichen ncu-Befehl, den Sie ausgeführt haben, UND die relevante Rohausgabe (CSV-Zeilen, Metrikwerte), bevor Sie eine numerische Schlussfolgerung ziehen.
  2. Erfinden Sie niemals Metriken. Wenn ncu fehlschlägt, unerwartete Ausgaben liefert oder Sie es nicht ausführen können, sagen Sie dies explizit. Erfinden Sie keine plausibel aussehenden Zahlen. Ein ehrliches „Profiling fehlgeschlagen“ ist besser als erfundene Daten.
  3. Weisen Sie jeden Wert zu. Für jede von Ihnen zitierte Metrik (SOL%, Dauer, Belegung, Durchsatz) muss der Leser sie auf eine bestimmte Zeile in der von Ihnen gezeigten ncu-Rohausgabe zurückverfolgen können.

SOL%-Denkmodell

Speed of Light (SOL%) misst, wie nah ein Kernel an den theoretischen Spitzenwerten der GPU läuft:

  • Rechnen SOL% (Compute (SM) Throughput) = der Durchsatz der am stärksten ausgelasteten SM-Einheit als Prozentsatz ihres Spitzenwerts
  • Speicher SOL% (Memory Throughput) = der Durchsatz der am stärksten ausgelasteten Speichereinheit (DRAM, L2, L1, Shared Memory) als Prozentsatz ihres Spitzenwerts

Die höhere Metrik zeigt normalerweise den Engpasstyp an. Verwenden Sie dies als primäres Klassifizierungssignal. Beide können gleichzeitig hoch sein: Der Kernel ist dann nahe der Hardwaregrenze für seinen Algorithmus.

Klassifizierungsschwellenwerte

Rechnen %Speicher %EngpassNächster Schritt
>60<40RechnergebundenAbschnitt ComputeWorkloadAnalysis
<40>60SpeichergebundenAbschnitt MemoryWorkloadAnalysis
<40<40LatenzgebundenAbschnitte LaunchStats + Occupancy
40-6040-60AusgeglichenTiefer profilieren mit detaillierten Abschnitten
>60>60Nahe HardwaregrenzenAlgorithmische Änderung; beide Arbeitslastabschnitte prüfen

Zusätzliche Signale:

  • Dauer <10us mit vielen Starts -> Startaufwandsgebunden (zuerst nsys verwenden)
  • Beide <40% aber Belegung >50% -> Befehlsgebunden (InstructionStats prüfen)

SOL%-Leistungsstufen

SOL%StufeAktion
>80%AusgezeichnetNur kleinere Optimierungen
60-80%GutGezielte Optimierung
40-60%AusreichendSignifikante Optimierung erforderlich
<40%SchlechtGrundlegende Überarbeitung erforderlich

Abschnitt-zuerst-Profiling

Verwenden Sie immer gezielte --section-Flags anstelle einer massiven --set-Sammlung. Einzelne Abschnitte sind schneller und chirurgischer. Eskalieren Sie nur zu --set basic oder --set detailed, wenn eine breite Erkundung erforderlich ist.

ncu vs. nsys

WerkzeugUmfangOverheadZweck
nsysSystemebene5-10%Finden, welche Kernel optimiert werden sollen
ncuKernel-Ebene10-100x langsamerVerstehen, warum ein Kernel langsam ist

Verwenden Sie zuerst nsys, um die wichtigsten Kernel nach GPU-Zeit zu identifizieren, dann ncu für die detaillierte Analyse dieser spezifischen Kernel.

Arbeitsablauf

Wählen Sie Ihren Pfad basierend auf der Anfrage:

  • Wissensabfrage (welche Metriken zu verwenden sind, --section vs. --set, wie Kernel gefiltert werden): Antworten Sie direkt aus den Prinzipien, der Befehlsreferenz und den folgenden Referenzen. Führen Sie ncu NICHT aus.
  • Schnelldiagnose (Engpass klassifizieren, SOL% prüfen): Nur Schritt 1. Eskalieren, wenn der Benutzer mehr wünscht.
  • Spezifische Diagnose (Bankkonflikte, Registerdruck, Belegung): Schnelle SOL%-Prüfung (Schritt 1), dann direkt zum relevanten Abschnitt in Schritt 2 gehen.
  • Tiefenanalyse (detaillierter Bericht, Optimierungsempfehlungen): Vollständige Schritte 1-5. Präsentieren Sie den vollständigen strukturierten Bericht mit allen Schlüsselmetriken (SOL%, Dauer, Belegung) in Ihrer endgültigen Antwort – teilen Sie den Bericht nicht über mehrere Nachrichten auf oder ersetzen Sie ihn durch eine kurze Zusammenfassung.

Schritt 0: ncu überprüfen

ncu -v
# Oder: $NCU -v

Wenn nicht gefunden, stellen Sie sicher, dass das CUDA Toolkit installiert ist, oder setzen Sie die Umgebungsvariable NCU auf den Binärpfad.

Schritt 1: SOL%-Diagnose

Starten Sie immer mit SpeedOfLight, um den Engpass zu klassifizieren:

ncu --section SpeedOfLight --csv \
    --kernel-name regex:"KERNEL" \
    --launch-skip 5 --launch-count 3 \
    -- COMMAND

Lesen Sie Compute (SM) Throughput und Memory Throughput aus der Ausgabe. Klassifizieren Sie mit den obigen Schwellenwerten.

Schritt 2: Mit gezielten Abschnitten eskalieren

Basierend auf der Klassifizierung aus Schritt 1 fügen Sie Abschnitte hinzu:

KlassifizierungHinzuzufügende Abschnitte
rechnergebundenComputeWorkloadAnalysis
speichergebundenMemoryWorkloadAnalysis
latenzgebundenLaunchStats, Occupancy
Warp-StallsWarpStateStats, SchedulerStats
Benötigt BefehlsaufschlüsselungInstructionStats

Fügen Sie bei der Diagnose latenzgebundener Kernel immer LaunchStats und Occupancy hinzu. Diese decken Registerdruck, Shared-Memory-Grenzen und Blockgrößenprobleme auf.

Beispiel – tiefer Einstieg speichergebunden:

ncu --section SpeedOfLight --section MemoryWorkloadAnalysis --csv \
    --kernel-name regex:"embedding_lookup" \
    --launch-count 3 \
    -- python script.py

Beispiel – tiefer Einstieg rechnergebunden:

ncu --section SpeedOfLight --section ComputeWorkloadAnalysis --csv \
    --kernel-name regex:"gemm|nvjet" \
    --launch-count 3 -- python script.py

Beispiel – Belegungsuntersuchung:

ncu --section SpeedOfLight --section LaunchStats --section Occupancy --csv \
    --kernel-name regex:"small_kernel" \
    -- python script.py

Schritt 3: Roofline-Analyse (Optional)

Für das visuelle Verständnis des Gleichgewichts zwischen Rechnen und Speicher. Die Roofline-Abschnitte sind Diagramme: In der CLI werden sie nur mit --print-details all ausgegeben, was die Zahlen hinter dem Diagramm auflistet (erreichter und Spitzenarbeit und -verkehr). Um das Diagramm zu sehen, speichern Sie einen Bericht mit -o und öffnen Sie ihn in der Nsight Compute-Benutzeroberfläche.

ncu --section SpeedOfLight_RooflineChart --print-details all \
    --kernel-name regex:"KERNEL" -- COMMAND

Für eine präzisionsspezifische hierarchische Roofline:

# FP16 Kernel
ncu --section SpeedOfLight_HierarchicalHalfRooflineChart --print-details all \
    --kernel-name regex:"KERNEL" -- COMMAND

# Tensor-Core-Kernel
ncu --section SpeedOfLight_HierarchicalTensorRooflineChart --print-details all \
    --kernel-name regex:"KERNEL" -- COMMAND

Interpretation: Kernel links vom Roofline-Punkt = speichergebunden; rechts = rechnergebunden; weit unter beiden Dächern = Latenz-/Belegungsproblem. Siehe references/roofline-analysis.md.

Schritt 4: Interpretieren und Optimieren

  1. Identifizieren Sie den dominanten Engpass aus der SOL%-Klassifizierung
  2. Schlagen Sie detaillierte Analyse- und Optimierungsstrategien in references/bottleneck-guide.md nach
  3. Wenden Sie zuerst die Optimierung mit der höchsten Auswirkung an
  4. Wiederholen Sie das Profiling, um die Verbesserung zu validieren und Engpassverschiebungen zu erkennen

Schritt 5: Validieren

Profilerstellen Sie denselben Kernel nach der Optimierung erneut:

ncu --section SpeedOfLight --csv \
    --kernel-name regex:"optimized_kernel" \
    --launch-count 3 \
    -- python optimized_script.py

Vergleichen: Ist der Durchsatz % gestiegen? Ist die Dauer zurückgegangen? Hat sich der Engpasstyp verschoben?

Profiling von JIT-kompilierten Kerneln (Triton/cuTile/CuTeDSL)

JIT-kompilierte Kernel lösen beim ersten Aufruf eine automatische Optimierung aus. Isolieren Sie die tatsächliche Ausführung:

  1. Zuerst aufwärmen: Führen Sie den Kernel 3-5 Mal aus, um die JIT-Kompilierung und automatische Optimierung abzuschließen, dann torch.cuda.synchronize().
  2. Profiler-Marker verwenden: Klammern Sie den gemessenen Bereich mit cudaProfilerStart()/cudaProfilerStop() ein.
  3. --profile-from-start off verwenden, damit ncu nur den markierten Bereich erfasst:
# Aufwärmen (JIT + Autotuning)
for _ in range(5):
    result = kernel(inputs)
torch.cuda.synchronize()

# Nur stationären Zustand profilieren
torch.cuda.cudart().cudaProfilerStart()
for _ in range(3):
    result = kernel(inputs)
    torch.cuda.synchronize()
torch.cuda.cudart().cudaProfilerStop()
ncu --profile-from-start off --section SpeedOfLight --csv \
    --kernel-name regex:"target_kernel" \
    --launch-count 3 -- python script.py

Alternative: Verwenden Sie --launch-skip N, um Autotuning-Starts zu überspringen. Siehe references/advanced-profiling.md für NVTX-Bereichs- und Wiedergabemodus-Alternativen.

Programmatische Berichtsanalyse

Extrahieren Sie Metriken aus .ncu-rep- oder .ncu-repz-Dateien mit dem Python-Modul ncu_report (im Verzeichnis extras/python/ der Nsight Compute-Installation):

import ncu_report

ctx = ncu_report.load_report("report.ncu-rep")
for rng in ctx:
    for action in rng:
        name = action.name()
        # SpeedOfLight's "Compute (SM) Throughput" and "Memory Throughput"
        compute = action["sm__throughput.avg.pct_of_peak_sustained_elapsed"].as_double()
        memory = action["gpu__compute_memory_throughput.avg.pct_of_peak_sustained_elapsed"].as_double()
        duration = action["gpu__time_duration.sum"].as_uint64()

        if compute > 60:
            classification = "rechnergebunden"
        elif memory > 60:
            classification = "speichergebunden"
        else:
            classification = "latenzgebunden"

        print(f"{name}: {classification} (rechnen={compute:.1f}%, speicher={memory:.1f}%, {duration}ns)")

Siehe references/python-report-api.md für die vollständige API (IContext-, IRange-, IAction-, IMetric-Klassen).

Ausgabeformate

CSV-Ausgabe (für Skripterstellung und automatisierte Analyse):

ncu --csv --section SpeedOfLight --kernel-name regex:"KERNEL" -- COMMAND
ncu --csv --page raw --section SpeedOfLight -- COMMAND   # Alle Metriken flach

Das Standard-CSV hat eine Zeile pro Metrik. Seine Spalten enthalten ID (den profilierten Start), Kernel Name, Section Name, Metric Name, Metric Unit und Metric Value; Regelergebnisse sind Zeilen, die stattdessen Rule Name, Rule Description und Estimated Speedup ausfüllen. Ein Metric Name kann sich über Abschnitte hinweg wiederholen (Memory Throughput ist % in SpeedOfLight und Byte/s in MemoryWorkloadAnalysis), also filtern Sie auch nach Section Name. --page raw ergibt eine Zeile pro Start, eine Spalte pro Metrik und eine zweite Zeile mit Einheiten. Werte sind in Basiseinheiten (ns, hz, %).

Während des Profilings teilen sich die ==PROF==-Zeilen von ncu und die eigene Ausgabe der Anwendung stdout mit dem CSV. Für sauberes CSV schreiben Sie einen Bericht und lesen ihn zurück:

Berichtsdateien (für spätere Analyse):

ncu -o report.ncu-rep --section SpeedOfLight -- COMMAND
ncu --import report.ncu-rep --csv                       # Eine Zeile pro Metrik
ncu --import report.ncu-rep --csv --page raw            # Eine Zeile pro Start

Geben Sie -o die Erweiterung: Ohne Erweiterung schreiben Nsight Compute 2026.3 und neuer die zstd-komprimierte report.ncu-repz, und ältere Versionen schreiben report.ncu-rep. --import und ncu_report lesen beide.

Wichtige Metrikzeilen (Metric Name-Werte):

Metric NameAbschnittBedeutung
DurationSpeedOfLightAusführungszeit
Compute (SM) ThroughputSpeedOfLight% des Spitzenrechnens
Memory ThroughputSpeedOfLight% des Spitzenwerts der am stärksten ausgelasteten Speichereinheit
SM FrequencySpeedOfLightTakt, mit dem das Profil lief
Achieved OccupancyOccupancyAktive Warps / max. Warps (%)

Erfolgsindikatoren:

  • SOL%-Werte in der Ausgabe vorhanden -> Profiling erfolgreich
  • Dauerwerte sinnvoll (nicht 0 oder extrem groß)
  • Mehrere Starts erfasst, wenn --launch-count > 1

Beispiele

Beispiel: Einen GEMM-Kernel klassifizieren

cuBLAS-GEMM-Kernel auf Blackwell heißen nvjet_*, also beide Namen abgleichen:

ncu --section SpeedOfLight --csv \
    --kernel-name regex:"gemm|nvjet" \
    --launch-skip 5 --launch-count 3 \
    -- python train.py

Ausgabe für eine FP16 4096x4096 Matmul auf B200 (Spalten und Zeilen gekürzt):

"ID",...,"Kernel Name",...,"Section Name","Metric Name","Metric Unit","Metric Value",...
"0",...,"nvjet_sm100_hsh_128x256_64x6_2x2f_2cta_h_bz_NNT",...,"GPU Speed Of Light Throughput","Memory Throughput","%","38.38",
"0",...,"nvjet_sm100_hsh_128x256_64x6_2x2f_2cta_h_bz_NNT",...,"GPU Speed Of Light Throughput","Duration","ns","97600",
"0",...,"nvjet_sm100_hsh_128x256_64x6_2x2f_2cta_h_bz_NNT",...,"GPU Speed Of Light Throughput","Compute (SM) Throughput","%","77.11",

Interpretation: rechnergebunden (77,1 % Rechnen, 38,4 % Speicher). Nächster Schritt: Tensor-Core-Auslastung mit --section ComputeWorkloadAnalysis prüfen.

Beispiel: Einen speichergebundenen Embedding-Kernel diagnostizieren

PyTorchs Embedding-Lookup führt vectorized_gather_kernel aus, also gleichen Sie auch das ab:

ncu --section SpeedOfLight --section MemoryWorkloadAnalysis --csv \
    --kernel-name regex:"gather|index|embedding" \
    --launch-count 3 -- python train.py

Überprüfen Sie die L1/L2-Cache-Trefferquoten in der Ausgabe: Niedrige Trefferquoten deuten darauf hin...

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Verwandte Skills