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?
fonte
Respostas:
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
fonte
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.
fonte
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.
fonte
Aconteceu comigo com o controle de thread mal implementado, minha culpa. Apenas não execute muitos threads em uma CPU dual core.
fonte