【问题标题】:OpenMP v.2.0 or Boost thread 1.59OpenMP v.2.0 或 Boost 线程 1.59
【发布时间】:2016-10-21 13:13:28
【问题描述】:

我想知道如何以安全的方式并行化下面的 for 循环。我找到了一些可能的解决方案,例如 this 。但是我只能使用 OpenMP 2.0 版和 Boost 1.59 版。

算法解释:

它遍历边界框内的所有三角形,然后在 _considerTriangle 函数中检查相交的可能性(具有唯一三角形)。最后在 _considerTriangle 中,如果一个三角形相交,它会将三角形插入一个集合容器 intersectedTri

//Iterating through every triangle
std::set<Triangle> intersectedTri;
for(IntersectedTrianglesIterator it=tree.Begin_IteratorByBoundingBox(bbox_min,bbox_max);it!=tree.End_IteratorByBoundingBox(bbox_min,bbox_max);++it)
            _ConsiderTriangle(it->GetTriangle());

我想知道如何安全地将其平行化。

【问题讨论】:

  • 您必须提供有关您的代码的更多信息。完全不清楚底层数据结构是什么(tree),某些操作有多昂贵(IntersectedTrianglesIterator::operator++ vs _ConsiderTriangleGetTriangel),在迭代期间修改了什么状态,IntersectedTrianglesIterator 是否是随机的访问迭代器,....请提供minimal reproducible example
  • 顺便说一句:OpenMP 2.0 已有 14 年 的历史。你真的没有更新的版本吗?
  • 我用的是 Visual Studio,你现在连 VS2015 都不支持任何更新版本的 openMP。

标签: c++ openmp boost-thread boost-mutex


【解决方案1】:

您可以使用任何方法,只要将插入同步到 intersectedTri 中即可。

// globals
boost::mutex mut;

// inside func
boost::mutex::scoped_lock lock(mut);
intersectedTri.insert(tri);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多