【问题标题】:parallel convex hull algorithm in gpugpu中的并行凸包算法
【发布时间】:2011-10-16 12:34:43
【问题描述】:

我正在 CUDA 中对凸包实施分而治之的方法。这是我的方法: 自下而上:

  • 创建一个列表来存储凸包;
  • curSize = 输入大小(所有点);

  • 对于 i: 1 记录 N

  • 开始
  • curSize = curSize / 2;
  • 获取列表列表中每 2 个相邻的凸包并合并它们 进入更大的船体(使用标准的上下公切线 curSize 线程中分治凸包的方法
  • //最初它将列表中的每2个相邻点合并为一个外壳,然后 在下一次迭代中,它将大小为 2 的凸包合并为更大的 凸包等等..,最后列表列表将有一个 船体上的单个点列表
  • 结束

但是它变得太复杂了,我觉得我没有利用 CUDA 的并行能力,因为在树的每个级别我创建了 N/2^i 个线程,其复杂性为 O(N) 以合并该级别的所有相邻船体.因此,网络复杂度仍然是 O(N logN)。

你能告诉我如何让它变得更好,或者为凸包提供任何替代的更整洁的并行算法(如果我能得到 graham 扫描的并行版本的算法,那就太好了)?

【问题讨论】:

    标签: algorithm computational-geometry gpu


    【解决方案1】:

    您的算法的复杂度仍然是 O(N)(与单线程版本相比没有变化),因为您做了 3 件事:

    1. 管理线程:O(N)
    2. 从列表中删除一些顶点:摊销 O(N),因为只有 N 个点。
    3. 查看与已移除但在当前步骤中未移除的点相邻的点:O(N),因为每次合并的此类点不超过 2 个。

    但是如果你的点没有排序,你最好并行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2019-09-20
      • 2017-06-15
      • 2013-02-04
      • 2017-02-22
      • 2013-03-28
      • 2012-11-15
      相关资源
      最近更新 更多