К основному содержанию
скилл CX Codex

pgo — скилл для Claude Code: что делает и как установить

Помогает настроить двухэтапную PGO-оптимизацию и BOLT для бинарников на C/C++ под GCC и Clang, когда стандартных флагов компилятора уже недостаточно.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add mohitmishra786/low-level-dev-skills --skill pgo -a claude-code
Открыть на GitHub

Что делает pgo

Скилл содержит инструкции по сборке с профилированием (PGO) для компиляторов GCC и Clang. Агент ведёт разработчика по полному циклу: сначала компилируется бинарник со сбором метрик, затем программа запускается на типичных сценариях нагрузки, а на финальном шаге код пересобирается с учётом данных о горячих путях выполнения.

В инструкциях расписаны флаги GCC (-fprofile-generate и -fprofile-correction для параллельных запусков), сборка под Clang с утилитой llvm-profdata, а также запуск SamplePGO без замедления работы приложения. Для оптимизации машинного кода после этапа линковки описан запуск llvm-bolt с переупорядочиванием базовых блоков.

Для работы SamplePGO и BOLT потребуется системный perf. Без предварительной проверки базовой оптимизации -O3 -march=native настраивать PGO нет смысла: эффект виден в основном на программах со сложным ветвлением и частыми вызовами функций.

Какие задачи решает

  • настроить двухэтапную PGO-сборку проекта в GCC или Clang
  • собрать профили выполнения без оверхеда через Clang SamplePGO и perf
  • переупорядочить машинный код бинарника утилитой BOLT для ускорения кэша инструкций
  • интегрировать параметры профилирования в сценарии CMake

Примеры запросов агенту

  • Подскажи флаги GCC для двухэтапной PGO-сборки моего сервиса
  • Как настроить сборку с инструментированием в CMake для Clang?
  • Помоги запустить llvm-bolt для оптимизации бинарника после линковки

Как установить pgo

1Через Skills CLI (Vercel)

npx skills add mohitmishra786/low-level-dev-skills --skill pgo -a claude-code

2Вручную: положить файлы

~/.claude/skills/pgo/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/pgo/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о pgo

Как установить pgo в Claude Code?

Выполните команду npx skills add mohitmishra786/low-level-dev-skills --skill pgo -a claude-code. Файл разместится по пути ~/.claude/skills/pgo/SKILL.md.

Что делает скилл pgo?

Он направляет агента при настройке профильной оптимизации компиляторов C и C++, помогая ускорить выполнение бинарников на основе реальных профилей нагрузки.

Чем SamplePGO отличается от обычной сборки с инструментированием?

В SamplePGO профиль собирается утилитой perf на обычном бинарнике без дополнительного инструментального кода. Затем llvm-profgen переводит эти замеры в профиль для Clang.

Исходный текст

SKILL.md · MIT
---
name: pgo
description: Profile-guided optimisation skill for C/C++ with GCC and Clang. Use when squeezing maximum runtime performance after standard optimisation plateaus, implementing two-stage PGO builds, collecting profile data, or applying BOLT for post-link optimisation. Activates on queries about PGO, profile-guided optimization, fprofile-generate, fprofile-use, instrumented builds, or BOLT.
---

# PGO (Profile-Guided Optimisation)

## Purpose

Guide agents through the full PGO workflow: instrument build → representative workload → collect profile → optimised build, covering both GCC and Clang, plus BOLT for post-link optimisation.

## Triggers

- "How do I use PGO to speed up my binary?"
- "What is profile-guided optimization and when should I use it?"
- "How do I use `-fprofile-generate` and `-fprofile-use`?"
- "My `-O3` build isn't fast enough — what next?"
- "How does BOLT differ from PGO?"
- "How do I collect representative profile data?"

## Workflow

### 1. When to use PGO

```text
Is -O3 -march=native already applied?
  no  → apply standard optimisation first
  yes → is workload branch-heavy or has irregular call patterns?
          yes → PGO will likely help 5-30%
          no  → PGO may not help; profile first with linux-perf
```

