【问题标题】:When to switch from unordered lists to sorted lists ? [optimization]什么时候从无序列表切换到有序列表? [优化]
【发布时间】:2010-10-20 20:07:19
【问题描述】:

我必须实现一种算法来分解体素中的 3D 体积。该算法首先确定哪些顶点位于切割计划的每一侧,然后在第二步中哪条边穿过切割计划。

这个过程可以通过使用排序列表的好处来优化。识别分裂点是O log(n)。但是我必须为每个轴维护一个这样的排序列表,这个列表用于顶点和边。由于这是为了供 GPU 使用而实现的,所以我对内存管理(即 CUDA)也有一些限制。强加了侵入性列表 M/树和 C。

通过完整的“体素化”,我希望最终得到约 4000 个点和 12000 个边。幸运的是,这可以通过使用更智能的策略来优化,以摆脱处理过的体素并订购剩余体积切割以将其数量保持在最低限度。在这种情况下,我希望有少于 100 个点和 300 个边。这使得流程管理起来更加复杂,但最终可能会变得更加高效。

因此,问题是帮助我确定标准,以确定与简单的侵入式链表相比,使用排序数据结构的好处何时值得付出努力和复杂性开销。

【问题讨论】:

    标签: c optimization list gpu


    【解决方案1】:

    chmike,这听起来确实像是你想先用更简单的方法做的事情,然后看看它的行为方式。一旦你至少进入大容量(你似乎没有),任何类型的 GPU 体素化方法都对系统细节非常脆弱。在你的鞋子里,我肯定首先想要简单的实现,如果没有其他原因要检查......

    【讨论】:

    • 拥有一个简单明了的、或许速度较慢的版本是一个非常好的主意,它是正确的并且可以进行测试。然后你可以开发一个更复杂的版本,它会运行得更快,并且可以根据原始版本检查正确性。再说一次,制作排序的链表并没有那么复杂,它主要是关于如何插入元素,但是,以与排序顺序不同的顺序检索它们仍然会产生缓慢的结果,插入新元素也是如此。
    • 我已经拥有它并且可以验证体素化的好处。现在我想优化流程并使用与最初使用的策略不同的策略。在第一种方法中,我实例化了体素并用体积表面切割它们的小平面。这是最简单的实现,并且很容易并行化。但我最终多次重新计算相同的交点和其他值。通过体素化体积的优化可以避免它,但会产生开销。
    【解决方案2】:

    问题总是归结为哪个运算符最常见、访问或添加。 如果你有一个无序列表,添加它不需要时间,访问特定项目需要额外的时间。 如果您有一个排序列表,添加到它需要更多时间,但访问它会更快。

    大多数应用程序花费大部分时间访问数据,而不是添加数据,这意味着创建排序列表的(运行)时间开销通常会被访问列表所节省的时间平衡或覆盖。 如果您的数据中存在大量流失(听起来并不像这样),那么维护排序列表不一定是可取的,因为您将不断地将列表视为可观的 CPU 成本。

    数据结构的复杂性只有在它们不能以有用的方式排序时才重要。如果可以对它们进行排序,那么您将不得不采用

    的启发式方法

    访问次数:更改次数

    确定排序是否是个好主意。

    【讨论】:

    • 你是对的。对于每个剪辑,我必须将列表分成两部分。事实上,我将一部分保留在列表中,并提取另一部分的元素,这通常是很小的。然后我必须添加一些新元素。所以一棵树是一个糟糕的选择。排序的双向链表听起来更好。我每个轴都有一个列表。可以优化顶点插入,因为边在每个列表中定义了一个范围。搜索分割边缘插入的插入位置可以从前一个边缘位置开始。
    • 我开始怀疑维护这些数据结构的开销是否会破坏避免重新计算在我的第一个解决方案中发生的相同值的好处。 (请参阅我对西蒙回答的评论)。
    • 如果您要“重新计算”任何内容,那么最好创建某种“答案键”表/字典/树/排序列表并引用它,而不是重新计算。跨度>
    【解决方案3】:

    在考虑了所有答案后,我发现后一种用于避免重复计算的方法最终效率会降低,因为需要在数据结构中进行维护和导航。此外,初始方法很容易与一些小的内核例程并行化,因此更适合 GPU 实现。

    回顾我最初的方法,我还发现了重要的优化机会,使体积削减方法远远落后。

    因为我必须选择一个答案,所以我选择了 devinb,因为他回答了这个问题,但是 Simon 的评论(得到 Tobias Warre 评论的支持)对我来说同样有价值。

    感谢大家帮助我解决这个问题。 堆栈溢出是一项令人印象深刻的服务。

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多