Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Prolog有多并发?_Performance_Concurrency_Prolog_Multicore - Fatal编程技术网

Performance Prolog有多并发?

Performance Prolog有多并发?,performance,concurrency,prolog,multicore,Performance,Concurrency,Prolog,Multicore,我在网上找不到这方面的任何信息。。。我对序言也很陌生 在我看来,Prolog可能是高度并发的,在尝试匹配规则时,可能会同时尝试多种可能性。现代Prolog编译器/解释器是否天生是并发的?哪一个?默认情况下是否启用并发?我是否需要以某种方式启用它 *我对多线程不感兴趣,只对固有的并发性感兴趣。从理论上讲,这似乎很有吸引力,但有各种各样的问题使得这种实现看起来不明智 不管是好是坏,人们习惯于认为他们的程序是从左到右和自上而下执行的,即使是在Prolog中编程。在标准Prolog中,谓词的子句顺序和

我在网上找不到这方面的任何信息。。。我对序言也很陌生

在我看来,Prolog可能是高度并发的,在尝试匹配规则时,可能会同时尝试多种可能性。现代Prolog编译器/解释器是否天生是并发的?哪一个?默认情况下是否启用并发?我是否需要以某种方式启用它


*我对多线程不感兴趣,只对固有的并发性感兴趣。

从理论上讲,这似乎很有吸引力,但有各种各样的问题使得这种实现看起来不明智

  • 不管是好是坏,人们习惯于认为他们的程序是从左到右和自上而下执行的,即使是在Prolog中编程。在标准Prolog中,谓词的子句顺序和子句中的术语顺序在语义上都是有意义的。将它们并行化将改变太多现有代码的行为,使其不再流行

  • 非关系语言元素(如cut运算符)只有在您可以依赖此类执行命令时才能有意义地使用,也就是说,除非发明了非常复杂的依赖项跟踪,否则它们将在并行解释器中无法使用

  • 所有现有的并行化解决方案都会导致线程间通信的性能开销

  • Prolog通常用于高级、深度递归问题,如图遍历、定理证明等。现代机器上的并行化(理想情况下)可以(理想情况下)对某些常量
    n
    实现
    n
    的加速,但它不能将不可行的递归解方法转化为可行的方法,因为这需要指数级的加速。相比之下,Fortran和C程序员通常解决的数值问题通常具有较高但相当有限的计算成本;将10小时的作业转换为1小时的作业非常值得并行化。相比之下,将一个可以向前看6步的程序转变成一个可以(平均)向前看6.5步的程序就没有那么引人注目了


从谷歌的快速搜索中可以看出,并发逻辑编程范式似乎只是少数研究语言的基础,不再积极发展。我看到过这样的说法:在莫扎特/奥兹系统中,并发逻辑很容易实现

现代Prolog编译器/解释器是否天生*并发?哪一个?默认情况下是否启用并发

不是。20世纪80年代,并发逻辑编程是日本第五代计算机程序的主要目标;人们期望Prolog变体能够在大规模并行硬件上“轻松”并行化。这项工作基本上失败了,因为自动并发并不容易。今天,Prolog编译器倾向于提供线程库,程序必须手动控制并发量

查看为什么并行化PROlog与其他语言一样困难,考虑语言提供的两个主要控制结构:连接(和串行执行)和析取(或者,选择回溯)。假设你有一个AND结构,比如

p(X) :- q(X), r(X).
您需要并行运行
q(X)
r(X)
。然后,如果
q
部分地统一了
X
,比如将其绑定到
f(Y)
,会发生什么
r
必须知道这个绑定,所以要么你必须传达它,要么你必须等待两个连接完成;如果其中一个失败,您可能会浪费时间,除非您再次让它们通信以进行同步。这会增加开销,很难正确处理。现在为或:

p(X) :- q(X).
p(X) :- r(X).
这里有有限数量的选择(当然,Prolog允许无限多的选择),所以您希望同时运行这两个选项。但是,如果一个人成功了呢?计算的另一个分支必须挂起并保存其状态。你打算一次储蓄多少州?处理器的数量看起来是合理的,但是你必须注意不要让计算产生不适合内存的状态。这意味着您必须猜测计算的状态有多大,Prolog对您隐藏了这一点,因为它抽象了处理器和内存等实现细节;不是C


换句话说,自动并行是很难的。第五代计算机项目通过设计承诺选择语言(即Prolog方言,无回溯)解决了一些问题。在这样做的过程中,他们彻底改变了语言。必须注意的是,并发语言Erlang是Prolog的一个分支,它也用回溯来换取更接近函数式编程的东西。它仍然需要用户指导才能知道程序的哪些部分可以安全地并发运行。

Prolog中有两种并发概念。一个与多线程相关,另一个与挂起的目标相关。我不知道你想知道什么。因此,我将首先对多线程进行一点扩展:

目前广泛使用的Prolog系统可以区分是否是多线程的。在多线程Prolog系统中,您可以生成在同一知识库上并发运行的多个线程。这给查询谓词和动态谓词带来了一些问题,这些问题由这些Prolog系统解决

您可以在此处找到多线程Prolog系统的列表:

多线程是各种并行化范例的先决条件。相应地,个性化的Prolog系统提供了服务于特定范例的结构。典型的范例是线程池,例如在web服务器中使用,或者为长时间运行的GUI任务生成线程

目前还没有一个线程库的ISO标准,尽管有一个提议,并且每个Prolog系统都有提供