Usei IA para deixar o meu PC SFF mais rápido – Programando um software para controlar TDP da CPU!
Em uma era em que temos IAs fazendo de tudo, desde gerar imagens, vídeos ultrarrealistas e também se virando para responder tudo que é tipo de pergunta, seria apenas uma questão de tempo até alguém tentar usar o recurso para extrair mais desempenho do PC. Acontece que esse dia chegou e nesse artigo vamos ver se isso deu certo!
Tudo nessa vida tem um contexto e aqui não seria diferente! Aqueles que já acompanham a página devem conhecer o PC SFF com Watercooler Custom que montei em um Sugo SG13 modificado, onde o tal loop é responsável por refrigerar um Ryzen 9 7900 e uma RX 6800 XT por meio de um radiador de 120mm x 60mm.
A grande questão é que se formos manter o nível de ruído em níveis toleráveis, o radiador acaba mostrando os seus limites ali na casa dos 260W, sendo necessário um certo trabalho de otimização para viabilizar as coisas, na prática, reduzir o TDP da CPU para 55W e o da GPU para 213W com undervolt.
Apesar disso não ter comprometido o desempenho em jogos, permanecendo similar ou ainda um pouco melhor a configuração padrão de fábrica, ao usar a máquina para tarefas multithread sem uso da GPU, a CPU continuava limitada nos 55W mesmo tendo muita margem térmica disponível, o que implica em uma oportunidade para extrair mais desempenho da máquina!
Evidentemente, esse não é um problema simples de se resolver, já que apesar de existirem ferramentas opensource como o ZenStates, que permite alterar os parâmetros de PPT, EDC e TDC on-the-fly, ele só faz isso pontualmente e, além disso, nem toca na GPU, que também faz parte da questão.
Com isso em mente, elaborei uma espécie de ‘algoritmo’ que ao menos no papel resolveria a questão: A ideia é monitorar o uso da GPU e ao exceder determinado valor, limitar o TDP da CPU em 55W para priorizar a GPU e quando o uso da GPU ficar abaixo desse valor, permitir que o TDP da CPU exceda os 55W.
O X da questão é que o ZenStates foi escrito em C# e o único contato que tive com essa linguagem foi uns 15 anos atrás e desde então nunca mais mexi com isso, o que por si só já inviabilizaria tirar esse projeto do papel em um prazo minimamente razoável, dito isso, dizem que as IAs estão lidando cada vez melhor com código, então, por que não tentar explicar a ideia para uma dessas coisas e ver o que sai depois?
A escolhida foi o Gemini 2.5 Pro da Google e o principal motivo é que ela permite usar pouco mais de 1 MILHÃO de tokens gratuitamente por chat, o que é bastante generoso e provavelmente suficiente para essa brincadeira. Toda implementação de código ficou a cargo da IA! Minha única participação foi testando e fazendo sugestões quando as coisas davam errado.
Foram 2 chats ao todo, com esse sendo o prompt do primeiro deles:
Preciso que você modifique um software chamado ZenStates, ele permite alterar on-the-fly diversos parâmetros dos processadores Ryzen, incluindo o TDC, EDC e PPT, ou seja, os limites de TDP da CPU.
Como uso um PC SFF com um loop de watercooler para CPU e GPU, a capacidade de dissipação de calor é limitada, o que eu quero é que o software rode em background monitorando o uso da GPU e caso ele seja maior que determinada porcentagem (30 ou 50% creio que sejam bons parâmetros iniciais) ele aplique parâmetros mais conservadores para a CPU, por exemplo, PPT 74W, TDC 52A e EDC 77A, para deixar a maioria da margem térmica para a GPU, já quando a GPU não estiver sendo usada, ai a CPU não tem porque ficar limitada, podendo usar um ajuste mais agressivo para esses parâmetros, digamos que, PPT 203W, TDC 143W, EDC 210W, otimizando o desempenho em ambas situações.
As demais funções do ZenStates não são necessárias, preciso apenas adicionar a função para monitorar o uso da GPU (uso uma AMD Radeon RX 6800 XT) e deixar as coisas do PPT, EDC, TDC e Scalar, todo o resto é desnecessário e você pode remover da interface para simplificar as coisas, caso considere razoável.
Abaixo o github com o aplicativo, posso te enviar a parte os arquivos do código da interface dele. A propósito, qual IDE que preciso pra abrir isso dai e compilar? Essa coisa parece ser C ou C++, mas não tenho certeza.
https://github.com/irusanov/ZenStates
Ao elaborar um prompt para IA, os resultados costumam ser diretamente proporcionais ao esforço empreendido em explicar o contexto, além da abordagem contar muito, por exemplo, mencionei que ele deveria modificar o ZenStates ao invés de criar algo do zero, afinal, as funções que permitem alterar os parâmetros de PPT, TDC e EDC já estão implementadas nele, sendo necessário apenas criar a lógica de apoio para ela fazer o que preciso.
Um detalhe é que citei o link para o github do projeto do ZenStates, pois não tinha certeza se essa IA seria capaz de acessar os arquivos diretamente, de todo modo, ela permite anexar arquivos, incluindo o código-fonte necessário para análise, o que acabei fazendo mais adiante.
A primeira resposta foi um ‘livro’ com vários passos, ideia inicial para implementação e até alguns códigos, mas o destaque fica por conta logo das primeiras recomendações, que apesar de ter errado sobre a linguagem do projeto, acertou em cheio sobre o processo de baixar o código original e tentar compilar por conta, o que ajudou a me familiarizar com a IDE que nunca tinha mexido antes, além de ter certeza que o código disponibilizado era de fato funcional.
Linguagem de Programação e IDE:
Você acertou em cheio. O projeto é escrito em C++.
Os arquivos .sln e .vcxproj indicam que ele foi feito para o Microsoft Visual Studio. Você pode usar a versão gratuita, Visual Studio 2022 Community Edition.
Ao instalar o Visual Studio, certifique-se de selecionar a carga de trabalho (workload) “Desenvolvimento para desktop com C++”.
Como Compilar o Projeto Original:
Baixe e instale o Visual Studio 2022 Community.
Baixe o código-fonte do ZenStates do GitHub (botão “Code” -> “Download ZIP”).
Descompacte o ZIP.
Abra a pasta e dê um duplo-clique no arquivo ZenStates.sln. Isso vai abrir o projeto no Visual Studio.
Pode ser que o Visual Studio peça para “Redirecionar” (Retarget) o projeto para a versão do SDK do Windows que você tem instalada. Pode aceitar.
No menu superior, vá em Compilar (Build) -> Compilar Solução (Build Solution) ou simplesmente pressione F7.
Se tudo correr bem, um executável (ZenStates.exe) será criado na pasta x64/Release ou x64/Debug dentro do diretório do projeto.
Importante: O ZenStates precisa de um driver (WinRing0) para ter acesso de baixo nível ao hardware. Certifique-se de que os arquivos WinRing0x64.sys estejam na mesma pasta do executável para que ele funcione.
Acabou que esse primeiro chat virou meio que sobre a compilação do software original, no que também existe o ZenStates-Core, que é um projeto a parte e é a biblioteca responsável por botar a mão na massa e fazer as coisas acontecerem no ZenStates. Foram cerca de 25000 tokens nessa conversa até conseguir chegar a um acordo sobre o funcionamento disso e nenhum código fornecido aqui acabou sendo utilizado no software.
Já para o segundo chat, conhecendo algumas prováveis sugestões da IA, tratei de refinar ainda mais o prompt, destacando que as instruções teriam que ser bastante mastigadas, além de sugerir como funcionar a interação entre ZenStates e ZenStates-Core.
Preciso que você modifique ou crie um software novo com base no ZenStates, ele permite alterar on-the-fly diversos parâmetros dos processadores Ryzen, incluindo o TDC, EDC e PPT, ou seja, os limites de TDP da CPU.
Como uso um PC SFF com um loop de watercooler para CPU e GPU, a capacidade de dissipação de calor é limitada, o que eu quero é que o software rode em background monitorando o uso da GPU e caso ele seja maior que determinada porcentagem (30 ou 50% creio que seja bons parâmetros iniciais) ele aplique parâmetros mais conservadores para a CPU, por exemplo, PPT 74W, TDC 52A e EDC 77A, para deixar a maioria da margem térmica para a GPU, já quando a GPU não estiver sendo usada, ai a CPU não tem porque ficar limitada, podendo usar um ajuste mais agressivo para esses parâmetros, digamos que, PPT 203W, TDC 143W, EDC 210W, otimizando o desempenho em ambas situações.
As demais funções do ZenStates não são necessárias, preciso apenas que monitore o uso da GPU a cada 2000ms da maneira mais simples possível (uso uma AMD Radeon RX 6800 XT) e usar as coisas do PPT, EDC, TDC que já existem implementados no ZenStates para alterar os valores conforme o exemplificado. (Provavelmente o ZenStates é só uma interface que passa os valores de PPT, TDC e EDC que o usuário coloca nos campos pro ZenStates-Core fazer o trampo, mas isso você pode ver nos githubs e confirmar)
Abaixo o github com o aplicativo e a biblioteca de controle, consegui compilar com sucesso usando o Visual Studio 2022, mas gostaria de deixar claro que não manjo NADA disso, então tem que ser tudo bem passo-a-passo. E o Visual Studio está instalado em inglês, então dê os comandos para a versão em inglês.
https://github.com/irusanov/ZenStates
https://github.com/irusanov/ZenStates-Core
Com isso, ele sugeriu que fosse elaborada uma aplicação nova dentro da mesma solução, a princípio em modo texto, o que resultou em um aplicativo quase funcional, que alterava os parâmetros de PPT, EDC e TDC, ainda que a principio passando valores errados, algo que a IA só conseguiu corrigir após fornecer o código da função do ZenStates-Core responsável por alterar esses parâmetros.
Com a funcionalidade básica implementada, a ideia passou a ser incrementar a coisa e ver até onde a IA conseguiria ir, já que o plano é ter algo funcional para uso diário e não apenas um tech demo, então ainda falta investir em mais dois pontos:
- Segurança: Ao fechar o software, a última configuração de PPT, EDC e TDC aplicada que ficava até o reboot, ou seja, a CPU poderia ficar com TDP alto e isso é um problema em potêncial. Para resolver isso, tive a ideia de ler os parâmetros de PPT, EDC e TDC que já estavam lá antes do programa ´agir´, o problema que a IA se embananou toda e não conseguiu fazer essa implementação funcionar, portanto, acabei temporariamente abandonando essa ideia e indo para o próximo passo.
- Usabilidade: Apesar do software em console ser funcional, não é exatamente prático no uso diário, já que ele ficaria ali na barra de tarefas lembrando a todos que está em execução, logo, o próximo passo seria transformar isso em um tray app, para ficar rodando discretamente ali sem incomodar o usuário, o que resultou em vários prompts explicando e várias tentativas até a IA acertar a mão. A principio ela tentou manter o console com um icone no tray, o que se mostrou um tanto problemático e logo ela abandonou essa abordagem para fazer a coisa usando form.
Resolvida a questão da usabilidade, voltei a segurança com uma nova ideia: O software aplicar os ajustes de 55W antes de fechar seria uma alternativa suficiente e muito mais simples de se implementar, o que a IA resolveu sem maiores problemas.
Apesar de no final, as coisas terem saido muito melhores do que qualquer expectativa, nem tudo são flores já que a IA ainda sofre com alucinação e aparentemente, essa ferramenta da Google tem alguns problemas para lidar com conversas muito longas, com as mensagens mais recentes simplesmente sumindo do histórico, sendo necessário colar os códigos da última versão do software para ela ter um novo ponto de partida. De todo modo, foram mais de 150 MIL tokens até chegar ao resultado final, o que coloca em perspectiva o quão generoso são aqueles 1 MILHÃO de tokens.
Como ficou a versão final do Ryzen SFF Optimizer!
Como disse anteriormente, o software virou uma Tray App, o que significa que ele não fica na barra de tarefas e foi pensado em ser o mais ´silencioso´ possível durante a sua operação, dito isso, é possível acessar o menu clicando com o botão direito sobre o icone, o qual permite abrir um menu de configurações, sobre e sair.


