vtkUnstructuredGrid-> GetPoint()的线程安全只读替代品

问题描述 投票:0回答:2

我已经开始致力于多线程和点云处理。问题是我必须在现有的实现上实现多线程,并且读写操作太多,因此由于grid进行了太多的读取操作,因此使用互斥锁不能为我提供足够的性能提升。

[最后,我修改了代码,使我可以拥有一个vtkSmartPointer<vtkUnstructuredGrid>来保存我的点云。线程唯一要做的操作是使用GetPoint方法访问点。但是,即使由于智能指针而具有只读操作,它也不是线程安全的。

因此,我必须为每个线程复制主点云,如果我有太多线程和大云,最终会导致内存问题。

我试图将点云切成块,但是当我有太多线程时,它又变得太复杂了。我不能保证为每个线程处理的优化点数。我还要对每个点进行邻居搜索,因此将点云切成块变得更加复杂,因为我需要每个块都有重叠才能获得正确的邻域搜索。

因为vtkUnstructuredGrid经过内存优化,所以我无法用某些STL容器替换它。如果您可以向我推荐可以用于线程安全读取的点云处理数据结构,我将不胜感激。或者,如果我可以使用其他解决方案。

提前感谢

c++ multithreading performance vtk point-clouds
2个回答
1
投票

我不熟悉VTK或它如何工作。

通常,有多种技术和方法可以改善多线程环境中的性能。问题很模糊,所以我只能提供一个笼统的答案。

  • 简易:如果读取次数很多而写入次数很少,请使用std::shared_mutex,因为它允许同时进行多个读取。
  • 中等:如果线程大多数时候都使用不同的数据:它们访问相同的数据数组但在不同的位置-那么您可以实现一个处理程序,以确保线程同时处理不同的数据而无需相交,如果线程要求处理当前正在处理的数据,则告诉它处理其他数据或等待。
  • Hard:有些方法可以利用各种内存指令通过std::atomic进行有效的并发。我不太熟悉它,它绝对不是很简单,但是您可以在互联网上找到有关它的教程。据我所知,这种方法的某些部分仍在研究和开发中,尚未开发最佳实践。

P.S。如果对同一数据有许多读/写...实现是否甚至意识到数据在多个线程上共享的事实?它甚至可以正确执行吗?您可能最终需要重写整个实现。


0
投票

我只是以为我发布了解决方案,因为这实际上是我的愚蠢。我意识到我的代码的一部分使用的是double* vtkDataSet::GetPoint(vtkIdType ptId)GetPoint()版本,该版本不是线程安全的。

对于多线程代码,应使用void vtkDataSet::GetPoint(vtkIdType id,double x[3])

© www.soinside.com 2019 - 2024. All rights reserved.