5

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

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

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

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

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

由于循环内的计算是独立于每一轮的,我并行化了循环并且一切正常。

然后我决定在每个并行轮中移动 Minkowski 和计算:

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

但是第三方库不再起作用。

我收到number_of_threads - 1错误消息说

断言失败。

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

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

我有两个问题:

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

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

编辑:

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

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

class triangulation
{
    // no static variables

    void execute_triangulation();
}

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

4

3 回答 3

3

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

顺便问一下,您使用哪个 Minkowsky 库?

于 2013-01-24T10:53:32.397 回答
2

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

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

于 2013-01-28T15:47:06.507 回答
1

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

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

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

关于 Minkowski 和,可以使用 map-reduce 方法:将输入数据集拆分为更小的部分,并行计算每个部分的 Minkowski 和(map),并在中间结果来自独立工作者时合并它们(reduce )。对此的要求是一个基本的线程安全保证(例如 CGAL 给你的)对计算参数的只读访问。

于 2013-01-26T09:25:04.697 回答