gpt4 book ai didi

multithreading - 带有流输出的 SWI-Prolog 线程

转载 作者:行者123 更新时间:2023-12-01 15:15:15 24 4
gpt4 key购买 nike

如果我有一个像下面这样的程序,prolog 是否尝试并行证明 maximum/3 全部 3 次?即每个线程是否都有自己的核心(假设在计算机上可用)?

我的实际程序需要大约 2 小时才能在 maximum/3 的位置运行一个谓词,我有 70 个等价的 pair/2 需要计算。这种方法行得通吗?如果不是为什么不呢?我已将程序设置为运行,但从输出看来,它一次只执行一个线程。

maximum(X,Y,Y) :- X =< Y,!.
maximum(X,_,X).

pair(5,6).
pair(8,7).
pair(9,9).


thread(A,B,Stream) :-
maximum(A,B,C),
format(Stream, "max('~w','~w',~w).~n",[A,B,C]),
thread_exit(C).


start(File) :-
open(File,append,Stream,[]),
forall(
pair(A,B),
(
thread_create(thread(A,B,Stream),Id,[]),
thread_join(Id,exited(X)),
writeln(X)
)
),
close(Stream).

最佳答案

您可以利用 SWI-Prolog concurrent/3 库谓词来简化代码:

http://www.swi-prolog.org/pldoc/doc_for?object=thread:concurrent/3

另一种选择是 Logtalk 对高级多线程编程的支持(SWI-Prolog 是它支持的后端 Prolog 编译器之一)。

无论如何,这是一个两步过程:首先创建目标(应该并行执行),然后运行它们。但你不会那样做。 SWI-Prolog 线程被创建(默认)为非分离的。在您的代码中调用 thread_join/2 谓词意味着您正在等待刚刚创建的线程在传递给下一个线程之前完成。因此,您是正确的,并且您的代码一次只运行一个线程。尝试:

maximum(X,Y,Y) :- X =< Y,!.
maximum(X,_,X).

pair(5,6).
pair(8,7).
pair(9,9).

thread(A,B,Stream) :-
maximum(A,B,C),
format(Stream, "max('~w','~w',~w).~n",[A,B,C]).

start(File) :-
open(File,append,Stream,[]),
findall(thread(A,B,Stream), pair(A,B), Goals),
length(Goals, N),
concurrent(N, Goals, []),
close(Stream).

示例执行:
?- [concurrent].
true.

?- start(results).
true.

?-
% halt
$ cat results
max('5','6',6).
max('8','7',8).
max('9','9',9).

然而,使用目标数量作为要使用的线程(也称为工作线程)数量并不是最佳选择。使用从硬件内核数(或每个内核可以运行的线程数)派生的 N 值可能更好。

Logtalk 解决方案与使用其 threaded/1 内置谓词类似(但更便携)(但它使用目标连词而不是目标列表)。

关于multithreading - 带有流输出的 SWI-Prolog 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26849346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com