6

我目前正在做一些理论计算机科学的研究,我使用的主要工具之一是 prolog。我发现它对于编写非常快速的测试来反驳猜想特别方便。

但是,我已经到了蛮力搜索变得太慢的地步。虽然我可以使用不同的语言,但我使用 prolog 的全部意义在于编写代码来测试假设非常快速/简单。

我想知道,是否有允许自动并行化的 Prolog 实现?它不必非常快,但理想情况下,我正在寻找可以将代码放入其中并至少获得小幅加速的东西。

我不知道这是否可能。谷歌搜索显示了很多关于 Prolog 中自动并行性的学术文章,但我没有遇到任何实现。但是,我真的只熟悉 SWI-prolog,所以我绝对可以使用熟悉许多实现的人的建议。

我的代码使用了削减,但我相当确定我可以消除它们。至于 IO,唯一的 IO 是打印到控制台,这可能会移到任何并行代码之外。

4

3 回答 3

6

你确定你需要并行性来“至少获得一点加速”吗?

你说你只熟悉SWI-Prolog,所以试试其他Prolog系统。根据http://www.probp.com/performance.htm上的基准测试结果(可能与您的特定问题相关,也可能不相关),您应该尝试 B-Prolog、YAP 和 SICStus-Prolog(这个是不是免费的)。如果你幸运的话,你可以通过切换你的 Prolog 系统来获得几倍的加速。

另一种可能的低成本加速方法 - 使用具有表格支持的系统(B-Prolog、XSB 或 YAP),只需:- auto_table.在程序的第一行添加类似的内容。根据您的问题和现有程序,您可以获得显着的加速(或根本没有加速)。

于 2013-02-26T21:19:53.820 回答
5

使用 Prolog 并不难找到并行性,很难选择使用哪一个 ;) 。

也许Parlog - 为并行执行而设计的基于逻辑的编程语言会对您有所帮助。Windows有实现,但我不确定它是否使用多个内核。但是,您可以尝试联系那里的作者。

于 2013-02-26T09:10:32.613 回答
0

在 Jekejeke Prolog 中,我试图让程序员尽可能简单,并且确实提供了一个名为 balance/1 的简单构造。使用 balance/1 生成和测试问题:

 /* sequential */
 ?- Generate, Test.

将分布在多个线程上。调用就像将连词包装到谓词 balance/1 中一样简单。结果可能会进行一些重新排序:

 ?- use_module(library(runtime/distributed)).

 /* parallel */
 ?- balance((Generate, Test)).

这是一个并行生成素数的示例。顺序代码如下:

:- use_module(library(advanced/arith)).

prime(N) :-
    M is floor(sqrt(N)),
    between(2,M,K),
    N mod K =:= 0, !, fail.
prime(_).

?- time(aggregate_all(count, 
                     (between(1,1000000,X), prime(X)), N)).
% Up 6,737 ms, GC 33 ms, Thread Cpu 6,656 ms (Current 07/16/19 01:49:02)
N = 78499

并行执行相同的操作会给出:

?- time(aggregate_all(count, 
                      balance((between(1,1000000,X), prime(X))), N)).
% Up 4,167 ms, GC 39 ms, Thread Cpu 219 ms (Current 07/16/19 01:49:50) 
N = 78499

所以有一个加速,因为问题可以在多个线程上运行。

于 2019-07-15T17:03:42.433 回答