Tenho feito testes entre o uso de CPUz e OCCT. Percebi que, se eu configurar o CPUz para estressar a CPU com vários threads, ele nunca ultrapassará 70c. Por outro lado, executando o OCCT para carregar na CPU, ele ultrapassará 75c instantaneamente e, às vezes, até interromperá o teste em 85c.
O que esta acontecendo aqui? Sempre entendi que enquanto as placas de vídeo têm muitos núcleos que precisam ser estressados separadamente, as CPUs são simples. Um loop for básico pode colocar 100% de carga em uma CPU. Um monte de loops for executados em vários threads podem carregar todos os núcleos. Como é que o OCCT está esquentando muito mais minha CPU. O que ele está fazendo que o CPUz não pode?
Algumas informações básicas: A CPU é Intel Core i7-4790k. O turbo boost está ativado, mas acho que fica em 5% quando um dos processos está em execução
O uso da CPU é uma medida de quanto recurso a CPU tem disponível, mas há muitos tipos diferentes de instrução que podem ser processados e todos eles têm diferentes requisitos de processamento e memória.
Uma tarefa que consome muita memória pode fazer com que a CPU pare enquanto ela busca dados da memória e, assim, reduz o rendimento efetivo da instrução enquanto ainda tem a CPU "em uso".
Além disso, existem muitas partes diferentes da CPU que podem ser saturadas de maneira diferente.
De Wikichips Sandy Bridge uArch :
Você pode ver que temos um front-end de decodificador de instrução inicial, que para fluxos de instrução complexos e diversos pode se esforçar para manter o restante do pipeline completo.
Se você tiver apenas adições inteiras, poderá usar 3 das unidades principais de execução, pois a CPU possui 3 unidades INT ALU. Se você tiver apenas multiplicações de ponto flutuante, poderá usar apenas a unidade única FPU MUL (multiplicação).
A CPU também opera como um pipeline e, enquanto uma unidade estiver em uso em uma unidade de execução, você poderá agendar uma operação no próximo ciclo. Isso significa que um fluxo de instruções diversificado pode fazer melhor uso dos recursos, pois uma unidade que não está em uso pode ser programada na mesma UE, mas com um tipo de instrução diferente. Instruções diferentes também terão tempos de execução diferentes e conjuntos maiores ou menores de circuitos associados para executar. Uma adição simples pode levar um ou dois ciclos de clock, enquanto uma instrução de ponto flutuante pode levar mais tempo e ter uma quantidade maior de circuitos envolvidos. Levar mais tempo pode significar que ele usa mais energia, assim como uma área maior de circuitos. Alternativamente, a instrução que leva mais tempo pode significar que o circuito de programação do front-end faz uma pausa e usa menos energia brevemente enquanto espera pelas unidades de execução disponíveis, enquanto as instruções menores e mais rápidas usam mais circuitos gerais se você incluir outras partes da CPU.
Como resultado, para fazer uso total da CPU, você precisa de um fluxo de instruções diversificado, e o que pode exercer uma CPU pode não exercer totalmente outra devido a arranjos e números diferentes de unidades de execução e seus recursos.
As unidades de execução podem ficar com "baixo consumo de energia" com o método moderno de controle de energia e, como resultado, não contribuem para a saída de calor do dispositivo ou contribuem muito menos.
Os caches também contribuem para o consumo de energia. Usar o cache significa que instruções e dados podem ser buscados e, como resultado, executados mais rapidamente do que uma rotina com um conjunto de dados na memória que é muito grande para um cache.
Como resultado, diferentes programas ou fluxos de instruções podem causar diferentes picos de uso de energia e, portanto, diferentes temperaturas.
Diferenças arquitetônicas entre gerações de processadores e até mesmo na mesma geração em que tamanhos de cache, opções de processador e diferentes disponibilidades de instrução podem ter efeito.
Eu entendo que você deseja saber por que a execução de um teste de trituração multi-thread não aquece a CPU tanto quanto um teste mono-thread.
A explicação simples é que o Turbo Boost é o culpado, pois é desativado quando a CPU está trabalhando igualmente duro em vários núcleos. Ele só é ativado quando um núcleo é muito usado (e apenas um núcleo).
Quando o turbo boost está ativo, ele desvia mais energia para o núcleo impulsionado, reduzindo a energia para os outros núcleos e, assim, diminuindo sua velocidade.
O núcleo reforçado então funciona a uma velocidade mais alta e aqueceria mais do que um núcleo não reforçado. Isso é capturado pelo sensor, que relata a temperatura de um núcleo como a de toda a CPU.
A "carga" (ou uso) da CPU é um monitor de atividade para indicar qual porcentagem do tempo da CPU é gasta em atividades "úteis" versus tempo "ocioso". O sistema operacional determina o que é atividade "útil" e o que é tempo "ocioso".
Com carga de CPU de zero por cento, o sistema operacional não está agendando nenhum processo de usuário durante esse intervalo de tempo.
Com 50% de carga da CPU, o sistema operacional agendou cerca de metade do intervalo de tempo para processos do usuário e a outra metade desse intervalo de tempo foi gasta no loop ocioso. Mesmo que haja apenas um processo de usuário, ele pode não ser capaz de consumir 100% da carga da CPU porque esse processo não exige muito da CPU e deve ser reprogramado enquanto, por exemplo, aguarda a conclusão de uma operação de E/S.
Com 100% de carga da CPU, o sistema operacional agendou todo o intervalo de tempo para os processos do usuário.
Observe que a CPU está realmente sempre ocupada (quando ligada), ou seja, sempre executando instruções. Se nenhum processo (do usuário) estiver pronto para ser executado, o escalonador do sistema operacional deverá executar seu loop ocioso.
A temperatura da CPU é consequência da energia elétrica consumida pelos circuitos da CPU. À medida que ocorrem mais interruptores de transistor, mais energia é necessária e consumida, e a temperatura da CPU aumenta.
Este consumo de energia não é indicado pela "carga" da CPU, que é apenas um monitor de atividade baseado em tempo.
Um processo pode manter a CPU "ocupada" (em termos de tempo) simplesmente copiando ou movendo dados (por exemplo, carregar e armazenar instruções) na memória (o que não é uma carga de energia adicional significativa acima do modo inativo).
Considerando que outro processo computacionalmente intensivo poderia realizar cálculos (por exemplo, instruções de multiplicação e divisão) que utilizam muitos outros circuitos na CPU, como a ALU (unidade aritmética/lógica) e FPU (unidade de ponto flutuante).
IOW é o mix de instruções (isto é, os tipos de instruções) que o processo executa que determina a potência elétrica consumida e o subseqüente nível de temperatura.
O sistema operacional não é capaz de medir esse consumo de energia e apenas relata uma medição de atividade baseada em tempo usando a carga da CPU e os sensores de temperatura.
Como observação adicional, a maior parte do calor é gerada quando os bits dentro da CPU oscilam entre 0 e 1, não quando são 'processados'. Empurrar um fluxo de zeros através de um pipeline ALU produzirá muito menos calor do que enviar um fluxo de bits aleatórios. Isso também é o que eu esperaria que acontecesse quando um pipeline está parado: ele será alimentado com valores constantes (não produzindo resultados úteis), mas está 100% ocupado para fins de estimativa de carga da CPU.
Isso não é necessariamente o que está acontecendo no seu caso (acho que @harrymc acertou em cheio), tudo o que estou dizendo é que a carga da CPU e a potência dissipada são quantidades físicas diferentes que não estão diretamente relacionadas.
Vou te dar um exemplo. Faça duas voltas:
e
No primeiro loop, o processador precisa esperar que a adição anterior termine antes de iniciar a próxima adição. Se a adição tiver uma latência de 3 ciclos, o processador realizará uma adição a cada 3 ciclos. A carga da CPU é de 100%, mas a CPU não está fazendo tanto trabalho.
No segundo loop também há uma iteração a cada três ciclos, mas como as adições são independentes, o processador fará 3 adições a cada 3 ciclos, fazendo 3 vezes mais trabalho. A carga da CPU ainda é de 100%, mas 3 vezes mais trabalho produzirá muito mais calor.
Portanto, você obterá mais calor com o código que usa mais recursos de computação disponíveis em cada ciclo.