在Ksh和Perl中执行任务的最佳并行方式是什么?

4

我有一个大型的C++项目需要在没有类似于Linux上的并行制造(如make -j)的平台上构建。服务器有6个CPU,我想手动进行并行构建。

我可以为约300个目标文件生成这样的任务列表。我使用Makefile进行依赖检查和增量构建:

make -f Makefile obj1.o

make -f Makefile obj2.o

make -f Makefile obj3.o ...

如何使用Ksh和Perl以不超过6个任务同时运行的方式并行执行这些任务?(不可用Java或Python :-()


任务之间有依赖关系吗? - alex
你在运行什么平台? - warren
没有依赖关系。我稍后会单独进行链接。这是一台较旧的HP-UX机器。(为了移植和64位测试,主要开发环境大多数情况下是Linux。) - Jeroen Dirks
你有什么理由不能安装最新的GNU make呢? - Sherm Pendley
5个回答

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

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获取返回值,这样你就知道是否失败并停止构建。要做到这一点,你需要join()每个线程以获取system()的结果,即进程的退出代码。

抱歉回复匆忙。希望社区能填补剩下的部分。


3

1

-1

如果操作系统能够正确处理处理器间通信和调度,只要没有相互依赖,您就可以将所有的makes放入后台进程中。

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

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

有依赖关系的话,可以用双与号(&&)将它们串联起来,这样依赖项就不会在其“父级”完成之前开始。

我知道这不完全是你要求的解决方案,但这是我攻击问题的方式 :)


这可能是一个建议 - 只是提供一个可能的建议 :) - warren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接