线程安全三角测量库

Thread-safe triangulation library

本文关键字:测量 三角 安全 线程      更新时间:2023-10-16

我正在编写一个需要快速闵可夫斯基和计算的C++软件。基于双重就足够了的实现。

我评估了一些几何库,例如

  • 中加尔
  • 莱达
  • boost::geometry(没有闵可夫斯基和实现,但有一个教程解释了如何实现它)

但我最终使用了另一个第三方库,与以前的库相比,它非常快,并且使用 FIST 库进行三角测量。

我的代码或多或少地按以下方式工作:

  • 我读了我的多边形
  • 我计算我需要的闵可夫斯基和
  • n 次
    • 我决定在以下计算中使用哪些多边形
    • 我根据闵可夫斯基的总和做一些事情
    • 我给结果一个值
  • 我把具有最佳值的结果作为最终结果

由于循环中的计算在轮次与轮次无关,因此我并行化了循环,一切正常。

然后我决定在每个平行轮中移动闵可夫斯基和计算:

  • 我读了我的多边形
  • 对于 number_of_threads(=n) 次
    • 我决定在以下计算中使用哪些多边形
    • 我计算了这一轮我需要的闵可夫斯基总和
    • 我根据闵可夫斯基的总和做一些事情
    • 我给结果一个值
  • 我把具有最佳值的结果作为最终结果

但是第三方库不再工作了。

我收到number_of_threads - 1错误消息,说

断言失败。

导致断言失败的文件因运行和线程而异,但它们都是与 FIST 标头同名的 c 文件(虽然我有第三方库的源代码,但我只有一个 .lib 和 FIST 库的标头)

如前所述,我尝试在并行化代码之外计算我需要的所有闵可夫斯基和,并使用其中的结果。这没关系。所以我几乎可以肯定问题来自FIST。

我有两个问题:

  • 您知道 FIST 库是否线程安全吗?

  • 如果没有,您能否建议我一个线程安全(C 或更好的)C++三角测量库来取代 FIST(可能具有可比的性能)?

编辑:

实际上,我不知道"线程安全"是否正是我想要的:我只需要一个能够同时计算许多独立三角测量的tringulation库。

我认为如果库没有全局变量并且它有一个没有static变量的类

class triangulation
{
    // no static variables
    void execute_triangulation();
}

这可能就足够了。所以我可以使用该类的不同实例并并行运行它们的方法。

您可能可以使用 CGAL 的 2D 三角测量包来替换 FIST,然后将其用作执行 Minskowski 求和的第三方库的输入。CGAL三角测量非常快速且可靠。您可以使用约束的 Delaunay 三角测量对多边形和复杂形状进行三角测量。

顺便问一下,您使用哪个闵可夫斯基图书馆?

一种可能且可立即测试的解决方案是在调用闵可夫斯基计算的代码周围放置互斥锁。如果这听起来很有趣并且您不知道该怎么做,请添加一条评论,详细说明您正在使用的平台,我或其他人将概述如何做到这一点。

至少,这将显示您是否已正确识别问题。如果计算只占您总带宽的一小部分,那么它可能是一个很好的解决方案 - 否则只是路上的一步。

这在很大程度上取决于您的意思:

由于我的代码是可并行化的,因此我引入了多线程

您需要更具体才能获得帮助。"您引入了多线程"是什么意思?例如,您提到的库都没有内置闵可夫斯基和(或其他任何东西)的并行计算 - 您需要自己并行化它。

关于闵可夫斯基和,

可以使用map-reduce方法:将输入数据集分成更小的部分,并行计算每个部分的闵可夫斯基和(map),并在中间结果来自独立工作者时联合起来(reduce)。对此的要求是基本的线程安全保证(例如 CGAL 为您提供),对计算参数具有只读访问权限。