是否有自动并行序言实现?
Posted
技术标签:
【中文标题】是否有自动并行序言实现?【英文标题】:Is there an automatic parallel prolog implementation? 【发布时间】:2013-02-11 13:04:11 【问题描述】:我目前正在做一些理论计算机科学方面的研究,我使用的主要工具之一是 prolog。我发现它特别适合编写非常快速的测试来反驳猜想。
但是,我已经到了蛮力搜索变得太慢的地步。虽然我可以使用不同的语言,但我使用 prolog 的全部意义在于编写代码来测试假设非常快速/简单。
我想知道,是否有允许自动并行化的 Prolog 实现?它不必非常快,但理想情况下,我正在寻找可以将代码放入其中并至少获得小幅加速的东西。
我不知道这是否可能。谷歌搜索显示了很多关于 Prolog 中自动并行性的学术文章,但我没有遇到任何实现。但是,我真的只熟悉 SWI-prolog,所以我绝对可以参考熟悉许多实现的人的建议。
我的代码使用了削减,但我相当确定我可以消除它们。至于 IO,唯一的 IO 是打印到控制台,这可能会移到任何并行代码之外。
【问题讨论】:
我熟悉几种 Prolog 实现,并且我已经完成了一些项目,这些项目涉及将搜索空间分成几部分,以便可以将工作分散到多台机器上。但是我不知道任何即插即用的实现。日本第五代计算机系统失败的一种观点是并发和逻辑编程不匹配。 Wikipedia article 提到了这一点并链接到 this arXiv.org paper。 另见 Kazunori Ueda 的 Logic Programming and Concurrency: a Personal Perspective,在我看来这是一个相当乐观的观点。 我记得读过关于“and-parallel”和“or-parallel”Prolog 变体的文章,但我不知道其中任何一个是否已进入现代生产 Prolog 环境。 是的,这正是我的问题。我已经阅读了不同的变体,只是在学术论文和理论讨论之外找不到太多内容。 【参考方案1】:您确定需要并行性来“至少获得一点加速”吗?
你说你只熟悉SWI-Prolog,那就试试其他Prolog系统吧。根据http://www.probp.com/performance.htm 的基准测试结果(可能与您的特定问题相关,也可能不相关),您应该尝试 B-Prolog、YAP 和 SICStus-Prolog(这个不是免费的)。如果幸运的话,您可以通过切换 Prolog 系统获得数倍的加速。
另一种可能的低成本加速方法 - 使用支持表格的系统(B-Prolog、XSB 或 YAP),只需在程序的第一行添加 :- auto_table.
之类的内容。根据您的问题和现有程序,您可以获得显着的加速(或根本没有加速)。
【讨论】:
+1 用于尝试其他编译器。尤其是 Gnu-Prolog 可以编译为本机代码,这几乎肯定会比 SWI-Prolog 显着加快速度。【参考方案2】:使用 Prolog 并不难找到并行性,但很难选择使用哪一个 ;)。
也许Parlog - logic based programming language, designed for parallel execution 会对您有所帮助。有implementation for windows,但我不确定它是否使用多核。但是,您可以尝试联系那里的作者。
【讨论】:
【参考方案3】:在 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
所以有一个加速,因为问题可以在多个线程上运行。
【讨论】:
以上是关于是否有自动并行序言实现?的主要内容,如果未能解决你的问题,请参考以下文章