gpt4 book ai didi

multithreading - 使用 OMP 循环展开

转载 作者:太空宇宙 更新时间:2023-11-03 22:49:08 25 4
gpt4 key购买 nike

我已经按照 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com