在GPU上分割4D数据



我面临的问题是分割大型数据集(最多2048x2048x40x10000 x,y,z,t==解压缩的几个地形字节,给予或接受)。从好的方面来说,这个数据集中的特征相当小;最大20x20x20x20左右。

就我所见,没有现成的解决方案(如果我错了,请纠正我)。我对如何解决这个问题有一些计划,但我希望得到你的反馈。

一个时间片的最大值约为600mb;在典型情况下较少;我可以在我的4gb内存中保存一堆连续的这样的切片。

考虑到我的特征很小,我的直觉认为最好避免所有形式的分割聪明,只需对我的标签进行局部迭代式的洪水填充式更新;如果你的邻居有一个更高的标签,复制它;迭代直到收敛。迭代次数应以任何维度上的最大集群大小为界,该大小也应很小。

CUDA天生喜欢3D,所以我可以分两步来做;迭代所有尚未收敛的三维体积切片。然后简单地在所有连续的时间片上执行元素循环,并执行相同的floodfill逻辑。

我可以用一个简单的递增唯一计数器初始化迭代,或者先找到局部最大值,然后在那里播种标签。后者是首选的,所以我可以保留一个按标签索引的数组,以存储所有区域的x、y、z、t最小/最大范围(也可以作为后处理)。如果某个区域没有扩展到最近的时间片,则会从数据中删除该区域,并将其位置写入数据库。如果后面的时间片已经以这种方式完全耗尽(总和为零),请将其从内存中删除。(或者,如果内存溢出,也可以删除最新的;这样做的近似值将不得不接受)

这似乎应该奏效。考虑到z维度的大小有限,你认为启动x,y,z线程块更好,还是启动x,y块,让每个线程在z维度上循环更好?这是一种"试着看看"的事情,还是有一个简单的答案?

我刚刚想到的另一个优化;如果我把一个x,y,z块加载到共享内存中,那么在我有内存的时候执行几个floodfill更新不是更快吗?也许最好让本地内存迭代到收敛,然后继续……我想这与上述问题有关。单个邻居最大查找可能是次优计算强度,因此在z上循环或迭代几次应该会抵消这一点。我想我更喜欢后者。

另一个问题;类似的东西似乎还不存在,但如果链接到包含做类似事情的模板代码的项目,我们将不胜感激(优化的三维floodfill代码?),因为我对CUDA的了解仍然参差不齐。

提前感谢您的想法和反馈!

用于记录;我得到了一个有效的解决方案,我很满意;当它稍微成熟一点的时候,可能会把它放在网上。以下是描述:

我现在做的是:

  • 查找最大值
  • 使用原子增量标记最大值
  • 创建每个像素指向自身的指针图像
  • 指针图像上的泛洪填充:如果邻居指向更大的值,则复制他的指针

这将提供一个分水岭指针图像,每个指针指向一个唯一的标签。

然后我做了一个合并步骤;如果相邻的像素指向不同的标签,并且它们的值超过了一个trehold,我会合并它们的标签,这样"充分连接"的最大值就不会形成它们自己的区域。

然后我取消引用指针,我有一个很好的标签图像。由于我只在最大值上播种标签,因此最大值标签是一个小数字;我分配了一个这样大小的6xN数组,并使用原子计算每个特性的最小/最大范围。

目前没有使用任何共享内存,但速度已经相当快了。我不小心做了一些半聪明的事;由于我首先做了一个分水岭,然后用一次扫描合并相邻的水流失区域,所以我实际上是在做某种多级算法。性能主要由大量的floodfill调用和两到三次合并扫描决定。正确使用共享内存可以将我的内存带宽需求减少5倍,但在它明确显示为瓶颈之前,我将拭目以待。我已经得到了一个更像我想要的分割,而不是我可以与scipy争论的分割,它更快,使用的内存更少一个数量级,所以我现在很高兴。

最简单的方法是使用1D存储并在其上覆盖4D索引模式。

address=x+y*宽度+z*高度*宽度+t*长度*高度*宽;

这意味着

数据(0,1,0,0)和数据(1,0,0,0)位于连续地址,但

数据(0,0,0、0)和数据(0、0、0,1)是宽度*高度*长度地址部分。

但是,如果您的访问模式正在处理最近的邻居,那么您需要空间局部性来进行索引。

这可以使用索引的Morton Z(Peano Key)排序来实现。它将最近的邻居放置在紧密的线性存储器地址中。这个Z阶线性地址是通过交错x,y,Z,t索引的交替比特而获得的。有关2D示例,请参见

http://graphics.stanford.edu/~seander/bithacks.html#InterleaveTableObvious

我建议使用一种金字塔处理方案:您可以快速计算类似mipmap的细节级别,存储组合体素的最大/最小值。这应该会产生类似于八叉树的结果。然后你可以只在感兴趣的区域开始分割,这会大大加快速度。如果你只有几个非常小的片段,这应该会很好地工作。

我想你也可以使用级别集(可以在GPU上实现),但我发现这些有点难以实现(谷歌搜索"CUDA级别集")。

随着时间的推移,你是否必须跟踪你的细分市场?你知道怎么做吗?

相关内容

  • 没有找到相关文章

最新更新