多线程二分法搜索

时间:2018-12-21 11:42:00

标签: multithreading algorithm bisection

假设我有一些可计算的谓词P,它将整数映射为布尔值。我知道P 0是真实的,并且我知道N使得P N是错误的。我也知道P n = false意味着P (n + 1) is false [*]。我想找到最大n,以使P n为真。

很显然,我可以按两部分找到解决方案。不幸的是,评估P很昂贵(也许需要一个小时左右)。我也有一个有很多核心的闪亮服务器。

如果评估P花费的时间恒定并且我有2个线程(例如),我可以看到如何进行搜索。我将间隔[a,b]分为三个部分,并评估了P (2a + b)/3P (a + 2b)/3。两项评估完成后,我便知道要递归到这三个部分中的哪一个。使用两个线程,我的搜索时间将减少三分之一。很棒!

但是,如果评估P花费的时间千差万别怎么办?在我的具体示例中,可能需要10秒钟到一个小时左右。再次假设我有2个线程,并且如上所述划分了间隔。也许第一个线程(评估P (2a+b)/3)首先完成。我该如何决定在哪里运行下一个?

我猜想与信息论或类似理论之间存在某种联系,因为根据我目前的知识,我正在尝试运行能够为我提供最多信息的测试。但这似乎应该是别人研究过的一个问题-有人可以指出我的论文或类似论文吗?

[*]在我关心的具体情况下,该测试涉及运行SMT求解器,尝试找到具有X≥n形式的一个额外约束的约束问题的解决方案X,其中n是上述整数。 / p>

2 个答案:

答案 0 :(得分:1)

如果您正在寻找论文参考,您可能会在CS.SE上获得更多的关注。在这里,我只能提供一些启发式方法。

只要一个线程结束,您就可以停止所有其他您现在知道答案的线程(即,如果您拥有P(n)=T,则可以停止所有在k<n上运行的线程,并且如果{{1} },您可以停止在P(n)=F上运行的所有线程)。因此,您现在有1个或多个线程可以启动。

从信息论的观点出发,将现有的间隔进行划分以最小化新间隔的最大长度显然是最佳的。

但是,由于您在评论中注明:

  

SMT求解器需要更长的时间才能得到满意的解决方案

k>n开始然后慢慢 下来可能会更快(例如,如果您知道n和{{ 1}},以3个线程测试95、90、80,而不是信息论建议的25、50、75。

您还可以将运行时间用作可能结果的指示。 例如,在P(100)=F上启动3个线程。假设您在一分钟内学会了P(1)=T,但另外两个仍在运行。然后,您可以让n=25,50,75线程进入睡眠状态(将来在必要时被唤醒或杀死),并为60和70启动两个新线程。

答案 1 :(得分:0)

如果没有更多关于P评估时间的知识(如统计属性或与参数n的某种联系),那么最好是使用首先完成的评估而不等待其他开始的评估的最佳策略。那是因为持久评估可以比快速评估持续数百倍。快速评估很少能很快缩短搜索间隔,因此根本不需要持久的评估。

我会尝试二进制搜索的策略,该策略会在间隔一半开始更多的评估。例如。如果必须检查间隔[0,100],并且有8个线程比n = [47,...,54]的开始评估要多。第一次评估完成后,请取消无法得出的评估,暂停其他评估,并继续前一个间隔的一半。当interval稍大于线程数(约1.5倍)时,请使用某种策略来覆盖整个间隔并进行评估,因为要找到结果,您必须检查两个邻居。暂停的评估将不超过2 * num_threads。