gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:43:57 25 4
gpt4 key购买 nike

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

我想使用多线程(64)机器来加快进程。
我用 concurrent_maplist 为了这:
concurrent_maplist(pred, List_of_64K_In, List_of_64K_Out).
我得到了大约 8 倍的加速,但不会超过这个速度。
我以为原因是以下通知 concurrent_maplist :

Note that the the overhead of this predicate is considerable and therefore Goal must be fairly expensive before one reaches a speedup.



为了使目标相当昂贵,我将代码修改为:
% 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).

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

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

一些额外的细节 :

架构: 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 密集型工作。

关于multithreading - swi-prolog 中的多线程有一点改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421212/

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