feat(monitor): ряд GPU — загрузка, ватты и частота через Intel IGCL (XIC-18) - #14
Merged
Conversation
Виджет «Монитор» получил ряд 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Виджет «Монитор» получает ряд 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.csPowerDraw: ленивыйctlInit, сверка раскладки телеметрии,Reset(), выключение навсегда при осечкеsrc/Ui/MonitorForm.cs#FFD54F), подстрока с частотой и ваттами, ячейка в мини-видеlang/{ru,en,zh}.jsonmonitor.gpu.subdocs/09-power-monitoring.mdctl_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.Границы канала (честно про то, чего нет)
ctlEnum*(TemperatureSensors,Fans,PowerDomains,EngineGroups) отвечают отказом: это пути для дискретных Arc. Температуры как раньше через DPTF; пункт «🚫 Не берём» в ROADMAP поправлен — вентиляторов по-прежнему нет, но «GPU не отдаётся» больше не верно целиком.renderComputeпочти дублируетglobal(разница ~1.3 п.п.),mediaпод 3D-нагрузкой всегда 0 → в UI толькоglobal.ctlInitне поднимется либоDllImportброситDllNotFoundException, ряд просто не появится, виджет останется прежним. Аналог у AMD —atiadlxx.dll, отдельная история.ctl_version_info_t— простойuint32, а не двеuint16). Риск закрыт сверкой на старте: проверяемbSupported/units/typeпо всем четырём используемым смещениям, не совпало → выключаемся навсегда. Лучше не показать ряд, чем показать мусор.Что осталось за скоупом
SupportedFeatures = FBC|PSR|DPST, все включены), запись не пробована — отдельной задачей.README.md), с.ruрусские (README.ru.md); раньше обе версии показывали одни и те же русские картинки, и те отставали от кода (не было GPU и температуры, RAM зелёный, Эко луной, без шестерёнки).🤖 Generated with Claude Code