基本上,我有一个程序,需要查看几张单独的图片,我是这样做的:
#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声明的最佳方法是什么。我发布的那篇文章是我认为在这个场景中最好的表现。
记住,这是伪代码。程序的目标并不重要,高效地并行化这些循环就是目标。
发布于 2017-03-13 19:05:27
只是添加了一个简单的
#pragma omp parallel for是解决问题的好起点。不要费心静态地写它应该使用多少线程。运行时通常会做正确的事情。
然而,一般不可能说什么是最有效的。从有限的一般例子来看,有许多性能因素是无法判断的。您的代码可能是内存绑定的,并且只从桌面CPU上的并行化中获益很小。您可能存在负载不平衡,这意味着您需要将工作分割成更多的块并动态地处理它们。这可以通过并行中间循环或使用嵌套并行来实现。中间循环并行化是否运行良好取决于内环所做的工作量(以及有用工作/开销的比率)。内存布局也严重影响并行化的效率。或者您甚至在内部循环中有数据依赖关系,以防止并行化.
唯一能给出的一般性建议是总是度量,永远不要猜测。学习使用强大的并行性能分析工具,并将其扩展到您的工作流中。
https://stackoverflow.com/questions/42733144
复制相似问题