我已经按照 this post 中的说明应用了循环注册
代码:
for(i = 0; i< ROUND_DOWN(contours.size(),3);i+=3)
{
cv::convexHull(contours[i], convexHulls[i]);
cv::convexHull(contours[i+1], convexHulls[i+1]);
cv::convexHull(contours[i+2], convexHulls[i+2]);
}
现在我想在 for 循环中使用多个线程 (3),这样每个线程在循环中只执行一个语句,类似于使用 openmp 的部分。
怎么做?
我试过这个:
for(i = 0; i< ROUND_DOWN(contours.size(),3);i+=3)
{
#pragma omp parallel sections
{
#pragma omp section
cv::convexHull(contours[i], convexHulls[i]);
#pragma omp section
cv::convexHull(contours[i+1], convexHulls[i+1]);
#pragma omp section
cv::convexHull(contours[i+2], convexHulls[i+2]);
}
}
但它没有用,我得到了一个错误,有人可以告诉我如何正确地执行此操作吗?
我确实得到了 another post .在此 SSE 说明中使用了但我无法理解它。
最佳答案
简单地使用平行的:
#pragma omp parallel for
for(i = 0; i < contours.size(); i++)
{
cv::convexHull(contours[i], convexHulls[i]);
}
这表达了你想要做什么,并允许编译器和运行时并行运行循环。例如,这适用于任何线程配置或大小,而您的建议仅适用于三个线程。
除非您有证据或充分了解它是有益的,否则不要帮助编译器。如果你曾经这样做过,请确认它确实有益。如果简单版本在您的情况下表现不佳,您应该首先给编译器提示(例如调度策略),而不是手动实现自己的提示。
请注意,如果循环迭代之间存在某些数据依赖性(与您的部分代码相同),这只会正常工作。您的代码看起来并非如此,但某种评估需要适当的完整代码示例。
关于multithreading - 使用 OMP 循环展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42361772/