【问题标题】:OpenMP, nested loops design strategyOpenMP,嵌套循环设计策略
【发布时间】:2017-02-08 18:52:03
【问题描述】:

假设您已经设计了一个带有嵌套 for 循环的顺序程序,并且希望将其转换为与 OpenMP 并行,并分段处理它以在进行时进行调试...首先处理最外层循环会更好吗并按自己的方式工作,还是从最里面的循环开始?我知道折叠功能,但并非所有嵌套循环都是可折叠的。

【问题讨论】:

  • 这是一个相当广泛的问题。有许多因素会影响推荐。您能否通过在通用嵌套循环之外提供一些细节来缩小范围,最好以实际代码的形式。
  • 顺便说一句:我会说尽可能外部,尽可能内部。但我不认为这是一个有用的答案。
  • 一些不能用collapse 子句折叠的嵌套循环仍然可以手动折叠,例如三角环。无论如何,学习如何手动折叠循环很有用。
  • 您确实应该在代码中提供一些示例。

标签: c++ parallel-processing openmp nested-loops


【解决方案1】:

绝对绝对不是在最内层循环中。这是因为启动线程通常很昂贵。

另一方面,如果执行最里面的循环比启动一个线程需要更多的资源,那么它并没有什么不同。但除此之外,最外层循环始终是最佳选择。

当然,对于您非常广泛的问题,这是一个非常广泛的答案。每种不同的特殊情况总是有不同的答案。

另一方面,如果您遇到如此复杂的问题,我建议您使用低级std::thread 并手动控制您的线程。这需要更多的工作,但你有更多的控制和最好的结果。那么你就可以使用线程池,并拥有最高效的解决方案。

【讨论】:

  • 这是一个非常周到和详细的答案(是的,一个广泛的问题。在制作它时,我想到了一个遍历/解析二维矩阵的问题,但故意留下了这个一些信息,因为我对一般机制和解决问题的方法感到好奇,而不是对我的具体问题的答案,如果我发布它,我将不可避免地得到)。谢谢。
  • 矩阵应该存储为一维向量。这是最有效的方法。考虑学习如何使用高性能库,例如 OpenBLAS(或这些库的包装器,例如 Armadillo)。你不应该重新发明轮子。矩阵运算是一个巨大的领域。
  • 我现在正在上课,通常我们应该只将某些库用于某些项目。 2D 向量非常适合这项任务(以及我们被指示使用的内容)
  • 家庭作业世界和现实世界有很大不同。祝你好运!
  • 线程池实际上是使用 OpenMP 实现创建的,因此不会在并行区域之间创建和销毁线程。这意味着在内部循环中使用并行的开销很小(但不一定是微不足道的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2016-07-27
  • 1970-01-01
  • 2012-11-14
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多