我正在编写一个需要快速Minkowski sum计算的C ++软件。基于double的实现就足够了。
我评估了一些几何库,例如
但我最终使用了另一个第三方库,与之前的库相比速度非常快,并使用FIST库进行三角测量。
我的代码或多或少地以下列方式工作:
由于循环内的计算独立于循环,我将循环并行化,一切正常。
然后我决定在每个平行回合中移动Minkowski和计算:
但第三方图书馆不再工作。
我收到number_of_threads - 1
错误消息
断言失败。
导致断言失败的文件从运行变为运行以及从线程变为线程,但它们都是与FIST标头同名的c文件(虽然我有第三方库的源代码,但我有只有.lib和FIST库的标题)
如前所述,我尝试在并行化代码之外计算我需要的所有Minkowski总和并使用其中的结果。这没关系。所以我几乎可以肯定问题来自FIST。
我有两个问题:
您知道FIST库是否是线程安全的吗?
如果没有,你能否建议我一个线程安全(C或更好)的C ++三角测量库来取代FIST(可能具有相似的性能)?
修改
实际上,我不知道“线程安全”是否正是我想要的:我只需要一个能够同时计算许多独立三角测量的推理库。
我认为如果库没有全局变量,并且它有一个没有static
个变量的类
class triangulation
{
// no static variables
void execute_triangulation();
}
这可能就足够了。 所以我可以使用该类的不同实例并与它们的方法并行运行。
答案 0 :(得分:3)
您可以使用2D triangulation package of CGAL替换FIST,然后将其用作执行Minskowski总和的第三方库的输入。 CGAL三角测量非常快速且可靠。您可以使用约束Delaunay三角剖分对多边形和复杂形状进行三角测量。
顺便问一下,你使用哪个Minkowsky图书馆?
答案 1 :(得分:2)
一种可能且可立即测试的解决方案是在调用Minkowski计算的代码周围放置一个互斥锁。如果这听起来很有趣并且您不知道如何操作,请添加详细说明您正在使用的平台的评论,我或其他人将概述如何操作。
至少,这将告诉您是否已正确识别问题。如果计算只占总带宽的一小部分,那么它可能会成为一个很好的解决方案 - 否则只是迈出了一步。
答案 2 :(得分:1)
这在很大程度上取决于你的意思:
由于我的代码是可并行化的,我引入了多线程
您需要更加具体才能获得帮助。什么意思“你引入了多线程”?例如,你提到的库都没有内置Minkowski总和(或其他任何东西)的并行计算 - 你需要自己并行化它。
关于Minkowski总和,可以使用map-reduce方法:将输入数据集拆分为更小的部分,并行计算Minkowski总和(map)并将中间结果与独立进行结合工人(减少)。对此的要求是基本的线程安全保证(例如CGAL给你),只读访问计算参数。