PGO helps most with:

- Large binaries with many cold/hot code paths (compilers, databases, servers)
- Branch-heavy code where static prediction is wrong
- Function call-heavy code where inlining decisions improve with profile data

### 2. GCC PGO workflow

```bash
# Step 1: Build with instrumentation
gcc -O2 -fprofile-generate -fprofile-dir=./pgo-data \
    prog.c -o prog_instr

# Step 2: Run with representative workload(s)
./prog_instr < workload1.input
./prog_instr < workload2.input
# Generates .gcda files in ./pgo-data/

# Step 3: Build optimised binary using profile
gcc -O2 -fprofile-use -fprofile-dir=./pgo-data \
    -fprofile-correction \
    prog.c -o prog_pgo
```

`-fprofile-correction`: handles profile count inconsistencies from parallel or nondeterministic runs. Always include it.

### 3. Clang PGO workflow (IR-based, preferred)

```bash
# Step 1: Instrument build
clang -O2 -fprofile-instr-generate prog.c -o prog_instr

# Step 2: Run workload (generates default.profraw)
./prog_instr < workload.input
LLVM_PROFILE_FILE="prog-%p.profraw" ./prog_instr  # per-PID files for parallel runs

# Step 3: Merge raw profiles
llvm-profdata merge -output=prog.profdata *.profraw

# Step 4: Optimised build
clang -O2 -fprofile-instr-use=prog.profdata prog.c -o prog_pgo
```

Clang's IR PGO is more accurate than GCC's and supports `SamplePGO` (sampling-based, no instrumentation overhead).

### 4. Clang SamplePGO (sampling, no instrumentation)

```bash
# Step 1: Build with frame pointers for accurate stacks
clang -O2 -fno-omit-frame-pointer prog.c -o prog

# Step 2: Sample with perf
perf record -b -e cycles:u ./prog < workload.input
perf script -F ip,brstack > perf.script  # or use perf2bolt

# Step 3: Convert perf data
llvm-profgen --binary=./prog --perf-script=perf.script \
             --output=prog.profdata

# Step 4: Optimised build
clang -O2 -fprofile-sample-use=prog.profdata prog.c -o prog_spgo
```

SamplePGO is ideal for production profiling without instrumentation overhead.

### 5. CMake integration

```cmake
option(PGO_INSTRUMENT "Build with PGO instrumentation" OFF)
option(PGO_USE "Build with PGO profile data" OFF)

if(PGO_INSTRUMENT)
    add_compile_options(-fprofile-instr-generate)
    add_link_options(-fprofile-instr-generate)
endif()

if(PGO_USE)
    add_compile_options(-fprofile-instr-use=${CMAKE_SOURCE_DIR}/prog.profdata)
    add_link_options(-fprofile-instr-use=${CMAKE_SOURCE_DIR}/prog.profdata)
endif()
```

Build script:

```bash
# Phase 1: instrument
cmake -S . -B build-pgo-instr -DPGO_INSTRUMENT=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build-pgo-instr -j$(nproc)

# Collect profile
./build-pgo-instr/prog < workload.input
llvm-profdata merge -output=prog.profdata *.profraw

# Phase 2: optimised
cmake -S . -B build-pgo -DPGO_USE=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build-pgo -j$(nproc)
```

### 6. BOLT (post-link binary optimisation)

BOLT reorders functions and basic blocks in the final binary based on profile data, improving instruction cache locality. Works after PGO for additional 5-15%.

```bash
# Step 1: Build with relocation support
clang -O2 -Wl,--emit-relocs prog.c -o prog

# Step 2: Collect profile with perf
perf record -e cycles:u -b ./prog < workload.input
perf2bolt prog -p perf.data -o prog.fdata

# Or use instrumented BOLT
llvm-bolt prog -instrument -o prog.instr
./prog.instr < workload.input
# Generates /tmp/prof.fdata

# Step 3: Apply BOLT optimisation
llvm-bolt prog -data prog.fdata -o prog.bolt \
    -reorder-blocks=ext-tsp \
    -reorder-functions=hfsort \
    -split-functions \
    -split-all-cold \
    -dyno-stats
```

