基本上我有一个程序需要查看几张单独的图片 我是这样做的:
#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个核心(每个图片1个核心),以便每个核心/线程处理特定的图片。那样核心0正在处理图片0,核心1处理图片1,依此类推。正在测试的机器也只有4个核心。在这种情况下使用openmp声明的最佳方法是什么。我发布的那个是我认为这个场景的最佳性能。
请记住这是伪代码。该计划的目标并不重要,有效地并行化这些循环是目标。
答案 0 :(得分:1)
只需添加一个简单的
#pragma omp parallel for
是您问题的良好起点。不要静静地写下它应该使用多少个线程。运行时通常会做正确的事情。
但是,通常不能说什么是最有效的。从您有限的一般示例中无法分辨出许多性能因素。您的代码可能受内存限制,并且只能从桌面CPU上的并行化中受益很少。您可能有负载不平衡,这意味着您需要将工作分成更多块并动态处理它们。这可以通过并行化中间循环或使用嵌套并行性来完成。中间循环并行化是否运行良好取决于内循环完成的工作量(因此有用工作/开销的比率)。内存布局也严重影响并行化的效率。或者你甚至可能在内部循环中有数据依赖性,阻止了那里的并行化......
唯一可以给出的一般建议是始终衡量,永不猜测。学习使用功能强大的并行性能分析工具,并将其融入您的工作流程中。