2008-10-29 97 views
4

我有这个大型的C++项目,我需要在没有并行make的平台上构建(如在Linux上make -j)。服务器有6个CPU,我想手动进行并行生成。在Ksh和Perl中并行执行任务的最佳方式是什么?

我可以像这样为约300个目标文件生成一个任务列表。我使用的Makefile相关性检查和增量编译:

化妆-f Makefile文件obj1.o

使-f生成文件obj2.o

使-f生成文件obj3.o ...

我将如何并行执行这些任务,并且不超过6次使用Ksh和Perl一次运行的任务? (Java或Python不可用:-()

+0

是任务之间的依赖关系存在? – alex 2008-10-29 20:45:45

+0

你在运行什么平台? – warren 2008-10-29 20:50:18

回答

5

在Perl中,您应该看看Parallel::ForkManager。你可以这样做:

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

如果操作系统正确处理了处理器间的通信和调度,只要没有相互依赖关系,就应该能够将所有的产品放入后台进程。

如果他们都是独立的,我会发出这样的一系列命令:

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

有了依赖,把它们串与双号(&&),使因项目不启动,直到其“父”已结束。

我意识到这不是您要求的解决方案,但它是我将如何攻击该问题:)

4

分叉的替代方法是在每个make的自己的线程中运行。

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

我不幸手挥舞着两位。首先是让循环静静地等待,直到线程结束。我相信这是通过使用threads :: shared的cond_wait()和一个信号量变量来完成的。

第二个是从make中获取返回值,所以你知道是否失败并停止构建。要做到这一点,你必须加入()每个线程才能得到system()的结果,即进程的退出代码。

对不起,急躁的回复。希望社区将填补其余的。

相关问题