![Vários subprocessos utilizam vários núcleos?](https://rvso.com/image/1609692/V%C3%A1rios%20subprocessos%20utilizam%20v%C3%A1rios%20n%C3%BAcleos%3F.png)
Tenho uma pergunta que basicamente explora algumas maneiras preguiçosas de utilizar todos os núcleos de uma máquina.
Digamos que eu tenha o programa "./theprogram" que atua em um conjunto de dados D, é "embaraçosamente paralelo" e recebe um argumento de linha de comando j que executa o programa em um subconjunto de seu conjunto de dados determinado por j.
Então suponha que no meu terminal eu execute os comandos
./theprogram j1 &
./theprogram j2 &
./theprogram j3 &
. etc
. etc
. etc
./theprgoram jfinal &
Agora gerei subprocessos para j1, j2, ... jfinal
Minha pergunta: supondo que eu tenha um sistema unix moderno (digamos, o Mac Os X mais recente rodando em um chip multicore)
Então os processos serão distribuídos por todos os núcleos separadamente? Ou seja, estou aproveitando TODOS os meus núcleos?
Responder1
Em teoria, sim.
O sistema operacional agenda tarefas em núcleos de CPU não utilizados. Ele sabe quando um núcleo não está sendo utilizado porque simplesmente desmarcou uma tarefa dele.
Seus processos terão um sinalizador em suas estruturas indicando se estão aguardando entrada (disco, teclado, mouse e assim por diante) e, portanto, se não estiverem aguardando nenhuma dessas coisas, serão escalonáveis.
Para cada núcleo, o sistema operacional irá essencialmente percorrer sua lista de tarefas agendáveis e agendá-las. As tarefas terão um período de tempo no núcleo e depois serão suspensas novamente para que o sistema operacional possa ver seoutroos processos precisam ser executados.
Se nenhum outro processo precisar ser executado, o seu ainda estará no topo da lista e poderá ser executado novamente.
O efeito natural é que, com uma pequena sobrecarga de gerenciamento, sua CPU será totalmente utilizada, assumindo que nenhum de seus processos bloqueie uns aos outros ou gaste uma quantidade embaraçosa de tempo aguardando acessos ao disco.
Você pode testar isso com qualquer aplicativo multithread com dados paralelizáveis. A codificação de vídeo e a compactação de dados são duas situações em que esse tipo de paralelismo compensa.
Handbrake é um codificador de vídeo baseado em CPU (recentemente também com suporte para GPU) que pode usar quantos núcleos de CPU você desejar e alcançaria um alto nível de aumento de velocidade ao fazer isso. Muitos codificadores de vídeo podem fazer bom uso de múltiplos núcleos. x.264 e outros codificadores também suportam vários threads.
7-Zip é um programa de compactação que também pode usar vários threads em seu algoritmo LZMA2 para acelerar a compactação. A construção do dicionário de compactação é um processo compartilhado razoável e, uma vez que você tenha um dicionário, a compactação real é "trivialmente" paralelizável.
Responder2
Para multiprocessar, você deve escolher a seção do código que segue:
- Não posso depender de resultados anteriores
- Não requer ser executado em uma ordem específica
- Não retornará nada que precise ser acessado posteriormente no código
Então, pelo que ouvi, segue-se que você deve ser capaz de usar seus múltiplos núcleos.