문제

Linux의 Make -J와 같이 병렬 제작이없는 플랫폼을 구축 해야하는이 큰 C ++ 프로젝트가 있습니다. 서버에는 6 개의 CPU가 있으며 수동으로 병렬 빌드를하고 싶습니다.

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

make -f makefile obj1.o

make -f makefile obj2.o

make -f makefile obj3.o ...

KSH 및 PERL을 사용하여 한 번에 6 개 이상의 작업을 실행하지 않고 이러한 작업을 어떻게 병렬로 실행합니까? (Java 또는 Python을 사용할 수 없습니다 :-()

도움이 되었습니까?

해결책

Perl에서 당신은 봐야합니다 병렬 :: 포크 매너. 당신은 다음과 같은 일을 할 수 있습니다 :

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

다른 팁

포킹의 대안은 각각의 스레드에서 각각의 제조사를 실행하는 것입니다.

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

나는 불행히도 손으로 손을 흔들고있다. 먼저 스레드가 끝날 때까지 루프 대기를 정복하게 대기합니다. 나는 이것이 스레드 :: shared의 cond_wait ()와 세마포어 변수를 사용하여 달성된다고 생각합니다.

두 번째는 Make에서 반환 값을 얻는 것입니다. 그래서 당신은 무언가가 실패했는지 알고 빌드를 중단시키는 것입니다. 이렇게하려면 프로세스 '종료 코드 인 System ()의 결과를 얻으려면 각 스레드에 가입해야합니다.

성급한 대답에 대해 죄송합니다. 바라건대 커뮤니티가 나머지를 채울 수 있기를 바랍니다.

GNU는 hpux에서 -j 플래그가 없습니까?

http://hpux.connect.org.uk/hppd/hpux/gnu/make-3.81/

GNU 병렬을 사용하면 다음을 작성할 수 있습니다.

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

10 초 설치 :

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

더 알아보기: http://www.gnu.org/software/parallel/parallel_tutorial.html https://www.youtube.com/playlist?list=pl284c9ff248bc6d1

OS가 프로세서 간 통신 및 스케줄링을 올바르게 처리하는 경우 상호 의존성이없는 한 모든 제작을 배경 프로세스에 버릴 수 있어야합니다.

모두 독립적 인 경우 다음과 같은 일련의 명령을 발행합니다.

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

종속성을 사용하면 이중 암페어로 묶습니다 (&&) '부모'가 끝날 때까지 종속 항목이 시작되지 않습니다.

나는 그것이 당신이 요청한 솔루션이 아니라는 것을 알고 있지만, 내가 문제를 공격하는 방법입니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top