Skip to content

feat(monitor): ряд GPU — загрузка, ватты и частота через Intel IGCL (XIC-18) - #14

Merged
Oksion merged 4 commits into
mainfrom
oksion/xic-18-gpu-telemetry
Jul 29, 2026
Merged

feat(monitor): ряд GPU — загрузка, ватты и частота через Intel IGCL (XIC-18)#14
Oksion merged 4 commits into
mainfrom
oksion/xic-18-gpu-telemetry

Conversation

@Oksion

@Oksion Oksion commented Jul 29, 2026

Copy link
Copy Markdown
Owner

Виджет «Монитор» получает ряд GPU между CPU и RAM: процент + график, под ним частота и мощность (2450 МГц · 21.4 Вт); в мини-виде — только процент.

Закрывает XIC-18.

Откуда это взялось

Разбирали OEM-приложение Xiaomi PC Manager 5.8.0.74 и нашли, что цветовые режимы экрана Xiaomi делает без своего kernel-драйвера — через Intel IGCL, user-mode API графического драйвера. Канал оказался шире, чем цвет: в нём есть телеметрия GPU. Сам цвет мы сознательно не берём (Windows это уже умеет штатными настройками).

Тема GPU до этого числилась в ROADMAP → «🚫 Не берём» как «WMI на нашей модели не отдаёт» — это переоткрытие по новому сигналу, как в своё время с температурами через DPTF.

Почему это driver-free

ControlLib.dll лежит в System32 и приезжает со штатным драйвером Intel — мы ничего не устанавливаем, и для чтения не нужны даже права администратора. Тот же принцип, что и WMI: пользуемся тем, что система уже даёт.

Что внутри

файл что
src/SystemIntegration/GpuTelemetry.cs шов над IGCL по образцу PowerDraw: ленивый ctlInit, сверка раскладки телеметрии, Reset(), выключение навсегда при осечке
src/Ui/MonitorForm.cs ряд GPU (Amber 300 #FFD54F), подстрока с частотой и ваттами, ячейка в мини-виде
lang/{ru,en,zh}.json monitor.gpu.sub
docs/09-power-monitoring.md раскладка ctl_power_telemetry_t, замеры, границы канала
docs/10-colors.md, CLAUDE.md, README*.md, ROADMAP.md, CHANGELOG.md доки

Загрузка и ватты — приращения накопительных счётчиков (секунды активности, джоули), частота — мгновенное значение. Позиция рядов теперь считается счётчиком, а не множителем, поэтому опциональные ряды (GPU, температура) не ломают верстку.

Проверено на железе (TM2424)

Бенчмарк, 829 выборок / 216 с: загрузка 0.9 → 99.7 %, мощность 0.01 → 24 Вт, частота 900 → 2500 МГц (под длительной нагрузкой оседает на 2390–2440 — троттлинг), корреляция загрузки и мощности r = 0.988.

Загрузка сверена с собственным счётчиком Windows \GPU Engine(*)\Utilization Percentage: IGCL ~42.5 % против Windows ~45.4 % — сходится.

Цена: вызов ctlPowerTelemetryGet — медиана 47 мкс, p95 77 мкс (кадр при 60 Гц = 16666 мкс), поэтому опрос живёт в существующем таймере 1 Гц без воркера. ctlInit + enumerate — 8.9 мс однократно при первом показе. Приватная память не растёт: ControlLib.dll (296 КБ) и IntelControlLib.dll (712 КБ) мапятся как образы файлов. Закрытый виджет стоит ноль — инициализация ленивая, таймер остановлен.

Сборка: 0 предупреждений / 0 ошибок. Тесты: 170 зелёных. Ряд посмотрен глазами в живом виджете; ширина подстроки проверена расчётом — худший случай 2500 МГц · 24.0 Вт = 101 px из 112, запас сохраняется на 120/144/192 dpi.

Границы канала (честно про то, чего нет)

  • Температуры и оборотов вентиляторов на встроенном GPU IGCL не даёт — все ctlEnum* (TemperatureSensors, Fans, PowerDomains, EngineGroups) отвечают отказом: это пути для дискретных Arc. Температуры как раньше через DPTF; пункт «🚫 Не берём» в ROADMAP поправлен — вентиляторов по-прежнему нет, но «GPU не отдаётся» больше не верно целиком.
  • renderCompute почти дублирует global (разница ~1.3 п.п.), media под 3D-нагрузкой всегда 0 → в UI только global.
  • AMD-модели: IGCL там нет — ctlInit не поднимется либо DllImport бросит DllNotFoundException, ряд просто не появится, виджет останется прежним. Аналог у AMD — atiadlxx.dll, отдельная история.
  • ABI IGCL восстанавливался по заголовкам вручную (ctl_version_info_t — простой uint32, а не две uint16). Риск закрыт сверкой на старте: проверяем bSupported/units/type по всем четырём используемым смещениям, не совпало → выключаемся навсегда. Лучше не показать ряд, чем показать мусор.

Что осталось за скоупом

  • DPST-тумблер «не трогать мою яркость» — интеловское энергосбережение экрана, причина «плавающей» яркости на батарее. Чтение уже работает (SupportedFeatures = FBC|PSR|DPST, все включены), запись не пробована — отдельной задачей.
  • Скриншоты обновлены (уже в этом PR): свежие снимки панели и «Монитора» с рядом GPU. Заодно введена схема по языку — без суффикса английские (README.md), с .ru русские (README.ru.md); раньше обе версии показывали одни и те же русские картинки, и те отставали от кода (не было GPU и температуры, RAM зелёный, Эко луной, без шестерёнки).

🤖 Generated with Claude Code

Oksion and others added 4 commits July 29, 2026 17:37
Виджет «Монитор» получил ряд GPU между CPU и RAM: процент + график, под ним
частота и мощность («2450 МГц · 21.4 Вт»); в мини-виде только процент.

Канал — Intel IGCL, user-mode API графического драйвера: ControlLib.dll лежит
в System32 и приезжает со штатным драйвером Intel, поэтому ничего не
устанавливаем и прав администратора для чтения не нужно — тот же driver-free
принцип, что и WMI. Всё берётся одним ctlPowerTelemetryGet; загрузка и ватты
считаются как приращения накопительных счётчиков (секунды активности, джоули).

Проверено на TM2424 бенчмарком (829 выборок / 216 с): загрузка 0.9 → 99.7 %,
мощность до 24 Вт, частота 900 → 2500 МГц, корреляция загрузки и мощности
r = 0.988; загрузка сверена с \GPU Engine(*)\Utilization Percentage — сходится.
Опрос стоит 47 мкс (медиана), поэтому живёт в том же таймере 1 Гц без воркера.

Границы канала: температуру, обороты вентиляторов и напряжение IGCL на
встроенном GPU не отдаёт — все ctlEnum* отвечают отказом, это пути для
дискретных Arc. Температуры как раньше через DPTF. Инициализация ленивая:
пока виджет не открыт, IGCL в процесс не подгружается. Не Intel (в т.ч. AMD) —
ctlInit не поднимется или DllImport бросит DllNotFoundException, ряд просто не
появится, виджет остаётся прежним.

Цвет ряда — Amber 300 #FFD54F: у GPU оба соседа по рядам холодные (CPU синий,
RAM сиреневая), а тёплые оранжевый разряд и коралловая температура стоят через
ряд; cyan сливался с CPU, розово-фиолетовые — с RAM, плюс красно-розовая зона
уже занята смыслом «горячо».

