Executando um processo várias vezes ao mesmo tempo

2

Eu tenho um programa c ++ com uma biblioteca opencv que pega uma imagem como entrada e executa estimativa de pose, detecção de cor, phog. Quando executo este programa a partir da linha de comando, demora cerca de 4 a 5 segundos para ser concluído. Demora cerca de 60% cpu. Quando tento executar o mesmo programa a partir de duas janelas de linha de comando diferentes ao mesmo tempo, o processo demora cerca de 10 a 15 segundos para terminar e o processo termina quase ao mesmo tempo. O uso da CPU atinge até 100%.

Eu tenho um site que chama isso c + + exe usando o comando exec (). Então, quando dois usuários tentam fazer upload de uma imagem e executá-la, leva mais tempo, conforme expliquei acima, na linha de comando. Isso ocorre porque o programa c ++ envolve alta computação e a CPU atinge 100%? Mas eu li que a CPU atingindo 100% não é uma coisa ruim, pois o computador está usando sua capacidade total para executar o programa. Então é isso por causa do meu programa c + + ou é algo a ver com minhas configurações de servidor (computador)? Este provavelmente não é o problema do servidor apache, porque quando tento executá-lo a partir da linha de comando, ele também fica mais lento. Estou usando um processador quad core e todos os 4 processadores atingem 100% quando tento rodar o mesmo processo ao mesmo tempo, então acho que é distribuído entre todos os processadores. Então tenho mais algumas perguntas:

1) Isso pode ser resolvido usando multithreading no meu código c ++? Por enquanto eu não estou usando, mas multithreading tornar o código c ++ mais computacionalmente caro e aumentar o uso da CPU (se este for o problema).

2) Qual pode ser a razão da desaceleração? O processo está em uma fila e cada processo é executado apenas por um certo período de tempo e alterna entre os dois processos?

3) Se isso é porque envolve alta computação, ajudará se eu mudar algumas funções para funções opencv gpu?

4) Existe alguma maneira de resolver esses problemas com alguma idéia ou dicas?

Inseri o resultado de top ao executar um processo e executar o mesmo processo duas vezes ao mesmo tempo:

Version5 é o processo, executando-o uma vez DoisVersion5rodandoaomesmotempo

    
por user1583647 20.02.2014 / 08:33

1 resposta

2

A razão para isso pode ser a lixeira de cache. A carga da CPU não é apenas computação pura. É a atividade da CPU, ou seja, tudo, exceto dormir e esperar por E / S.

Se um único processo estiver em execução, provavelmente ele pode usar a maioria dos cache da CPU. Se você iniciar um segundo processo, o Kernel pode ser inteligente o suficiente para compartilhar o código entre os dois processos, mas eles não compartilham (a maioria) dos dados.

Assim, se as partes relevantes (para a atividade geral da CPU) do código usarem dados com alta localidade e a quantidade desses dados for maior que a metade do tamanho do cache, os dois processos descartarão dados um do outro o tempo todo. . Ou seja a latência de memória média aumenta seriamente. O acesso à memória faz parte da carga da CPU.

Não tenho conhecimento de qualquer possibilidade de ver qual parte dos acessos foi atendida por qual nível de cache ou por RAM.

Outra possibilidade é que o processo precise de uma quantidade tão grande de memória que a troca (o "mesmo cache externo ...") se torne um problema. Mas isso não parece tão provável para mim neste caso.

    
por 20.02.2014 / 09:44