### 7. Verifying PGO impact

```bash
# Compare perf of instrumented vs PGO build
perf stat ./prog_baseline < workload.input
perf stat ./prog_pgo < workload.input

# Check which functions are hot in each
perf record ./prog_pgo < workload.input
perf report --stdio | head -30
```

For full workflow details and Clang vs GCC profile format notes, see [references/pgo-workflow.md](references/pgo-workflow.md).

## Related skills

- Use `skills/compilers/gcc` for GCC flag context
- Use `skills/compilers/clang` for Clang PGO and SamplePGO setup
- Use `skills/profilers/linux-perf` for collecting SamplePGO perf data
- Use `skills/profilers/flamegraphs` to identify hot paths before applying PGO

© mohitmishra786 · MIT · mohitmishra786/low-level-dev-skills

Похожие скиллы

Все скиллы по теме «Языки программирования» →
migrate-to-shoehorn Matt Pocock Переводит type assertions с as в тестах на функции из @total-typescript/shoehorn. Нужен для частичных объектов и намеренно неверных данных в проверках. 475 388установок write-swift emilkowalski Скилл помогает писать, проверять и переносить код на Swift с учётом модели языка. Подойдёт, когда нужно разобраться с конкурентностью, ошибкой или циклом удержания объектов. CX Codex +1 119 300установок megacave JuliusBrussee Переводит ответы ассистента на классический китайский язык (вэньянь) для экономии места на экране. Активируется командами /megacave или /caveman wenyan. CX Codex +1 25 400установок find-docs upstash Тянет актуальную документацию, справочники API и примеры кода для любой библиотеки через Context7 CLI. Пригодится, когда агент отвечает по устаревшим данным обучения. CX Codex +1 9 400установок typescript-advanced-types Seth Hobson Помогает агенту писать сложную типизацию TypeScript: generics, conditional types и преобразования типов. Нужен для библиотек, API-клиентов и строгих конфигураций. CX Codex 92 169установок smart-explore thedotmack Структурно ищет функции и классы через tree-sitter. Пригодится, когда нужно разобраться в кодовой базе без чтения всех файлов. CX Codex +1 7 300установок

Из того же набора90

dynamic-linking Скилл для работы с динамической линковкой в Linux: разбирает ошибки загрузки .so, настройку RPATH и RUNPATH, версионирование soname. CX Codex +1 600установок rust-profiling Скилл для анализа производительности Rust: флеймграфы, размер бинарника, раздувание мономорфизации и микробенчмарки Criterion. CX Codex +1 586установок interpreters Подсказывает агенту, как устроить диспетчеризацию байткода, стековую или регистровую ВМ и простой JIT через mmap. CX Codex +1 564установок rust-ffi Ведёт агента по FFI между Rust и C: генерация биндингов через bindgen и cbindgen, безопасные обёртки, линковка системных библиотек. CX Codex +1 563установок meson Скилл для ИИ-агентов, который помогает настроить Meson, разобраться с wrap-зависимостями и кросс-компиляцией в C/C++ проектах. CX Codex +1 560установок cargo-workflows Скилл ведёт агента по воркспейсам Cargo, фичам, build.rs, кэшу сборки и аудиту зависимостей. Пригодится, когда Rust-проект разрастается до нескольких крейтов. CX Codex +1 558установок rust-unsafe Помогает писать и проверять unsafe-код на Rust. Разбирает правила работы с сырыми указателями, внутреннюю мутабельность и изоляцию небезопасных участков. CX Codex +1 556установок cpp-modules Скилл для работы с модулями C++20: именованные модули, партиции, header units, сборка через CMake и флаги компиляторов. CX Codex +1 555установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой