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