并行动态规划

Posted

技术标签:

【中文标题】并行动态规划【英文标题】:Parallel Dynamic Programming 【发布时间】:2010-11-09 20:41:32 【问题描述】:

有没有什么好的论文讨论如何获取动态程序并将其并行化?

【问题讨论】:

我在大学里做过一篇关于这个的论文,我在图书馆里找到了一大堆书,但几乎没有论文。 我们在哪里可以找到您的论文? @Windfinder:这是你的机会...... 【参考方案1】:

我们最近发表了一篇论文,展示了如何并行化任何 d.p.通过共享无锁哈希表在共享内存多核计算机上:

Stivala, A. 和 Stuckey, P. J. 和 Garcia de la Banda, M. 和 Hermenegildo, M. 和 Wirth, A. 2010 “无锁并行动态规划”J. Parallel Distrib。计算。 70:839-848 doi:10.1016/j.jpdc.2010.01.004

http://dx.doi.org/10.1016/j.jpdc.2010.01.004

本质上,您启动了多个线程,所有线程都从 d.p 的值开始运行相同的代码。您想要计算,自上而下(递归)计算,并在共享的无锁哈希表中记忆,但要随机化计算子问题的顺序,以便线程在计算子问题时发散。

在实现方面,我们只是在 UNIX 类型系统上使用了 C 和 pthread,您所需要的只是能够拥有共享内存,以及用于线程之间无锁同步的 CompareAndSwap (CAS)。

由于这篇论文发表在 Elsevier 期刊上,您需要通过大学图书馆或类似机构订阅以上内容才能访问。不过,您也许可以通过 Stuckey 教授的网页获得预印本。

【讨论】:

如果存储答案的哈希表很大,则任何哈希表元素的争用率可能接近于零。我不清楚“无锁”版本是否会比直接实施良好的锁更快,因为每次尝试锁定都会在第一次尝试时成功。 (CAS 可用于无锁,但在 CAS 执行期间仍会锁定对缓存行的访问,任何同步原语也是如此)【参考方案2】:

IIRC,您通常对动态规划所做的是将问题递归地划分为子问题,并从最优子解决方案中组装出最优解决方案。它之所以有效,是因为所有最优子解决方案都内置在缓存中,因此无需重新计算。

如果问题可以分为多种方式,您可以为每个子解决方案分叉求解器。如果每个(子)问题平均有 1+epsilon(对于 epsilon 有趣地大于零)可能的子解决方案,那么您将通过这种方式获得很多并行性。您可能需要锁定缓存条目,以防止单个解决方案被多次构建。

您需要一种语言,在这种语言中,您可以比解决它们的工作更便宜地分叉子任务,并且很高兴同时拥有许多分叉任务。大多数语言中典型的并行产品在这方面做得很糟糕。在使用“大堆栈模型”的系统中,您不能有很多分叉任务(请参阅How does a stackless language work?)。

我们实现了并行编程语言 PARLANSE,以获得具有正确属性的语言。

【讨论】:

【参考方案3】:

已经有一些与在 GPU 上实现动态编程算法相关的工作。例如:

Dynamic Programming with CUDAGPU optimized dynamic programmingA GPU Implementation of Dynamic Programming for the Optimal Polygon Triangulation

【讨论】:

以上是关于并行动态规划的主要内容,如果未能解决你的问题,请参考以下文章

WC2001cogs358高性能计算机(动态规划)

算法动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

算法动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

算法动态规划 ② ( 动态规划四要素 | 动态规划状态 State | 动态规划初始化 Initialize | 动态规划方程 Function | 动态规划答案 Answer )

算法动态规划 ② ( 动态规划四要素 | 动态规划状态 State | 动态规划初始化 Initialize | 动态规划方程 Function | 动态规划答案 Answer )

算法动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )