【发布时间】:2021-08-21 09:38:08
【问题描述】:
我想问一下如何并行化以下循环。
它目前正在崩溃。我尝试搜索,大多数答案表明问题在于我使用的是std::vector。我试图制作一个固定大小的std::vector。但是应用程序仍然崩溃。你能告诉我下面的循环有什么问题吗?
std::vector<int> a(pairsListFlags.size());
std::generate(a.begin(), a.end(), [n = 0]() mutable { return n++; });
std::for_each(std::execution::par_unseq, std::begin(a), std::end(a), [&](int i) {
int a = pairsList[i * 2];
int b = pairsList[i * 2 + 1];
if (getCollisionOpenNurbs(OBB[a], OBB[b])) { //Check OBB collision +4-6 ms
if (FaceFace(P[a], P[b], Pl[a], Pl[b])) {//Check polygon intersection +20 ms
pairsListFlags[i] = 1;
}
}
});
【问题讨论】:
-
您正在同时访问一个非原子变量 (
counter),这是未定义的行为。除此之外,我们需要知道在 lambda 中调用的所有函数中发生了什么。 -
getCollisionOpenNurbs 方法检查 2 个盒子是否碰撞。 FaceFace 方法使用剪裁器库进行二维折线相交。我应该如何知道这些函数对于并行循环是否不安全?我应该避免什么?
标签: c++ loops parallel-processing c++17