Pergunta

Eu tenho este grande projeto C ++ que eu preciso para construir uma plataforma que não tem um make paralelo (como make -j em Linux). O servidor tem 6 da CPU e eu quero fazer uma compilação paralela manualmente.

posso gerar uma lista de tarefas como este para cerca de 300 arquivos objeto. Eu uso o Makefile para as verificações de dependência e compilação incremental:

make -f Makefile obj1.o

make -f Makefile obj2.o

make -f Makefile obj3.o ...

Como eu poderia executar estas tarefas em paralelo com não mais que 6 tarefas em execução em um tempo usando Ksh e Perl? (Java ou Python não estão disponíveis :-()

Foi útil?

Solução

Em Perl o que você deve olhar Paralela :: ForkManager . Você poderia fazer algo parecido com isto:

my @make_obj = qw(
  obj1.o
  obj2.o
  obj3.o
  ...
);

my $fm = $pm = new Parallel::ForkManager(6);
foreach my $obj (@make_obj) {
  $fm->start and next;
  system("make -f Makefile $make_obj");
  $fm->finish();
}

Outras dicas

Uma alternativa para bifurcação é executar cada marca em seu próprio segmento.

use threads;

my $max_threads = 5;

my @targets = qw(obj1.o obj2.o obj3.o ...);
while(@targets) {
    my $num_threads = threads->list(threads::running);
    if( $num_threads < $max_threads ) {
        my $target = shift @targets;
        threads->create(sub { return system "make $target" });
    }
}

Estou infelizmente mão acenando em torno de dois bits. Em primeiro lugar está a fazer a espera laço quiescently até que um segmento acabamentos. Eu acredito que este é realizado usando tópicos :: compartilhados das cond_wait () e uma variável de semáforo.

O segundo está recebendo o valor de retorno de marca, então você sabe se algo falhou e para deter a construção. Para fazer isso você tem que juntar () cada thread para obter o resultado de system (), o processo de código de saída.

Desculpe pela resposta precipitada. Esperemos que a comunidade irá preencher o resto.

O gnu make no HPUX não tem a opção -j?

http://hpux.connect.org.uk/ HPPD / hpux / Gnu / make-3.81 /

Usando GNU Paralelo você pode escrever:

parallel -j6 make -f Makefile obj{}.o ::: {1..500}

10 segunda instalação:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Saiba mais: http://www.gnu.org/software/parallel/parallel_tutorial .html https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Se o OS está a lidar adequadamente a comunicação inter-processador e programação, você deve apenas ser capaz de jogar todas as marcas em processos backgrounded, contanto que não há interdependências.

Se eles são todos independentes, eu o faria questões uma série de comandos como este:

make -f Makefile obj1.o &
make -f Makefile obj2.o &
...
make -f Makefile objn.o &

Com dependências, corda-los com o comercial duplo (&&) para que o item dependente não começa até que a sua 'mãe' foi concluída.

Eu percebo que não é bem a solução que você pediu, mas é como eu iria atacar o problema:)

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