gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:15:39 25 4
gpt4 key购买 nike

基本上我有一个程序需要检查几张单独的图片我通过以下方式做到这一点:

#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 声明的最佳方法是什么。我发布的那个是我认为对这种情况最好的表现。

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

最佳答案

只是添加一个简单的

#pragma omp parallel for

是解决您的问题的良好起点。不要为静态写入它应该使用多少线程而烦恼。运行时通常会做正确的事情。

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

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

关于c++ - 在具有非常大的嵌套循环的小循环上有效地使用 openmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42733144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com