【发布时间】:2019-10-25 08:58:38
【问题描述】:
我已经开始研究多线程和点云处理。问题是我必须在现有实现上实现多线程,并且有太多的读写操作,所以使用互斥锁在性能方面没有给我足够的速度,因为来自grid 的读取操作太多。
最后,我修改了代码,让我可以拥有一个 vtkSmartPointer<vtkUnstructuredGrid>,它包含我的点云。线程必须做的唯一操作是使用GetPoint 方法访问点。但是,由于智能指针,即使您进行只读操作,它也不是线程安全的。
因此,我必须为每个线程复制我的主点云,如果我有太多线程和大云,最后会导致内存问题。
我试图将点云切割成块,但是当我有太多线程时它又变得太复杂了。我不能保证为每个线程处理优化的点数。我也对每个点进行邻居搜索,因此将点云切割成块变得更加复杂,因为我需要为每个块重叠才能获得正确的邻居搜索。
由于vtkUnstructuredGrid是内存优化的,我无法用一些 STL 容器替换它。如果您能向我推荐可用于线程安全读取的点云处理的数据结构,我会很高兴。或者,如果我可以使用任何其他解决方案。
提前致谢
【问题讨论】:
-
你能解释一下使用互斥锁没有给我足够的速度吗?在性能方面,还是在编码速度方面?
-
@p-a-o-l-o 在性能方面。因为在处理过程中,每个线程从主云读取了很多次(因为许多操作只给出点的 id,然后你必须读取位置),然后它们必须互相等待。例如,当我有 8 个线程时,我的处理速度只能提高一倍。
-
根据我的经验以及您链接的文档,
GetPoint(vtkIdType id, double x[3])是线程安全的。你能更详细地解释一下你到底在做什么使它不是线程安全的吗? -
@tomj 我实际上只是使用
GetPoint从内存中读取。即使它在文档中说线程安全,我也会得到未定义的行为。从 2014 年开始,他们在 vtk 论坛中提到它不是线程安全的,因为 Certainly I can't use vtkSmartPointer, because it accesses a singleton garbage collection mechanism。我不知道该怎么办。 -
实际上我用
GetPoint阅读,也用vtkSmartPointer<vtkOctreePointLocator>进行邻域搜索,但他们都不应该修改数据
标签: c++ multithreading performance vtk point-clouds