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

时间:2017-03-11 08:38:35

标签: c++ performance openmp nested-loops

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

#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声明的最佳方法是什么。我发布的那个是我认为这个场景的最佳性能。

请记住这是伪代码。该计划的目标并不重要,有效地并行化这些循环是目标。

1 个答案:

答案 0 :(得分:1)

只需添加一个简单的

#pragma omp parallel for

是您问题的良好起点。不要静静地写下它应该使用多少个线程。运行时通常会做正确的事情。

但是,通常不能说什么是最有效的。从您有限的一般示例中无法分辨出许多性能因素。您的代码可能受内存限制,并且只能从桌面CPU上的并行化中受益很少。您可能有负载不平衡,这意味着您需要将工作分成更多块并动态处理它们。这可以通过并行化中间循环或使用嵌套并行性来完成。中间循环并行化是否运行良好取决于内循环完成的工作量(因此有用工作/开销的比率)。内存布局也严重影响并行化的效率。或者你甚至可能在内部循环中有数据依赖性,阻止了那里的并行化......

唯一可以给出的一般建议是始终衡量,永不猜测。学习使用功能强大的并行性能分析工具,并将其融入您的工作流程中。