swi-prolog 中的多线程有一点改进

Fib*_*sky 6 multithreading prolog swi-prolog

我有一个执行繁重计算的代码:pred(In, Out)假设执行64K 次,每次执行需要 1-10 秒。

我想使用多线程(64)机器来加快进程。我concurrent_maplist为此使用:

concurrent_maplist(pred, List_of_64K_In, List_of_64K_Out).

我得到了大约 8 倍的加速,但不会超过这个速度。我认为原因是以下通知concurrent_maplist

请注意,此谓词的开销相当大,因此在达到加速之前,目标必须相当昂贵。

为了使目标相当昂贵,我将代码修改为:

% putting 1K pred/2 in heavy_pred/2 
concurrent_maplist(heavy_pred, List_of_64_List_of_1k_In, List_of_64_List_of_1k_Out).

heavy_pred(List_of_In, List_of_Out) :-
  maplist(pred, List_of_In, List_of_Out).
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是(对我而言),我没有进一步加快这种变化。

我想知道如何通过多线程进一步加快速度?

一些额外的细节

架构:x86_64, AMD, 14.04.1-Ubuntu

swipl -v: SWI-Prolog version 6.6.4 for amd64.

pred/2 是一个定理证明器,它采用公式并试图证明它们。它采用标准的谓词很少非标准的:cyclic_term/1write/1copy_term/2等。

pet*_*.fr 0

为了使您的核心正常工作,您可以使用可由应用程序启动的线程。使用最新的 swipl 版本可以帮助您获得它提供的最新改进。

您还可以启动多个应用程序,每个应用程序运行例如 8 个线程。结果:更多的内核将开始工作,尽管总数会比运行具有更多线程的单个应用程序占用更多的内存。现在,您需要管理不同的应用程序实例,以便整体工作顺利进行(并且不要重复在其他应用程序上完成的工作)。我想即使在具有更多线程的单个应用程序的情况下也需要这样做。我的答案在技术上不是很深入,但会让你使用更多的核心来完成 CPU 密集型工作。