Execução de programas em paralelo

Execute várias cópias do seu programa simultaneamente e ganhe tempo

Erbe Pandini Rodrigues
Computação para físicos
2 min readMay 23, 2017

--

Este post explica como executar mais de uma cópia de um programa simultaneamente e requer o conhecimento de como capturar argumentos da linha de comando e automatização de experimentos com scripts.

Como rodar programas em segundo plano (background)

Considere o programa calc que recebe dois nomes de arquivos da linha de comando. O primeiro é o arquivo de entrada de dados o segundo é o nome do arquivo de saída para os resultados.

Quando um programa inicia sua execução em segundo plano, o terminal fica livre para executar outro programa ou comando. Para iniciar um programa em segundo plano digite & após a chamada do seu programa:

./calc input1.dat output1.dat&

Observe que após este comando o terminal é liberado. Se quiser colocar outra cópia do programa para rodar:

./calc input2.dat output2.dat&

Para trazer um programa que está em segundo plano para o primeiro plano digite simplesmente fg. Para levar o programa para segundo plano novamente pressione ctrl+z e em seguida digite bg. Caso queira terminar um programa em primeiro plano pressione ctrl+c.

Criação de scripts

Veja aqui como criar os scripts para os exemplos abaixo.

Automatização do procedimento

No script abaixo é utilizado o programa xargs da GNU. Neste exemplo sempre haverá dois programas executando em paralelo.

#!/bin/bash#número de argumentos de entrada para o programa
argsNum=2
#número máximo de programas que devem executar simultaneamente
#utilize no máximo o número de processadores da sua máquina
progs=2
#lista de argumentos de entrada
args="
input1.dat output1.dat
input2.dat output2.dat
input3.dat output3.dat
input4.dat output4.dat
"
#comando para executar programas em paralelo
echo $args | xargs -n$argsNum -P$progs -t ./calc

Neste exemplo duas cópias iniciam a execução, cada uma com dois argumentos:

-> ./calc input1.dat output1.dat (iniciando)
-> ./calc input2.dat output2.dat (iniciando)

Quando uma delas acabar, digamos que seja a segunda, outra começa:

-> ./calc input1.dat output1.dat (rodando, ainda não terminou)
-> ./calc input3.dat output3.dat (iniciando, um program terminou)

O processo se repete até que todos os programas tenham concluído. É importante lembrar que não é possível prever a ordem de execução. Se seus resultados dependem uns dos outros, ou não será possível rodar seus programas em paralelo ou você deve elaborar um modo mais sofisticado de script.

Se você possui um máquina com 8 processadores, pode por 7 programas para executar simultaneamente e deixar um processador livre, para o sistema operacional e para você realizar outras tarefas, como ler e-mail.

Alternativa mais simples

Crie um arquivo chamado expAlt.sh com o seguinte conteúdo:

#!/bin/bash./calc input1.dat output1.dat&
./calc input2.dat output2.dat&
./calc input3.dat output3.dat&
./calc input4.dat output4.dat&
wait
  1. Neste exemplo 4 cópias serão executadas. A primeira linha começa a execução e antes de terminar, as linhas abaixo começam a executar. O comando wait no final provoca a espera, ou seja, o script não executa a linha seguinte a wait enquanto todos os programas acima não tiverem terminado.
  2. Limitação - se o seu computador tiver 2 processadores, os quatro programas irão executar e disputar o uso dos processadores, causando um acréscimo no tempo total de execução.

--

--