我已经开始致力于多线程和点云处理。问题是我必须在现有的实现上实现多线程,并且读写操作太多,因此由于grid
进行了太多的读取操作,因此使用互斥锁不能为我提供足够的性能提升。
[最后,我修改了代码,使我可以拥有一个vtkSmartPointer<vtkUnstructuredGrid>
来保存我的点云。线程唯一要做的操作是使用GetPoint方法访问点。但是,即使由于智能指针而具有只读操作,它也不是线程安全的。
因此,我必须为每个线程复制主点云,如果我有太多线程和大云,最终会导致内存问题。
我试图将点云切成块,但是当我有太多线程时,它又变得太复杂了。我不能保证为每个线程处理的优化点数。我还要对每个点进行邻居搜索,因此将点云切成块变得更加复杂,因为我需要每个块都有重叠才能获得正确的邻域搜索。
因为vtkUnstructuredGrid
经过内存优化,所以我无法用某些STL容器替换它。如果您可以向我推荐可以用于线程安全读取的点云处理数据结构,我将不胜感激。或者,如果我可以使用其他解决方案。
提前感谢
我不熟悉VTK或它如何工作。
通常,有多种技术和方法可以改善多线程环境中的性能。问题很模糊,所以我只能提供一个笼统的答案。
std::shared_mutex
,因为它允许同时进行多个读取。std::atomic
进行有效的并发。我不太熟悉它,它绝对不是很简单,但是您可以在互联网上找到有关它的教程。据我所知,这种方法的某些部分仍在研究和开发中,尚未开发最佳实践。P.S。如果对同一数据有许多读/写...实现是否甚至意识到数据在多个线程上共享的事实?它甚至可以正确执行吗?您可能最终需要重写整个实现。
我只是以为我发布了解决方案,因为这实际上是我的愚蠢。我意识到我的代码的一部分使用的是double* vtkDataSet::GetPoint(vtkIdType ptId)
的GetPoint()
版本,该版本不是线程安全的。
对于多线程代码,应使用void vtkDataSet::GetPoint(vtkIdType id,double x[3])
。