A tarefa intensiva da CPU multi-thread acelera a CPU muito antes dos limites de temperatura


21

Eu escrevi uma tarefa encadeada com muita CPU que funciona como esperado no meu quad core 2012 do MacBook Pro. Solto-o com 20 fios e as temperaturas chegam a cerca de 100 ° C, conforme medido com o Intel Power Gadget com o mínimo de aceleração.

Leve o mesmo programa e arquivos de dados para o meu MacBook Pro de 13 "de 2016 com uma máquina com dois núcleos e inicie-o; eu esperaria que ele também mantivesse os 3,3-3,4 GHz até a temperatura chegar perto da marca de 100 ° C. O comando Top mostra a tarefa em 350% (2 núcleos cada com rosca dupla), mas a frequência da CPU é reduzida para 1,6-1-8 GHz com a temperatura apenas a 60 ° C ou mais com os ventiladores em silêncio. Em tarefas de CPU com thread único, a máquina se comporta conforme o esperado, mantendo os 3,3-3,4 GHz até atingir os 100 ° C e os ventiladores acionam A pergunta é por que minha CPU está sendo acelerada?

Ambas as máquinas estão atualizadas e executando as mesmas versões do gcc. Se eu pegar o binário da máquina em funcionamento e colocá-lo no 2016 Mac, ele tem o mesmo problema.

Se eu executar 3 ou 4 encadeamentos únicos da CPU para que a máquina esteja a toda velocidade, inicie o programa encadeado, também diminuirá a frequência.

Ambas as máquinas possuem 16 GB de RAM.

Editar

Depois de brincar com o código, suspeito que ele esteja sendo acelerado quando uma tarefa cria muitos threads. Neste programa, pego cada registro que leio e crio um thread para ele. Eu deixo apenas 20 ou mais threads irem por vez e, em nenhum momento, existem mais de 21 threads, mas existem 14.400.000 registros a serem processados. Nos 30 minutos ou mais, cada um desses registros será processado por um thread separado.

Criei um programa trivial de pthread que sugou o tempo da CPU e definiu 10 deles em execução. O laptop com problema executou isso e aqueceu a 95C sem problemas.

Acho que vou reescrever meu código para reutilizar o mesmo thread em vez de destruí-los e iniciá-los novamente.

Atualização 13/5/17

Depois de várias horas de trabalho, agora apenas cria n threads e apenas as reutiliza, o que não ajudou. Além da temperatura da CPU, o que fará com que esta máquina acelere?


1
Eu amo essa pergunta! Que tal executar uma tarefa multithread específica diferente? Eu sugiro executar algo como uma tarefa ffmpeg (em um vídeo 1080p ou 4K, para garantir que ele use todos os recursos de CPU disponíveis) e ver se ele diminui. Isso pode diminuir o problema para baixo para qualquer um: seu programa na máquina ou todos os programas multithread nessa máquina
NoahL

1
Se eu executar o benchmark Cinebench R15, ele usa as tarefas encadeadas e executa conforme o esperado, a temperatura chega a cerca de 100 ° C e os ventiladores sobem. O Intel Power Gadget mostra que a frequência da CPU ainda está perto de 3,3 Ghz. Portanto, não parece um problema de hardware. Todo o código é apenas código C, com nada sofisticado, usando p_threads e bloqueios mínimos de Mutex. O programa é principalmente o processamento de sequências de DNA, com um thread puxando algo como 16 GB de dados e transmitindo-o a n threads individuais para o processamento de números pesados.
Markatlnk #

1
Parece que outros programas podem atingir o teto que você deseja? Se o problema for apenas do seu código especial, podemos precisar de mais informações sobre esse código. Embora onde seus dados sejam processados? Externo? Quanto trabalho o kernel_task informa? Outros sensores de temperatura?
LаngLаngС

1
Sua CPU possui 8 núcleos lógicos, não 4, portanto, 4 threads mostrariam 50% do uso total da CPU. Gostaria de saber se isso afeta a estimativa de carga do seu sistema.
Sudo #

Não sei se você gostaria de passar pelo problema, mas você poderia tentar depurar no nível do kernel com o kernel de depuração. Você pode obtê-lo se clicar em mais downloads no site de desenvolvimento da apple.
user3052786

Respostas:


1

Isso pode ser um tiro no escuro, mas talvez a diferença no desempenho de núcleo único e / ou desempenho de cache entre os pacotes de cpu de 2012 e 2016 seja grande o suficiente para que os núcleos fiquem com falta de dados e reduzam a velocidade até que possam trabalhar novamente?

Estou fazendo esse palpite, porque você indica que processos de thread único suficientes podem executar a toda velocidade em todos os núcleos, e um programa simples de multi-thread pode executar a toda velocidade em todos os núcleos.

Isso me faz pensar que há algo no design do programa de sua carga de trabalho real versus a carga de trabalho de vários segmentos de teste que não permite que as CPUs funcionem o tempo todo


0

A extensão do kernel /System/Library/Extensions/AppleACPIPlatform.kext controla muitas proteções de temperatura e CPU. Ele já está compilado, obviamente, no seu sistema, mas pode estar disponível em https://opensource.apple.com (não consigo encontrá-lo, mas apenas dei uma olhada rápida). Não me surpreenderia se a Apple tivesse configurações muito conservadoras na capacidade da CPU.


3
AFAIK os kexts da Apple não são de código aberto. (Estranhamente), o melhor recurso para obter informações sobre isso é a comunidade Hackintoshing, devido à necessidade de injetar drivers.
JMY1000

Não é nada estranho! Os consertadores dão os melhores conselhos, porque sabem muito mais do que deveriam em primeira mão. Quanto às configurações conservadoras da CPU, lembre-se de que o MBP tem um ótimo dissipador de calor para desempenho de burst, mas não tão bom para ciclos sustentados. É bem provável que esse problema se deva à Apple querer impedir preventivamente que suas pernas sejam cozidas. Eu ouvi sobre alguns processos sobre isso com o 2012MBP.
User1901982

0

Sempre que o sistema operacional reconhecer os threads como imprevisíveis e fora de controle, ele diminuirá para manter a estabilidade do hardware e do sistema, o modelo de 2012 se comportará de maneira diferente e poderá travar na pior das hipóteses. Aconteceu comigo com o controle de thread mal implementado, minha culpa. Apenas não execute tantos threads em um dual core.


-2

Aconteceu comigo com o controle de thread mal implementado, minha culpa. Apenas não execute muitos threads em uma CPU dual core.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.