multithreading - 使用 OMP 循环展开

标签 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 说明中使用了但我无法理解它。

最佳答案

简单地使用平行的:

#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/

相关文章:

python - 是否可以从 PyQt5 的线程中获取数组?

c++ - 如何检查函数参数的类型?

c++ - 应用 SFINAE 检查是否为 T 定义了特征

c++ - 强制仅使用特定类型调用函数

c# - 在多线程应用程序中同步属性值的正确方法

c - 不同的线程使用不同的策略进行调度

java - 我想每隔1秒定期启动一个任务,无论先前的任务是否以

python - 在 python 中获取 Hikvision IP Camera 的框架

opencv - 为什么运行同一程序需要花费不同的时间?

python - 使用 opencv python 识别图像中的文本数据以读取 mm/dd、描述和金额