C++ 嵌套循环设计策略

C++ 嵌套循环设计策略,c++,parallel-processing,openmp,nested-loops,C++,Parallel Processing,Openmp,Nested Loops,假设您已经设计了一个带有嵌套for循环的顺序程序,并且希望将其转换为与OpenMP并行的程序,并在各个部分中对其进行调试。。。最好先处理最外层的循环,然后按自己的方式处理,还是从最内层的循环开始?我知道collapse函数,但并不是所有嵌套循环都是可折叠的。在最里面的循环中绝对不可折叠。这是因为启动线程通常比较昂贵 另一方面,如果最里面的循环比启动一个线程需要更多的资源来执行,那么这并没有什么区别。但除此之外,最外层的环始终是最佳选择 当然,这是一个非常宽泛的回答,与你的问题非常宽泛。对于每个不

假设您已经设计了一个带有嵌套for循环的顺序程序,并且希望将其转换为与OpenMP并行的程序,并在各个部分中对其进行调试。。。最好先处理最外层的循环,然后按自己的方式处理,还是从最内层的循环开始?我知道collapse函数,但并不是所有嵌套循环都是可折叠的。

在最里面的循环中绝对不可折叠。这是因为启动线程通常比较昂贵

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

当然,这是一个非常宽泛的回答,与你的问题非常宽泛。对于每个不同的特殊情况,总是有不同的答案


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

这是一个相当广泛的问题。有许多因素会影响推荐。你能不能通过提供一些关于一般嵌套循环的细节来缩小它的范围,最好是以实际代码的形式。顺便说一句:我会说尽可能的外部,尽可能的内部。但我不认为这是一个有用的答案。一些不能用“<代码>塌陷< /代码>”子句折叠的嵌套循环仍然可用手折叠,例如三角形循环。学习如何手动折叠循环很有用。你真的应该在代码中提供一些示例。这是一个非常深思熟虑和详细的答案(是的,这是一个广泛的问题。在做这篇文章的时候,我想到了一个二维矩阵的遍历/解析问题,但故意忽略了这一点,因为我对一般的机制和问题解决方法感到好奇,而不是对我的具体问题的答案,如果我把它贴出来,我会不可避免地得到答案)谢谢。矩阵应该存储为1维向量。这是最有效的方法。考虑学习如何使用高性能库,如OpenBLAS(或这些包装,如犰狳)。。你不应该重新发明轮子。矩阵运算是一个巨大的领域。我现在正在上课,通常我们应该只在某些项目中使用某些库。2D向量适合这个任务(以及我们被指示使用的内容)家庭作业世界和现实世界大不相同。祝你好运!OpenMP实现实际上创建了一个线程池,这样线程就不会在并行区域之间创建和销毁。这意味着在内部循环中使用并行的开销很小(但不一定不重要)。