Parallel Permutations

楽土

Jo Christian Oterhals 要求为挑战2提供一个并行的解决方案。我相信他自己也有问题,因为他的代码中有不少 for 循环。通过将这些循环改为方法调用链,我们可以使用 .hyper 来并发运行一些代码。

use v6.d;

constant CORES = $*KERNEL.cpu-cores;

# workaround for #1210
sub prefix:<[max]>(%h){ %h.sort(-*.value).first }

my %dict = "/usr/share/dict/words".IO.lines.map({ .lc => True });

my %seen;
%dict.keys».&{ %seen{.comb.sort.join}++; };

with [max] %seen {
    say .value, .key.comb.hyper(:batch(1024), :degree(CORES)).permutations».join.grep({ %dict{$_}:exists }).Str
}

我的方法和Jo的有点不同。我并不试图保留所有的组合,而只是计算词表中每个词的反义词。然后,我找到一个有最多异构的词(有更多的候选词,数量相同,我跳过),并重建这个词的异构。

唯一发生任何形式的计算的操作是生成换词。其他任何事情都是对内存的约束,无法通过旋转线程来获得提升。有了 .hyper-call,程序的速度比在我的Threadripper 盒子上只用一个线程快了一小半。核心慢/缓存小的系统应该受益更多一些。主要的问题是,整个单词列表适合放在三级缓存中。如果有更大的数据集,一个快速的系统可能也会受益。

在很多情况下,多核系统是仙尘,这让芯片制造商的钱包闪闪发光。Wrangling Hashs 似乎是其中之一。

by gfldex.

comments powered by Disqus