我正在研究一个数学模型,该模型使用 XFOIL 生成的数据,XFOIL 是一种流行的航空航天工具,用于查找机翼的升力和阻力系数。
我有一个 Perl 脚本,它使用不同的输入参数重复调用 XFOIL 以生成我需要的数据。我需要 XFOIL 运行 5,600 次,每次运行大约 100 秒,大约需要 6.5 天才能完成。
我有一台四核机器,但我作为程序员的经验有限,而且我真的只知道如何使用基本的 Perl。
我想一次运行四个 XFOIL 实例,全部运行在它们自己的核心上。像这样的事情:
while ( 1 ) {
for ( i = 1..4 ) {
if ( ! exists XFOIL_instance(i) ) {
start_new_XFOIL_instance(i, input_parameter_list);
}
}
}
因此,程序会进行检查(或者最好是休眠),直到 XFOIL 实例空闲,此时我们可以使用新的输入参数列表启动新实例。
Try 并行::ForkManager http://search.cpan.org/~dlux/Parallel-ForkManager-0.7.5/ForkManager.pm。它是一个模块,提供了一个简单的接口来分叉这样的进程。
这是一些示例代码:
#!/usr/bin/perl
use strict;
use warnings;
use Parallel::ForkManager;
my @input_parameter_list =
map { join '_', ('param', $_) }
( 1 .. 15 );
my $n_processes = 4;
my $pm = Parallel::ForkManager->new( $n_processes );
for my $i ( 1 .. $n_processes ) {
$pm->start and next;
my $count = 0;
foreach my $param_set (@input_parameter_list) {
$count++;
if ( ( $count % $i ) == 0 ) {
if ( !output_exists($param_set) ) {
start_new_XFOIL_instance($param_set);
}
}
}
$pm->finish;
}
$pm->wait_all_children;
sub output_exists {
my $param_set = shift;
return ( -f "$param_set.out" );
}
sub start_new_XFOIL_instance {
my $param_set = shift;
print "starting XFOIL instance with parameters $param_set!\n";
sleep( 5 );
touch( "$param_set.out" );
print "finished run with parameters $param_set!\n";
}
sub touch {
my $fn = shift;
open FILE, ">$fn" or die $!;
close FILE or die $!;
}
您需要为start_new_XFOIL_instance 和output_exists 函数提供您自己的实现,并且您还需要定义您自己的参数集以传递给XFOIL。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)