estrangulamento CPU em C ++

votos
39

Eu só estava me perguntando se existe uma maneira elegante de definir a carga máxima da CPU para um segmento específico fazendo cálculos intensivos.

Agora eu ter localizado a mais demorada loop na thread (que só faz compressão) e usar GetTickCount()e Sleep()com valores codificados. Ele garante que o ciclo continue por um determinado período de tempo e que dorme por um certo tempo mínimo. É mais ou menos faz o trabalho ie garante que o fio não vai usar mais de 50% da CPU.
No entanto comportamento é dependente do número de núcleos de CPU (enorme desvantagem) e simplesmente feio (desvantagem menor :)).
Alguma ideia?

Publicado 05/08/2008 em 08:11
fonte usuário
Em outras línguas...                            


5 respostas

votos
17

Não tenho conhecimento de qualquer API para fazer chegar programador do sistema operacional para fazer o que quiser (mesmo se o seu fio está ocioso prioridade, se houver tópicos prontos maior não-prioritários, vocês vão correr). No entanto, eu acho que você pode improvisar uma função de estrangulamento bastante elegante com base no que você já está fazendo. Essencialmente (eu não tenho uma máquina de dev Windows à mão):

Escolha uma quantidade padrão de tempo que o segmento vai dormir cada iteração. Então, em cada iteração (ou a cada iteração n, tais que a função de estrangulamento em si, não se tornar uma carga significativa CPU),

  1. Calcule a quantidade de tempo de CPU seu segmento usado desde a última vez que sua função de estrangulamento foi chamado (vou chamar este DCPU). Você pode usar os GetThreadTimes () API para obter a quantidade de tempo que seu thread foi execução.
  2. Calcule a quantidade de tempo real decorrido desde a última vez que sua função de estrangulamento foi chamado (vou chamar este dCLOCK).
  3. DCPU / dCLOCK é o por cento da CPU (de um CPU). Se for maior do que você quer, aumentar o seu tempo de sono, se inferior, diminuir o tempo de sono.
  4. Ter o seu sono thread para o tempo calculado.

Dependendo de como o cão de guarda calcula o uso de CPU, você pode querer usar GetProcessAffinityMask () para descobrir quantas CPUs o sistema tem. DCPU / (dCLOCK * CPUs) é a porcentagem de tempo total de CPU disponíveis.

Você ainda terá que escolher alguns números de mágica para o tempo de sono inicial eo valor aumentar / diminuir, mas acho que este algoritmo poderia ser ajustado para manter um segmento em execução no relativamente perto de um por cento determinada de CPU.

Respondeu 06/09/2008 em 00:33
fonte usuário

votos
4

No Linux, você pode mudar a prioridade de agendamento de um segmento com agradável ().

Respondeu 05/08/2008 em 09:03
fonte usuário

votos
2

O problema é que não é normal querer deixar o ocioso CPU enquanto você tem trabalho a fazer. Normalmente você definir uma tarefa de fundo para IDLE prioridade, e deixar o OS lidar com agendamento-lo todo o tempo de CPU que não é usado por tarefas interactivas.

Ele me parece o problema é o processo de vigilância.

Se a sua tarefa de fundo é então vinculado à CPU que você quer que ele ocupe todo o tempo da CPU não utilizado para a sua tarefa.

Talvez você deve olhar para fixar o programa de vigilância?

Respondeu 06/09/2008 em 10:01
fonte usuário

votos
2

Eu não posso pensar de qualquer maneira multiplataforma do que você quer (ou qualquer forma garantida ponto final), mas como você está usando GetTickCount talvez você não está interessado em plataforma cruzada :)

Eu usaria comunicação entre processos e definir os processos intensivos níveis agradável para obter o que você precisa, mas não tenho certeza de que é apropriado para sua situação.

EDIT: Concordo com Bernard que é por isso que eu acho que um processo e não um fio pode ser mais apropriado, mas ele só pode não atender às suas finalidades.

Respondeu 05/08/2008 em 08:23
fonte usuário

votos
0

Você pode ser capaz de alterar a prioridade de um segmento, mas mudando a utilização máxima seria ou exigem votação e hacks para limitar quantas coisas estão ocorrendo, ou usando ferramentas de sistema operacional que podem definir o máximo aproveitamento de um processo. No entanto, não vejo qualquer circunstância em que você iria querer fazer isso.

Respondeu 03/01/2018 em 18:06
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more