Parallel processing 嵌套并行和折叠循环之间有区别吗?

Parallel processing 嵌套并行和折叠循环之间有区别吗?,parallel-processing,openmp,Parallel Processing,Openmp,我知道启用嵌套并行将允许嵌套omp parallel for循环也被并行化。但是我在嵌套for循环(for的内部)中使用了collapse(2) 有区别吗?为什么?假设最佳情况:循环索引和其他相等的事物之间没有依赖关系。是的,存在巨大差异-使用折叠(而不是折叠)。不要使用嵌套并行 嵌套并行意味着有独立的线程团队在不同级别的工作共享上工作。您可能会遇到各种各样的问题,要么是CPU内核被过多的线程订阅,要么是由于某些线程属于错误的团队而没有使用CPU内核,而这些团队目前没有工作。嵌套并行性很难获得良

我知道启用嵌套并行将允许嵌套omp parallel for循环也被并行化。但是我在嵌套for循环(for的内部)中使用了collapse(2)


有区别吗?为什么?假设最佳情况:循环索引和其他相等的事物之间没有依赖关系。

是的,存在巨大差异-使用
折叠
(而不是
折叠
)。不要使用嵌套并行

嵌套并行意味着有独立的线程团队在不同级别的工作共享上工作。您可能会遇到各种各样的问题,要么是CPU内核被过多的线程订阅,要么是由于某些线程属于错误的团队而没有使用CPU内核,而这些团队目前没有工作。嵌套并行性很难获得良好的性能。这就是为什么您通常需要显式地启用它


另一方面,折叠循环意味着不同的循环在工作共享级别上是联合的。这允许一组线程(通常具有与可用CPU内核相同数量的线程)有效地处理循环的不同迭代。

“…Microsoft的软件工程师正在处理Skype for Business…”?如何绘制一个MCVE示例代码并发布到目前为止您尝试过的内容?这是一种提问的文化,可能会吸引社区成员前来帮助。您可能想更新您的帖子,并展示一些已经详细阐述的实验和收集的bechmarks,这些实验和bechmarks说明您已经花费了大量精力来分析和进一步研究MCVE及其可能的解决方案。我没有遇到问题,需要代码方面的帮助。我只是提出了一个关于OpenMP如何实现嵌套并行性的问题,以便于我自己理解,因为我正在学习一门课程,我们正在使用OpenMP。我的教授提到使用omp_set_nested,我没有这样做,因为我知道这可能会导致线程膨胀,从而影响性能。一个没有循环索引依赖的for-inside-A-for是一个非常简单的解释,事实上,它不能得到比这更简单的解释。如果一个迭代遇到另一个并行部分并启动另几个线程,那么下一个这样做的迭代也将尝试执行。从我的阅读中,我明白了折叠循环会更有效。然而,我的教授提到我们应该使用omp_set_nested来完成作业,所以我担心是否存在实际差异。最干净的步骤是设置一个独立的线程计数监视器,并记录进程生成的子线程数量的变化,不是吗?循环展开是另一种技术上实现的对策(代码分析允许在编译/优化阶段这样做)。因此,收集证据记录可能非常有趣。如果你的教授没有将你的工作引入定量支持的基准测试,那么现在是更换教授的最佳时机。简单键入的语法sugar#pragma omp*修饰代码必须理解v/s成本。如果没有StackOverflow审查,将有关于设置成本的完整章节进行讨论。>>(仍然不确定,为什么Martijn Pieters先生删除了大部分解释性文本,c'est la vie)。无论如何,并行化的成本是主要关注点(阻塞显然是资源映射不佳或不可知的标志)。因此,全面的基准测试策略集中于omp并行的每个阶段&各构建者的实际[时域]成本。成本意识阿姆达尔法律规则。谢谢你的回答!这实际上是一个输入错误,我是说omp崩溃。我这样做是因为我了解嵌套并行的开销,以及由于等待其他块从内部循环完成,外部循环指向的某些块可能无法调度。然而,我正在做一个家庭作业,教授提到我们应该使用omp_set_嵌套。我开始担心不使用塌陷(2)会对我的表现产生负面影响,希望能更好地掌握。祝你的教授好运:-)。理想情况下,您可以同时实现这两种方法,并通过实际测量来支持您的理论知识,以显示其中一种方法优于另一种方法。