我有一个经典的minimax问题解决方案,还有额外的alpha-beta修剪实现。
我按以下方式对算法进行了并行化:
事实证明,4个线程的加速S = T(串行)/ T(并行)是4.77,所以我基本上打破了Amdahl定律。
如果我们说实施没有以某种方式打破,我怀疑Alpha-Beta修剪在这里做了什么?由于并行开始多次搜索,有更多修剪和更快?这是我的理论,但如果有人能够更详细地证实这一点我就会喜欢。
只是为了澄清:
没有alpha-beta实现的Minimax基本上是对整个树进行深度优先搜索,直到某个最大深度。
使用alpha-beta它会做同样的事情,除非它修剪一些分支,否则会导致更糟糕的结果。
编辑:在进一步检查代码后,我在一行代码上遇到了一个错误,导致程序“欺骗”#34;而不是采取一些举措。实际加速因子现在是3.6。很抱歉浪费每个人的时间..今天的计算没有突破。 :/
答案 0 :(得分:1)
这可能是由于缓存效应或类似原因造成的。它被称为superlinear speedup。它可以/确实发生。
答案 1 :(得分:1)
使用更多主题,您实际上正在运行部分广度优先搜索。碰巧你的问题适合广度优先搜索。
即使在单核机器上,您也会看到加速。
您不需要线程来实现此加速。您可以简单地编写一个(部分)广度优先搜索,其行为类似于多个线程。
想象一下,你想要搜索两个列表:
100万次0
,然后是1
1
,然后100万次0
一旦找到1
,就会停止。如果按顺序搜索它们,则需要查看1,000,002个元素。如果您在单个核心上使用两个线程,搜索将立即找到1
并且您已完成。 A"超线性"加速1000,000x左右!