技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
analyze-kernel-bottleneck【数据与研究】Systematically identify whether a GPU kernel is compute-bound, memory-bound, or latency-bound using roofline analysis, occupancy calculations, compute/load ratio per tile, and SASS instruction inspection. Produces a decision matrix for optimization strategy selection (cp.async, warp interleaving, tiling, double-buffering, or CuAssembler hand-tuning).
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Systematisch identifizieren ob ein GPU-Kernel rechen-, speicher- oder latenzbegrenzt ist, indem die Baseline-Performance gemessen, auf der Roofline klassifiziert, Occupancy und Compute-Load-Ratio pro Tile berechnet, SASS-Instruktionsmix und Stall-Codes inspiziert, der Shared-Memory-Cliff geprueft und eine Entscheidungsmatrix angewendet wird um die richtige Optimierungsstrategie zu waehlen.
.cubin oder .cu-Quelle mit Build-Befehl)Den Kernel mit CUDA-Events (BenchTimer) ausfuehren, Zeit in Millisekunden aufzeichnen. Effektive Durchsatzmetriken berechnen:
nvcc --cubin -arch=sm_86 -O2 -o kernel.sm_86.cubin kernel.cu
nvcc -arch=sm_86 -O2 -o bench bench.cu -lcuda -I../../phase2/common
./bench 4096 4096 4096
effective_gflops = (2 * M * N * K) / (time_ms / 1000) / 1e9effective_bw = total_bytes / (time_ms / 1000) / 1e9effective_gflops = (4 * batch * heads * seq_len^2 * head_dim) / (time_ms / 1000) / 1e9Erwartet: Baseline-Zahlen: Kernel-Zeit in ms, effektive GFLOPS und effektive Bandbreite.
Bei Fehler: Pruefen dass der Kernel ohne Fehler startet (CHECK_CU-Macro). Verifizieren dass Warmup-Laeufe der Messung vorausgehen. Sicherstellen dass Problemdimensionen gross genug sind um die GPU zu saettigen (kleine Probleme koennen am Launch-Overhead haengen bleiben).
Arithmetische Intensitaet berechnen und mit dem Maschinen-Balancepunkt vergleichen um den Kernel zu klassifizieren:
AI = FLOPs / bytes_loaded_from_global_memory. Nur einzigartige Bytes aus DRAM zaehlen (nicht Shared Memory oder Register-Reuse).balance = peak_compute / peak_bandwidth.AI < balance, ist der Kernel speicherbegrenzt. Wenn AI > balance, ist der Kernel rechenbegrenzt.GA104 (RTX 3070 Ti) Referenzwerte:
| Resource | Peak | Unit |
|---|---|---|
| FP32 FFMA | 21.7 | TFLOPS |
| FP16 Tensor Core (HMMA) | 174 | TFLOPS |
| INT8 Tensor Core (IMMA) | 696 | TOPS |
| DRAM Bandwidth | 608 | GB/s |
| L2 Cache | 4 | MB |
| SMs | 48 |
Abgeleitete Balancepunkte:
| Precision | Balance Point (FLOP/byte) |
|---|---|
| FP32 FFMA | 21700 / 608 = 35.7 |
| FP16 TC | 174000 / 608 = 286.2 |
| INT8 TC | 696000 / 608 = 1144.7 |
attained = effective_throughput / peak_throughput. Bei Speicherbegrenzung: effektive Bandbreite mit 608 GB/s vergleichen. Bei Rechenbegrenzung: effektive GFLOPS mit dem relevanten Peak vergleichen.Erwartet: Klassifikation als rechen-, speicher- oder latenzbegrenzt (geringe Occupancy verursacht weder Rechen- noch Speichersaettigung) mit numerischer Begruendung.
Bei Fehler: Byte-Zaehlung erneut pruefen. Auf redundante Reads achten (z.B. 9x bei direkter conv2d ohne im2col). Wenn weder Rechnung noch Speicher gesaettigt sind, ist der Kernel wahrscheinlich latenzbegrenzt (siehe Schritt 3).
Aktive Warps pro SM aus der Launch-Konfiguration und dem Ressourcenverbrauch ermitteln:
nvcc --cubin -arch=sm_86 -O2 --resource-usage -o kernel.sm_86.cubin kernel.cu 2>&1 | grep -E 'registers|smem'
warps_per_block = threads_per_block / 32.floor(65536 / (registers_per_thread * threads_per_block))floor(available_smem_per_SM / smem_per_block) -- siehe Schritt 6 fuer Clifffloor(48 / warps_per_block) (GA104 max: 48 Warps/SM)min(register_limit, smem_limit, warp_limit, block_limit).blocks_per_SM * warps_per_block.Erwartet: Occupancy-Tabelle die Bloecke/SM, aktive Warps/SM und den begrenzenden Faktor (Register, smem oder Warps) zeigt.
Bei Fehler: cuFuncSetAttribute fuer dynamisches Shared Memory pruefen. Verifizieren dass --resource-usage-Berichte mit der tatsaechlichen Launch-Konfiguration uebereinstimmen. Wenn Register-Anzahl unerwartet hoch ist, --maxrregcount=N versuchen um Register zu deckeln (Register-Spills gegen Occupancy tauschen).
Compute-Instruktionen und Load-Bytes pro K-Tile aus SASS zaehlen (nicht Quellcode):
cuobjdump -sass kernel.sm_86.cubin > kernel.sass
grep -c 'HMMA' kernel.sass -- FP16-Tensor-Core-Opsgrep -c 'IMMA' kernel.sass -- INT8-Tensor-Core-Opsgrep -c 'FFMA' kernel.sass -- FP32-Fused-Multiply-Addgrep -c 'LDG' kernel.sass -- Global-Memory-Loadscompute_ops / load_ops pro Tile.Erwartet: Compute-Load-Ratio mit Klassifikation (hoch/mittel/niedrig) und cp.async-Empfehlung.
Bei Fehler: Aus SASS-Disassembly zaehlen, nicht Quellcode -- der Compiler kann fusionieren, eliminieren oder Instruktionen umordnen. Sicherstellen dass nur Instruktionen innerhalb der inneren Schleife gezaehlt werden (die K-Tile-Iteration), nicht der ganze Kernel.
Den vollstaendigen SASS-Instruktionsmix und Stall-Codes pruefen:
cuobjdump -sass kernel.sm_86.cubin > kernel.sass
grep -c 'HMMA.16816' kernel.sass # FP16 Tensor Core
grep -c 'IMMA.16816' kernel.sass # INT8 Tensor Core
grep -c 'FFMA' kernel.sass # FP32 fused multiply-add
grep -c 'LDGSTS' kernel.sass # cp.async (global->shared)
grep -c 'LDG' kernel.sass # Global load
grep -c 'STS' kernel.sass # Shared store
grep -c 'LDS' kernel.sass # Shared load
grep -c 'BAR.SYNC' kernel.sass # Barrier synchronization
grep -c 'SHFL' kernel.sass # Warp shuffle (reductions)
grep -c 'MUFU' kernel.sass # Special function unit
grep 'HMMA' kernel.sass | head -5 # Expect S08 minimum (hardware constraint)
grep 'IMMA' kernel.sass | head -5 # Compiler emits S04, reducible to S02 via CuAssembler
grep 'FFMA' kernel.sass | head -5 # Check for S04 (reducible to S01 on independent FFMAs)
Erwartet: Instruktionsanzahltabelle und Stall-Code-Zusammenfassung mit identifizierten Optimierungszielen.
Bei Fehler: Sicherstellen dass die cuobjdump-Architektur mit dem Kernel-Kompilierungsziel uebereinstimmt (beide muessen sm_86 sein). Wenn SASS-Ausgabe leer ist, koennte das cubin korrupt sein -- neu kompilieren.
Ermitteln ob der Shared-Memory-Verbrauch den architekturspezifischen Occupancy-Cliff ueberschreitet:
--resource-usage-Ausgabe (Schritt 3) oder cuobjdump --res-usage kernel.sm_86.cubin.Erwartet: Smem/Block-Wert mit Bloecke/SM-Anzahl und expliziter Aussage ob der 50-KB-Cliff ueberschritten wird.
Bei Fehler: Wenn ueber Cliff und Occupancy der Engpass ist, muss sich die Optimierungsstrategie aendern: Tile-Groesse reduzieren um smem unter 50 KB zu bekommen, oder 1 Block/SM akzeptieren und mit hoeherer Compute-Load-Ratio pro Tile kompensieren (mehr Register-Reuse, laengere K-Tiles).
Befunde aus Schritten 2-6 zu einer Optimierungsstrategie synthetisieren:
| Bedingung | Strategie |
|---|---|
| Speicherbegrenzt + niedrige Compute-Load-Ratio (<5:1) + smem unter Cliff | Software-Pipelining mit cp.async (LDGSTS). Globale Loads mit Compute ueberlappen. |
| Speicherbegrenzt + hohe Compute-Load-Ratio (>20:1) + 8+ Warps | Warp-Interleaving versteckt bereits Latenz. Auf algorithmische Aenderungen fokussieren: implicit GEMM, split-Q, im2col. |
| Rechenbegrenzt + FFMA-lastig | CuAssembler-Stall-Code-Verengung: S04 -> S01 auf unabhaengigen FFMAs. |
| Rechenbegrenzt + HMMA-lastig | S08 ist Hardware-Minimum, nicht reduzierbar. Tile-Reuse erhoehen (groessere M/N-Tiles, laengere K-Schleife). |
| Rechenbegrenzt + IMMA-lastig | CuAssembler: S04 -> S02 auf IMMA-Instruktionen (Compiler ist konservativ). |
| Latenzbegrenzt (niedrige Occupancy, weder gesaettigt) | Smem oder Register reduzieren um mehr Bloecke/SM zu erhalten. Ueber 8 Warps/SM kommen. |
| Smem ueber Cliff | Tile-Groesse reduzieren oder restrukturieren um smem/Block unter 50 KB zu bekommen (GA104). |
Erwartet: Rangierte Liste empfohlener Optimierungen mit vorhergesagtem Gewinn-Bereich und potenziellen Konflikten.
Bei Fehler: Wenn kein klarer Gewinner auftaucht, Mikro-Benchmarks ausfuehren die jede Strategie isolieren (z.B. cp.async allein testen, reduzierte Tile-Groesse allein testen) um die tatsaechliche Wirkung vor dem Kombinieren zu messen.
Einen strukturierten Engpass-Bericht erzeugen:
## Bottleneck Analysis Report: [kernel_name]
### Baseline
- Problem: [dimensions]
- Kernel time: [X] ms
- Effective GFLOPS: [Y] | Effective BW: [Z] GB/s
### Roofline Classification
- Arithmetic intensity: [AI] FLOP/byte
- Balance point: [BP] FLOP/byte ([precision])
- Classification: **[compute|memory|latency]-bound**
- Attained fraction: [X]% of peak
### Occupancy
| Resource | Per Block | Limit/SM | Blocks/SM |
|----------|-----------|----------|-----------|
| Registers | [N]/thread | 65536 | [B] |
| Shared mem | [X] KB | 100 KB (cliff: 50 KB) | [B] |
| Warps | [W] | 48 | [B] |
| **Limiting** | | | **[min(B)]** |
- Active warps/SM: [W] ([sufficient|insufficient] for latency hiding)
### Compute/Load Ratio
- Compute ops/tile: [N] [HMMA|IMMA|FFMA]
- Load bytes/tile: [N] bytes ([N] LDG x [N] bytes)
- Ratio: [X]:1 — **[high|medium|low]**
- cp.async recommendation: [beneficial|neutral|detrimental]
### SASS Instruction Mix
| Instruction | Count | Notes |
|-------------|-------|-------|
| HMMA.16816 | [N] | Stall: S08 (hardware min) |
| IMMA.16816 | [N] | Stall: S04 (reducible to S02) |
| FFMA | [N] | Stall: S04 (reducible to S01) |
| LDG | [N] | |
| LDGSTS | [N] | cp.async |
| BAR.SYNC | [N] | |
### Smem Cliff
- Smem/block: [X] KB — [under|over] 50 KB cliff
- Blocks/SM: [B] — [no occupancy loss|occupancy halved]
### Recommended Optimizations (ranked)
1. [Strategy] — estimated [X-Y]% gain
2. [Strategy] — estimated [X-Y]% gain
3. [Strategy] — estimated [X-Y]% gain
Erwartet: Vollstaendiger Markdown-Bericht der von einem Kernel-Optimizer-Agenten oder menschlichen Entwickler konsumierbar ist.
Bei Fehler: Mit unterschiedlichen Problemgroessen erneut ausfuehren (z.B. 1024, 2048, 4096, 8192) um zu bestaetigen dass Befunde nicht groessenspezifisch sind. Kleine Probleme koennen latenzbegrenzt erscheinen waehrend der echte Engpass im Massstab Speicherbandbreite ist.
cuobjdump -sass-Ausgabe zaehlen.pipeline-gpu-kernel -- Software-Pipelining mit cp.async implementieren wenn die Analyse einen speicherbegrenzten Kernel mit niedriger Compute-Load-Ratio identifiziertsimulate-cpu-architecture -- ergaenzende Architekturanalyse fuer CPU-seitige Engpaesse in Host-Device-Workflows