Раскладка ctl_power_telemetry_t, замеры и оговорки — в docs/09; в ROADMAP
поправлен пункт «🚫 Не берём»: «GPU не отдаётся» больше не верно целиком,
без вентиляторов и GPU-режима, но с телеметрией.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Задача в Linear заведена после реализации, поэтому буллет в «✅ Сделано» и запись
в «[Unreleased]» номера не несли. Дописан «(XIC-18)» — как у XIC-4, чтобы связь
кода с трекером читалась из файлов, а не только из истории ветки.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Подписи к скриншотам и раздел «Ограничения» перечисляли показатели виджета,
но про GPU не знали. Дописано: ряд GPU с частотой и ваттами в подстроке,
GPU в компактной строке, и отдельный пункт ограничений — канал Intel IGCL,
без графики Intel ряда нет, температуру и вентиляторы он на iGPU не отдаёт.

Скриншоты docs/img/monitor*.png сняты до фичи и ряда GPU не показывают —
перезаписать их можно только с живого виджета, оставлено владельцу.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Скриншоты в репозитории были русскими и общими для обоих README — то есть
английская версия показывала русский интерфейс. Заодно они отставали от кода:
в «Мониторе» не было ни GPU, ни температуры, RAM был зелёным (цвет давно ушёл
под заряд), а на панели Эко рисовалось луной (XIC-14), не было шестерёнки
(XIC-12), сенсорного экрана и нового порога заряда.

Введена схема по языку, как у самих README: без суффикса — английские
(README.md), с «.ru» — русские (README.ru.md). Существующие русские ватты
переименованы через git mv, остальное — новые снимки:

  monitor.png / monitor.ru.png            полный вид, 5 рядов с GPU
  monitor-mini.png / monitor-mini.ru.png  мини: Power / CPU / GPU / RAM
  monitor-watts.png / monitor-watts.ru.png  только ватты
  quick-panel.png / quick-panel.ru.png    панель

tray.png не тронут — он языко-нейтральный.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Oksion
Oksion merged commit 353fce2 into main Jul 29, 2026
5 checks passed
@Oksion
Oksion deleted the oksion/xic-18-gpu-telemetry branch July 29, 2026 14:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant