Alpha-Beta"打破"阿姆达尔的法律?

时间:2015-02-06 14:11:33

标签: c++ multithreading minimax alpha-beta-pruning parallelism-amdahl

我有一个经典的minimax问题解决方案,还有额外的alpha-beta修剪实现。

我按以下方式对算法进行了并行化:

  1. 迭代加深,直到我们有比可用线程更多的节点
  2. 在N个线程的批次中为每个线程运行一个minimax。因此,如果我们在串行搜索的深度2处获得9次可能的移动,我们首先开始4个线程,然后是另外4个线程,然后是1个线程,每个线程从深度2开始,使用自己的参数。
  3. 事实证明,4个线程的加速S = T(串行)/ T(并行)是4.77,所以我基本上打破了Amdahl定律。

    如果我们说实施没有以某种方式打破,我怀疑Alpha-Beta修剪在这里做了什么?由于并行开始多次搜索,有更多修剪和更快?这是我的理论,但如果有人能够更详细地证实这一点我就会喜欢。

    只是为了澄清:

    没有alpha-beta实现的Minimax基本上是对整个树进行深度优先搜索,直到某个最大深度。 使用alpha-beta它会做同样的事情,除非它修剪一些分支,否则会导致更糟糕的结果。

    编辑:在进一步检查代码后,我在一行代码上遇到了一个错误,导致程序“欺骗”#34;而不是采取一些举措。实际加速因子现在是3.6。很抱歉浪费每个人的时间..今天的计算没有突破。 :/

2 个答案:

答案 0 :(得分:1)

这可能是由于缓存效应或类似原因造成的。它被称为superlinear speedup。它可以/确实发生。

答案 1 :(得分:1)

使用更多主题,您实际上正在运行部分广度优先搜索。碰巧你的问题适合广度优先搜索。

即使在单核机器上,您也会看到加速。

您不需要线程来实现此加速。您可以简单地编写一个(部分)广度优先搜索,其行为类似于多个线程。

想象一下,你想要搜索两个列表:

  • 100万次0,然后是1

  • 1,然后100万次0

一旦找到1,就会停止。如果按顺序搜索它们,则需要查看1,000,002个元素。如果您在单个核心上使用两个线程,搜索将立即找到1并且您已完成。 A"超线性"加速1000,000x左右!