Nas configurações, é possível ajustar os parâmetros de PPT, TDC e EDC para cada uma das duas situações de uso da GPU, além de ter uma espécie de ´log´ mostrando o uso da GPU e qual perfil está sendo usado.
No Sobre, temos mais detalhes sobre o desenvolvedor, com os devidos créditos a ferramenta de IA utilizada, além do projeto do ZenStates, que no fundo, foi o que viabilizou essa experiência.
E os resultados?
Ao elevar o TDP de 55W para 170W, os ganhos em aplicações multithread tornam-se óbvios, conforme mostrei nesse artigo, mas apenas para colocar em uma perspectiva aqui, no Cinebench R20, isso representou um salto de 8280 pontos para 11497 com 170W, o que é significativo e pode fazer a diferença em aplicações que usam muitos núcleos
Conclusão
A ideia inicial para otimizar e extrair ainda mais desempenho da máquina SFF se mostrou correta, com o algoritmo funcionando perfeitamente tomando o uso de GPU como base para determinar os parâmetros de TDC, EDC e PPT da CPU, respeitando assim o limite do Watercooler utilizado.
De tudo, a ideia de usar IA para tirar o plano do papel acabou sendo surpreendentemente boa, com a implementação final superando a mais otimista das expectativas. É claro que o processo não foi 100% liso, sendo necessário ser um tanto ´malandro´ na hora de elaborar o prompt, inclusive chegando ao ponto de mudar de abordagem para lidar com as alucinações da IA, mas no geral, a experiência foi tranquila e permitiu tirar isso do papel em apenas dois dias, o que seria impossível caso tivesse que aprender C# antes e fazer por mim mesmo.







belo artigo, mas a pergunta que não quer calar, onde encontro para baixar o Ryzen SFF Optimizer…. tentei achar no gitgub mas sem resultados.