【问题标题】:Parallel Primes in Prolog?Prolog中的平行素数?
【发布时间】:2019-07-15 16:28:36
【问题描述】:

我有以下简单的代码来确定素数。它是一个简单的生成和测试,没有经过优化:

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

这是一个运行示例:

?- between(1,20,N), prime(N), write(N), nl, fail; true.
1
2
3
5
7
11
13
17
19
true.

如何在 Prolog 中的多个线程上并行化素数列表?输出列表不需要排序。

【问题讨论】:

  • 您想并行计算它们吗?不知道并行列出它们是什么意思。
  • @j4nbur53:将输入数字集划分为 M 个不相交的集合,其中 M 是并行线程数,然后使用其中一个集合运行每个线程
  • SWI Prolog Discourse 交叉posted。给出了答案。
  • @gusbro 不相交集很困难,下限可以包含比上限更多的素数。您需要不均衡地拆分它以获得最佳结果。所以我决定改用 1000 个数字的花束。

标签: multithreading parallel-processing prolog


【解决方案1】:

这是迄今为止我能做到的最好的。我部署了 JDK 13.0,它在顺序上更差,但在并行上更好。我使用balance/1 谓词,但也应用了一些代码转换。

代码转换是这样的,我将范围分成包含 1000 个数字的花束,并且已经进行了聚合。测试是在具有 8 个逻辑 CPU 的 i7-6700HQ 上进行的:

顺序:

Jekejeke Prolog 4, Runtime Library 1.4.0 (July 6, 2019)

?- time(count(N)).
% Up 8,655 ms, GC 39 ms, Thread Cpu 8,593 ms (Current 07/16/19 16:47:49)
N = 78499

平行:

?- time(count2(N)).
% Up 2,628 ms, GC 4 ms, Thread Cpu 0 ms (Current 07/16/19 16:48:16)
N = 78499

这是源代码:

:- use_module(library(advanced/arith)).
:- use_module(library(advanced/aggregate)).
:- use_module(library(runtime/distributed)).

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

/* sequential */
count(N) :-
   aggregate_all(sum(M), (between(1, 1000, Y), slice(Y, M)), N).

/* parallel */
count2(N) :-
   aggregate_all(sum(M), balance((between(1, 1000, Y), slice(Y, M))), N).

slice(Y, M) :-
   aggregate_all(count, (H is Y*1000, L is H-999, between(L, H, X), prime(X)), M).

编辑 17.07.2019:
更改了 time/1 谓词,以便它还显示在所有派生线程中花费的线程 CPU 时间。似乎该解决方案接近最优,因为它的逻辑 CPU 利用率接近于逻辑 CPU 的数量。

以下是线程时间/正常运行时间的一些比率:

/* parallel, primes 1, no bouquets */
25622/5732 ~ 4.46 

/* parallel, primes 2, bouquets */
21464/2717 ~ 7.89 

所以我猜这里介绍的花束解决方案,它没有大量短期工作,在分配框架中的摩擦比没有花束的解决方案少。

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多