Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 使用OMP展开循环_Multithreading_Opencv_C++11_Openmp - Fatal编程技术网

Multithreading 使用OMP展开循环

Multithreading 使用OMP展开循环,multithreading,opencv,c++11,openmp,Multithreading,Opencv,C++11,Openmp,我已经应用了中提到的循环注册 代码: 现在我想在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

我已经应用了中提到的循环注册

代码:

现在我想在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]);
}
}
但是它不起作用,我犯了一个错误。有人能告诉我怎么做吗


我确实得到了。在这种情况下,使用了SSE指令,但我无法理解它。

只需将并行程序用于:

#pragma omp parallel for
for(i = 0; i < contours.size(); i++)
{
    cv::convexHull(contours[i], convexHulls[i]);
}
这表示您想要做什么,并允许编译器和运行时并行运行循环。例如,这将适用于任何线程配置或大小,而您的建议仅适用于三个线程

除非你有证据或很强的知识证明这是有益的,否则不要帮助编译器。如果你曾经这样做过,请确认它确实是有益的。如果简单版本在您的情况下表现不好,您应该首先给出编译器提示,例如调度策略,而不是手动实现自己的


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

不确定为什么要使用节进行并行化。目前尚不清楚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]);
}

我想你应该先解释一下为什么你认为你需要展开?cv::ConvxHull做什么?展开的主要原因是受延迟限制的依赖链。这适用于单个核心。如果你在这种情况下展开,你不必再做任何事情,因为展开会打破链条,而你的无序处理器会处理其余的部分。最重要的是,你会遇到什么错误?你应该考虑引用的文章中最重要的句子:不必自行解开循环,因为一个好的C++编译器会为你做这件事,如果你没有理由,它是早熟的优化。轮廓是一个数组,CV::VuxEngult是一个函数,它需要一个轮廓并应用凸包。我使用循环注册有两个原因:-1。因此,检查条件的次数少于2次。通过使用多个线程,我希望并行执行conexhull函数,以使程序更优化。除了依赖链之外,还有另一种展开的情况。您可以通过展开来分摊循环递增/递减迭代器、测试和跳转的成本。这通常比打破依赖链的效果要小,但有时需要最大化吞吐量。因为它使用了更多的代码,所以它可能会导致其他问题。所以不一定更好。但无论如何,这些都是微优化,大多数人可能不应该担心。
#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]);
}