这种高尔夫运动需要将阶乘计算分配到多个线程或多个进程中。
某些语言比其他语言更易于协调,因此与lang无关。提供了示例化的示例代码,但是您应该开发自己的算法。
比赛的目的是看谁能拿出最短的(以字节为单位,而不是秒)多核阶乘算法来计算N!根据比赛结束时的选票来衡量。应该有一个多核优势,因此我们要求它应在N〜10,000下工作。如果作者未能提供有效的解释说明选民如何在处理器/核心之间分配工作,则选民应投反对票,并基于高尔夫的简洁性投票。
出于好奇,请发布一些性能数字。在某些时候,可能会在性能与高尔夫得分之间进行权衡,只要符合要求,就选择高尔夫。我很想知道什么时候发生。
您可以使用通常可用的单核大整数库。例如,perl通常与bigint一起安装。但是,请注意,简单地调用系统提供的阶乘函数通常不会将工作分散在多个内核上。
您必须从STDIN或ARGV接受输入N,并向STDOUT输出N!的值。您可以选择使用第二个输入参数来为程序提供处理器/内核数,这样它就不会执行下面将要看到的事情:-)或者您可以为可用的2、4进行显式设计。
我将在下面发布自己的奇数球perl示例,该示例先前已提交给Stack Overflow下的使用不同语言的阶乘算法。这不是高尔夫。提交了许多其他示例,其中许多是高尔夫,但许多不是。由于采用类似共享的许可方式,因此可以随意使用以上链接中任何示例中的代码作为起点。
在我的示例中,性能由于许多原因而表现欠佳:它使用了太多的进程,太多的字符串/ bigint转换。正如我所说的,这是一个故意的奇怪例子。它将计算5000!在这里在4核计算机上不到10秒。但是,一个更明显的两个衬里for / next循环可以做5000个!在3.6s的四个处理器之一上。
您绝对必须做得比这更好:
#!/usr/bin/perl -w
use strict;
use bigint;
die "usage: f.perl N (outputs N!)" unless ($ARGV[0] > 1);
print STDOUT &main::rangeProduct(1,$ARGV[0])."\n";
sub main::rangeProduct {
my($l, $h) = @_;
return $l if ($l==$h);
return $l*$h if ($l==($h-1));
# arghhh - multiplying more than 2 numbers at a time is too much work
# find the midpoint and split the work up :-)
my $m = int(($h+$l)/2);
my $pid = open(my $KID, "-|");
if ($pid){ # parent
my $X = &main::rangeProduct($l,$m);
my $Y = <$KID>;
chomp($Y);
close($KID);
die "kid failed" unless defined $Y;
return $X*$Y;
} else {
# kid
print STDOUT &main::rangeProduct($m+1,$h)."\n";
exit(0);
}
}
我对此的兴趣仅仅是(1)减轻无聊;(2)学习新东西。对我来说,这不是家庭作业或研究问题。
祝好运!