c++ - vtkUnstructuredGrid->GetPoint() 的线程安全只读替代方案

标签 c++ multithreading performance vtk point-clouds

我已经开始研究多线程和点云处理。问题是我必须在现有的实现上实现多线程,并且有太多的读写操作,所以使用互斥体不能给我足够的性能加速,因为来自 grid 的读取操作太多了。 .

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

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

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

vtkUnstructuredGrid是内存优化我不能用一些STL容器代替它。如果您能向我推荐可用于线程安全读取的点云处理的数据结构,我会很高兴。或者如果有任何其他解决方案我可以使用。

提前致谢

最佳答案

我不熟悉 VTK 或它的工作原理。

一般来说,在多线程环境下,有多种技术和方法可以提高性能。这个问题很模糊,所以我只能提供一个笼统的模糊答案。

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

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

关于c++ - vtkUnstructuredGrid->GetPoint() 的线程安全只读替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58555312/

相关文章:

c++ - 无法将<string>从 ‘const char []’转换为<class name>

java jprogressbar 在繁重操作期间挂起

c++ - 测量 ARM Cortex-A15 的缓存访问时间/周期

performance - 在 MATLAB 中将函数应用于给定大小的每个子矩阵的有效方法

c++ - 对C++多线程真的很困惑

c++ - exFAT校验和的计算

c++ - 如何访问尚未开始运行的挂起线程的堆栈?

java - Groovy - 对象重用。

python - 如何在 python/numpy 中自动化 BLAS 的环境变量相关基准测试?

c - 优化以及为什么 openmp 比顺序方式慢得多?