2008-10-29 7 views
4

나는 리눅스에서 make -j와 같은 병렬 make가없는 플랫폼에서 빌드해야하는이 커다란 C++ 프로젝트를 가지고있다. 서버에는 6 개의 CPU가 있으며 수동으로 병렬 빌드를 수행하려고합니다.Ksh와 Perl에서 병렬로 작업을 실행하는 가장 좋은 방법은 무엇입니까?

약 300 개의 개체 파일에 대해 이와 같은 작업 목록을 생성 할 수 있습니다. 나는 종속성 검사 및 증분 빌드 메이크 파일을 사용

메이크가 obj3.o -f하게 메이크 obj2.o -f하게

메이크업 -f 메이크가

을 obj1.o ...

Ksh와 Perl을 사용하여 한 번에 6 개 이상의 작업을 병렬로 수행하는 방법은 무엇입니까?

+0

이 작업 사이에 거기에 종속됩니다? – alex

+0

어떤 플랫폼을 실행하고 있습니까? – warren

+0

종속 관계가 없습니다. 나중에 링크를 별도로 할 것입니다. 이것은 오래된 HP-UX 상자입니다. (이식 및 64 비트 테스팅을 위해 대부분의 주요 개발 환경은 Linux입니다.) –

답변

5

를 공격 할 방법입니다. 다음과 같이 할 수 있습니다 :

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(); 
} 
-1

OS가 프로세서 간 통신 및 스케줄링을 제대로 처리하고 있다면 상호 의존성이없는 한 모든 제조사를 백그라운드 프로세스로 포기할 수 있어야합니다. 그들은 모두 독립적 인 경우

, 나는 것 같은 일련의 명령 발행 : 의존성

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

을 이중 앰퍼샌드 (&&) 종속 항목이 될 때까지 시작되지 않도록와 문자열을 그 부모는 끝났습니다.

는 그 요청한 꽤 해결책이 아니다 실현,하지만 난 당신이 Parallel::ForkManager 보라 펄에서 문제 :

+0

나는 os가 그것을 barf 것이라고 생각한다. 나는 동시에 500 빌드를 시작했다 ... –

+0

아마도 그럴 수도있다 - 가능한 제안을하고있다. :) – warren

4

각 포크의 대안은 각 스레드를 자체 스레드로 실행하는 것입니다.

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" }); 
    } 
} 

저는 불행히도 약 2 비트 손을 흔들고 있습니다. 첫 번째는 쓰레드가 끝날 때까지 루프를 대기 상태로 만드는 것이다. 나는 이것이 threads :: shared의 cond_wait() 및 세마포어 변수를 사용하여 수행된다고 생각한다.

두 번째가 make의 반환 값을 얻고 있으므로 무언가 실패했는지 알 수 있고 빌드를 중단 할 수 있습니다. 그렇게하기 위해서는 각 쓰레드에 join()하여 system()의 결과를 얻고 프로세스의 종료 코드를 얻어야한다.

성급한 회신을 드려 죄송합니다. 바라건대 지역 사회가 나머지를 채우기를 바랍니다.