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