Parallel processing 并行二进制搜索
我刚刚开始学习并行编程,我正在学习二进制搜索 这真的不能通过增加处理器来优化,对吗?我知道它被认为是分裂和征服,但你真的是“减少和征服”(从) 或者你能把这些比较进行平行化吗?(如果Parallel processing 并行二进制搜索,parallel-processing,binary-search,Parallel Processing,Binary Search,我刚刚开始学习并行编程,我正在学习二进制搜索 这真的不能通过增加处理器来优化,对吗?我知道它被认为是分裂和征服,但你真的是“减少和征服”(从) 或者你能把这些比较进行平行化吗?(如果X小于array[mid],则从low搜索到mid-1;否则如果X大于array[mid]则从mid+1搜索到high,否则返回mid,索引X) 或者,将数组的一半给一个处理器进行二进制搜索,另一半给另一个处理器如何?那不是很浪费吗?因为它是减少和征服,而不是简单的分裂和征服?想法 我在并行编程方面没有太多经验,但我
X
小于array[mid]
,则从low
搜索到mid-1
;否则如果X
大于array[mid]
则从mid+1
搜索到high
,否则返回mid
,索引X
)
或者,将数组的一半给一个处理器进行二进制搜索,另一半给另一个处理器如何?那不是很浪费吗?因为它是减少和征服,而不是简单的分裂和征服?想法 我在并行编程方面没有太多经验,但我怀疑这是并行处理的一个很好的候选者。算法的每一步都取决于执行一次比较,然后根据该比较沿着一条设定的“路径”前进(您要么找到了自己的值,要么现在必须根据该比较在设定的“方向”上继续搜索)。两个单独的线程执行相同的比较不会让您更快,而单独的线程都需要依靠相同的比较来决定下一步要做什么,因此它们无法真正独立完成任何有用的、分开的工作 至于你分裂数组的想法,我认为你只是在否定二进制搜索在这种情况下的好处。您的值(假设它在数组中)将位于数组的上半部分或下半部分。二进制搜索中的第一个比较(在中点)将告诉您应该查找哪一半。如果你进一步考虑,把N个元素的数组分解成n个不同的二进制搜索(一个天真的尝试并行化)。您现在正在进行N次比较,而您不需要这样做。您正在失去二进制搜索的功能,因为每次比较都会将搜索范围缩小到适当的子集
希望有帮助。欢迎评论。您可以轻松使用并行性 对于
k
小于n
处理器,将数组拆分为n/k
组,并为每个组分配一个处理器
对该组运行二进制搜索
现在时间是log(n/k)
还有一种crew方法,即logn/log(k+1)并行实现可以加快二进制搜索,但改进并不特别显著。最坏的情况是,二进制搜索所需的时间是
log_2(n)
,其中n
是列表中的元素数。一个简单的并行实现将主列表分解为k
子列表,由并行线程进行bin搜索。二进制搜索产生的最坏情况时间是log_2(n/k)
,实现了搜索时间的理论减少
示例:
1024个
条目的列表使用单个线程进行二进制搜索需要多达10个
周期。使用4个
线程,每个线程只需8个
周期即可完成搜索。并且使用8个
线程,每个线程执行7个
周期。因此,一个8
线程化的并行二进制搜索比单线程模型快30%
然而,他的加速不应与效率的提高混淆:与单线程二进制搜索执行的
10
比较相比,8
线程化模型实际执行8*7=56
比较来完成搜索。如果二进制搜索的并行应用程序的速度的边际增益适合或有利于它们的应用程序,这取决于程序员的判断。我认为它肯定符合并行化的条件。至少,跨越两个线程。让一个线程进行深度优先搜索,另一个线程进行广度优先搜索。胜利者是执行速度最快的算法,这可能与不同的数据集不同。我非常确信二进制搜索可以以log(M)的因数加速,其中M是处理器的数量。log(n/M)=log(n)-log(M)>log(n)/log(M)对于常数M,我没有一个紧下界的证明,但是如果M=n,执行时间是O(1),这再好不过了。下面是一个算法示意图
并行二进制搜索(排序数组列表)
现在,有另一种并行化可以提供帮助:SIMD!查看Intel/UCSC/Oracle团队的“现代CPU和GPU上的快速体系结构敏感树搜索”(SIGMOD 2010)。这很酷。顺便说一句,我目前的研究项目正是基于这篇论文。如果有读者认为我轻率,我实际上不是。对于算法本身可能无法并行的时间关键部分,使用具有不同性能特征的多个算法可能是一种有效的优化,以保持最坏情况的规模-哦,排队。你怎么能