线程安全的三角测量库

时间:2013-01-24 08:49:13

标签: c++ thread-safety triangulation

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

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

但我最终使用了另一个第三方库,与之前的库相比速度非常快,并使用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();
}

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

3 个答案:

答案 0 :(得分:3)

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

顺便问一下,你使用哪个Minkowsky图书馆?

答案 1 :(得分:2)

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

至少,这将告诉您是否已正确识别问题。如果计算只占总带宽的一小部分,那么它可能会成为一个很好的解决方案 - 否则只是迈出了一步。

答案 2 :(得分:1)

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

  

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

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

关于Minkowski总和,可以使用map-reduce方法:将输入数据集拆分为更小的部分,并行计算Minkowski总和(map)并将中间结果与独立进行结合工人(减少)。对此的要求是基本的线程安全保证(例如CGAL给你),只读访问计算参数。