首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在小循环和非常大的嵌套循环上有效地使用openmp

在小循环和非常大的嵌套循环上有效地使用openmp
EN

Stack Overflow用户
提问于 2017-03-11 08:38:35
回答 1查看 677关注 0票数 0

基本上,我有一个程序,需要查看几张单独的图片,我是这样做的:

代码语言:javascript
复制
#pragma omp paralell num_threads(4)
#pragma omp paralell for
for(picture = 0; picture < 4; picture++){
    for(int row = 0; row < 1000; row++){
        for(int col = 0; col < 1000; col++){

            //do stuff with pixel[picture][row][col]

        }
    }
}

我只想把工作分成4个核心(每个图片一个核心),这样每个核心/线程都在处理一个特定的图片。这样,核心0就可以处理图片0,核心1在图片1上,等等。它正在测试的机器也只有4个核心。在此场景中使用openmp声明的最佳方法是什么。我发布的那篇文章是我认为在这个场景中最好的表现。

记住,这是伪代码。程序的目标并不重要,高效地并行化这些循环就是目标。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-13 19:05:27

只是添加了一个简单的

代码语言:javascript
复制
#pragma omp parallel for

是解决问题的好起点。不要费心静态地写它应该使用多少线程。运行时通常会做正确的事情。

然而,一般不可能说什么是最有效的。从有限的一般例子来看,有许多性能因素是无法判断的。您的代码可能是内存绑定的,并且只从桌面CPU上的并行化中获益很小。您可能存在负载不平衡,这意味着您需要将工作分割成更多的块并动态地处理它们。这可以通过并行中间循环或使用嵌套并行来实现。中间循环并行化是否运行良好取决于内环所做的工作量(以及有用工作/开销的比率)。内存布局也严重影响并行化的效率。或者您甚至在内部循环中有数据依赖关系,以防止并行化.

唯一能给出的一般性建议是总是度量,永远不要猜测。学习使用强大的并行性能分析工具,并将其扩展到您的工作流中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42733144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档