循环展开OMP

时间:2017-02-21 08:06:30

标签: multithreading opencv c++11 openmp

我已应用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中使用了指令,但我无法理解它。

2 个答案:

答案 0 :(得分:1)

只需使用并行:

#pragma omp parallel for
for(i = 0; i < contours.size(); i++)
{
    cv::convexHull(contours[i], convexHulls[i]);
}

这表达了您想要做的事情,并允许编译器和运行时并行运行循环。例如,这将适用于任何线程配置或大小,而您的建议只适用于三个线程。

除非您有证据或强有力地知道它是有益的,否则不要帮助编译器。如果您这样做,请确认它实际上是有益的。如果简单版本在您的情况下表现不佳,您应首先给出编译器提示(例如调度策略),而不是手动实现自己的。

请注意,如果循环迭代之间存在某些数据依赖关系(与您的部分代码相同),这只能正常工作。您的代码看起来并非如此,但某个评估需要一个正确的完整代码示例。

答案 1 :(得分:0)

不确定为什么要使用sections进行并行化。目前尚不清楚你在cv::convexHull函数中有哪种依赖关系,但如果没有副作用(我认为)你应该能够简单地使用工作共享进行并行化:

#pragma omp parallel for private(e)
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]);
}