Pergunta

Eu escrevi um programa multi-threaded que faz alguma CPU pesado computação com um monte de operações de ponto flutuante. Mais especificamente, é um programa que compara animação seqüências de quadro a quadro. Ou seja, que compara os dados de quadro de animação A, com todos os quadros de animação B, para todos os quadros em animação A. I realizam esta operação intensiva para diferentes animações em paralelo, de modo que o programa pode estar a trabalhar em AB par, par BC e CA em par paralelo. O programa está usando QtConcurrent e uma função de "mapa" que mapeia um recipiente com movimentos para uma função. QtConcurrent administra pool de threads para mim, eu estou trabalhando em processador Intel Quad Core para que ele gera 4 threads.

Agora, o problema é que o meu processo destrói a minha CPU. O uso é 100% constante e eu realmente obter uma tela azul da morte se eu executar o meu programa em um conjunto bastante grande de movimentos (Falha de página na área não paginada). Eu suspeito que isso é porque o meu computador está com overclock. No entanto, isso poderia ser por causa da maneira que eu codificado meu programa? Algumas ferramentas benchamrking muito intensivos que eu usei para testar a estabilidade da minha máquina nunca bati meu PC. Existe alguma maneira de controlar a forma como o meu programa usa o meu CPU para reduzir a carga? Ou talvez eu sou mal-entendido o meu problema?

Foi útil?

Solução

Há alguns excelentes respostas aqui.

Gostaria apenas de acrescentar, a partir da perspectiva de ter lotes done de ajuste de desempenho, a menos que cada segmento foi optimizado de forma agressiva, as chances são de que tem muito espaço para a redução do ciclo.

Para fazer uma analogia com um auto corrida de longa distância, há duas maneiras para tentar ganhar:

  1. Faça o carro ir mais rápido
  2. Faça menos paradas e colaterais viagens

Na minha experiência, a maioria dos softwares como o primeiro escrito é muito longe de tomar a rota mais direta, especialmente como o software se torna grande.

para encontrar ciclos desperdiçado em seu programa, como disse Kenneth Cochran, não acho. Se você corrigir alguma coisa sem ter provado que é um problema, você está investng em um palpite.

A forma popular de encontrar problemas de desempenho é profilers de uso.

No entanto, eu faço isso muito, e meu método é o seguinte: http: //www.wikihow.com/Optimize-Your-Program%27s-Performance

Outras dicas

overclock PCs pode levar a todos os tipos de problemas estranhos. Se você suspeitar que a causa raiz de seu problema, tente relógio-lo em intervalos razoáveis ??e repetir os testes.

Também poderia ser algum tipo de muito estranho memória de bug onde você danificar o seu RAM de uma maneira em que o Windows (acho que o OS, por causa da BSOD) não pode se recuperar mais (muito improvável, mas quem sabe).

Outra possibilidade que eu posso pensar é que você tem algum erro no seu enfiamento-implementação que mata janelas.

Mas em primeiro lugar, eu olhar para o overclocking-problema ...

o tipo de operação que você descreveu já é altamente paralelizável. Correndo mais de um emprego pode realmente mágoa performance. A razão para isso é porque o cache de qualquer processador é de tamanho limitado, e quanto mais você tenta fazer simultaneamente, a participação de cada segmento menor do cache se torna.

Você também pode olhar para as opções utilizando o seu GPU para absorver um pouco da carga de processamento. GPU modernos são muito mais eficiente para a maioria dos tipos de transformação de vídeo do que a CPU do das gerações semelhantes.

Eu suspeito que isso é porque o meu computador está com overclock.

É definitivamente possível. Tente defini-lo à velocidade normal por um tempo.

isso poderia ser por causa da maneira que eu codificado meu programa?

Um programa em execução no modo de usuário é muito pouco provável de causar um BSOD.

Em uma suposição, eu diria que você não está correndo de uma máquina de 3-core (ou 4, tendo em conta o uso de 100%), e paralelização vai doer ativamente o seu desempenho se você usar mais segmentos do que núcleos. Faça apenas um thread por núcleo de CPU, e faça o que fizer, nunca tem dados acessados ??por diferentes threads ao mesmo tempo . Os algoritmos de bloqueio de cache na maioria das CPUs multi-core com certeza vai matar o seu desempenho. Neste caso, numa solução em n-core animações processamento CPU de frame L, I utilizado um fio em armações de 0- (G / N), o segmento 2 em quadros (G / N) - (2 * G / N),. .. fio N em quadros ((N-1) * G / N) -L. Será que as diferentes combinações (A-B, B-C, C-A) em sequência para que você não thrash seu cache, também, deve ser mais simples de código.

Como uma nota de lado? Real computação como este deve usar 100% da CPU, isso significa que ele está indo tão rápido quanto possível.

O overclocking é a causa mais provável da instabilidade. Com qualquer algoritmo intensivo da CPU não vai haver alguma surra CPU. O overclocking não obstante, eu iria encontrar um profiler desempenho bom encontrar gargalos de desempenho. Nunca adivinhar onde está o problema. Você pode passar meses otimizando algo que tem efeito nenhum real sobre o desempenho ou pior desempenho poderia até diminuir.

É muito fácil culpar o hardware. Sugiro que você tente executar o programa em um sistema diferente e ver como isso acaba com os mesmos dados.

Provavelmente você tem um bug.

olhar em usar operações SIMD. Eu acho que você iria querer SSE neste caso. Eles são muitas vezes um melhor primeiro passo de paralelização pois são mais fáceis de obter correta e fornecer um impulso bastante robusto para mais linear álgebra tipos de operações.

Depois de conseguir isso usando SIMD, em seguida, olhar para paralelização. Parece que você está batendo a CPU também, para que talvez pudesse fazer com alguns dorme em vez de ocupado espera talvez, e certifique-se que você está limpando ou reutilizar threads corretamente.

Com a ausência do código de erro BSOD (útil para olhar para cima) é um pouco mais difícil para ajudá-lo com este.

Você pode tentar fisicamente recolocar sua memória ((tirá-lo e soltá-lo em). I, e alguns outros que eu conheço, tenho trabalhado em algumas máquinas, onde este era necessário. Por exemplo, eu uma vez tentando atualizar o OS X em uma máquina e ela ficava travando ... finalmente eu apareci a memória para fora e deixou-a cair de volta e tudo estava bem.

Suspensão (1); vai cortar o uso da CPU ao meio. Corri para o mesmo problema em trabalhar com um algoritmo intensivo da CPU.

Se o seu processador tem dois núcleos ou mais você pode ir para o gerenciador de tarefas e ir para processos e clique direito sobre o nome do programa e clique Set affinity e definir o programa para usar menos núcleos.

Será, então, levar mais tempo para fazer as ações que você está pedindo, mas vai causar uma diminuição significativa no uso da CPU.

Eu acho tela azul da morte é causada quando o núcleo região de memória é corrompida. Então, usando multithreading para realizar operações paralelas não poderia ser a razão para isso.

Bem, se você está criando vários segmentos cada pesados ??transportando operações de ponto flutuante, então definitivamente a sua utilização da CPU vai chegar até 100%.

Seria melhor se você pode dar um pouco de sono em cada segmento para que outro processo obter algum acaso. Você também pode tentar reduzir a prioridade de threads.

Se na plataforma Windows, coloque depois de algum trabalho uma chamada para função de informar CPU você quiser fazer a CPU para outros processos. Fazer uma chamada para a função do sono assim:

slepp (0);

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top