更好的快速行进方法?

计算科学 pde 并行计算
2021-12-18 09:22:21

我正在使用快速行进法 (FMM) 从某些点计算最短“距离”(行程时间)。

FMM 的工作方式是:我在 RAM 中保留一个速度函数:V(xi,yj,zk)。我还保留了前面所有点的优先级队列,按它们的 V 值排序。我反复向外传播这个队列中的第一个点。当我这样做时,我从队列中删除使用的点并插入前面“触摸”的点。

我目前的实现有两个问题:

I. 我必须将整个成本(慢)函数保存在 RAM 中。这限制了我可以使用的成本函数的大小。

二、我希望它更快。

关于如何改进我当前的实施的任何建议?例如,是否有可能在 GPU 上实现这一点?

1个回答

我目前的实现有两个问题:

I. 我必须将整个成本(慢)函数保存在 RAM 中。这限制了我可以使用的成本函数的大小。

二、我希望它更快。

第一点有点模棱两可。仅仅计算每个网格单元的成本函数和旅行时间并将它们存储在某个地方应该不是问题。问题是快速行进方法对这些数据的访问模式,它对缓存非常不友好,并且阻碍了有效的并行化。对于一个简单的实现,优先级队列是缓存的最严重违规者。存在缓存最优优先级队列,但即便如此,更新的内存访问模式仍然非常不规则。

第二点可能与算法的并行化潜力最相关。至少对于第二点,一个人可能被迫放弃快速行进的方法,而转而关注快速扫荡的方法。

快速扫描方法背后的观察结果是,对于更新来说,重要的是2n“大方向”的特征点。特别是这个“大体方向”不变的任何区域都可以通过扫描来更新。尽管如此,仍有许多不同的方法可以将这种观察转化为算法,哪种策略最有效取决于您的速度函数是否会导致具有恒定“总体方向”的大区域,或者它是否会创建更多的迷宫.