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/1,write/1,copy_term/2等。
为了使您的核心正常工作,您可以使用可由应用程序启动的线程。使用最新的 swipl 版本可以帮助您获得它提供的最新改进。
您还可以启动多个应用程序,每个应用程序运行例如 8 个线程。结果:更多的内核将开始工作,尽管总数会比运行具有更多线程的单个应用程序占用更多的内存。现在,您需要管理不同的应用程序实例,以便整体工作顺利进行(并且不要重复在其他应用程序上完成的工作)。我想即使在具有更多线程的单个应用程序的情况下也需要这样做。我的答案在技术上不是很深入,但会让你使用更多的核心来完成 CPU 密集型工作。
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |