【问题标题】:Alpha-Beta "breaking" the Amdahl's law?Alpha-Beta“打破”阿姆达尔定律?
【发布时间】:2015-02-06 14:11:32
【问题描述】:

我有一个经典的极小极大问题求解器,带有额外的 alpha-beta 修剪实现。

我通过以下方式并行化算法:

  1. 进行迭代深化,直到我们的节点数超过可用线程数
  2. 在 N 个线程的批次中为每个线程运行一个 minimax。因此,如果我们从串行搜索中在深度 2 处获得 9 个可能的移动,我们首先启动 4 个线程,然后是另外 4 个线程,最后是 1 个线程,每个线程都从深度 2 开始并具有自己的参数。

事实证明,4 个线程的加速比 S=T(serial)/T(parallel) 是 4.77,所以我在这里基本上违反了 Amdahl 定律。

如果我们说实现没有以某种方式被破坏,我怀疑 Alpha-Beta 修剪在这里起到了神奇的作用?由于并行启动多个搜索,因此修剪次数更多,更快?这是我的理论,但如果有人能更详细地证实这一点,我会很高兴。

澄清一下:

没有 alpha-beta 实现的 Minimax 基本上是对整棵树进行深度优先搜索,直到某个最大深度。 对于 alpha-beta,它的作用相同,只是它会修剪一些分支,这无论如何都会导致更糟糕的结果。

编辑:在进一步检查代码后,我在一行代码中发现了一个错误,导致程序“作弊”而不遵循某些动作。现在实际的加速因子是 3.6。很抱歉浪费大家的时间.. 今天在计算方面没有突破。 :/

【问题讨论】:

  • 一个线程可以使 L3 缓存达到峰值,让其他内核更容易访问内存。

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


【解决方案1】:

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

【讨论】:

  • 我如何确定这是否真的发生了?如何分析缓存命中?
【解决方案2】:

使用更多线程可以有效地运行部分广度优先搜索。碰巧你的问题适合广度优先搜索。

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

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

假设您要搜索两个列表:

  • 一百万次0,然后是1

  • 1,然后是 100 万次 0

你一找到1就停下来。如果您按顺序搜索它们,您需要查看 1,000,002 个元素。如果您在单个内核上使用两个线程,搜索将立即找到1,您就完成了。 1,000,000 倍左右的“超线性”加速!

【讨论】:

  • 但是 alpha-beta 与它有什么关系吗?如果我把它拿出来,我实际上是在搜索整个树直到一个固定的最大深度,而不仅仅是找到像 1 这样的值。所以如果没有 a-b,单线程 CPU 将访问相同数量的节点,无论使用什么搜索技术并获胜不要更快。编辑了我的第一篇文章以进行澄清。
  • 但是线程数确实会影响您首先查看的位置,对吗?甚至非常间接。
  • 确实如此。但是,假设您必须搜索整个树,这里就是这种情况。在那种情况下,部分广度优先搜索不会比深度优先搜索快吗?
  • 我没有 100% 遵循你的算法。您是说根据您找到的内容,您无法提前中止搜索?如果没有,你是对的。那么这可能是由于其他答案所暗示的缓存效应。但我认为缓存效应更可能不是原因,因为这里的效应太强了。
  • 是的,在基本的极小极大实现中,整个树都被搜索并且在此之前它不会中止。但是随着 alpha-beta 的添加,一些分支被修剪掉了。因此,也许当在部分广度优先搜索而不是深度优先搜索中使用 alpha-beta 时,它会修剪得越来越快。我想这是我问题的核心。
猜你喜欢
  • 2013-04-25
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2016-04-26
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多