嵌套openmp循环
我有以下风格的一段代码:
for (set=0; set < n; set++) //For1
{
#pragma omp parallel for num_threads(x)
for (i=0; i < m; i++) //For2: this loop can be executed in parallel
{
commands...
}
for (j=0; j < m; j++) //For3: this loop depends on the output of the For2 and also should be executed in a sequential way
{
commands...
}
}
正如你注意到的,我有n个独立的集合(外循环,即For1)。 每个Set由一个并行循环(For2)和一个应该在For2之后执行的顺序部分(For3)组成。
我已经使用“#pragma omp parallel for num_threads(x)”来让For2平行。
现在我想让外部循环(For1)平行。 换句话说,我想要并行运行每个Set。
我真的很感激你能否让我知道在openmp中可能如何。
一种方法可能是创建与每个Set相对应的n个线程。 这是对的吗? 但我想知道是否有另一种方式完全使用openmp功能?
提前致谢。
你可以简单地通过平行外部循环
#pragma omp parallel for num_threads(x) private(i,j)
for (set=0; set < n; set++) //For1
{
for (i=0; i < m; i++) //For2: this loop can be executed in parallel
{
commands...
}
for (j=0; j < m; j++) //For3: this loop depends on the output of the For2 and also should be executed in a sequential way
{
commands...
}
}
你可以尝试融合第一个和第二个循环(见下文)。 我不知道这是否会让它变得更好,但值得一试。
#pragma omp parallel num_threads(x) private(set, i)
{
#pragma omp for schedule(static)
for (k = 0; k < n*m; k++) //fused For1 and For2
{
set = k/m;
i = k%m;
//commands...
}
#pragma omp for schedule(static)
for (set = 0; set < n; set++)
{
for (i = 0; i < m; i++) //For3 - j is not necessary so reuse i
{
//commands...
}
}
}
根据您拥有的套件数量,简单地并行化外部循环可能证明是您的最佳选择。 如果您的计算机上的内核数量超过了此数量,那么它可能比并行内部循环更快,因为在这种情况下,线程创建开销要小得多。
假设您的操作是cpu绑定的,并且外部循环并行化,您将完全使用计算机上的所有内核。 如果已经使用了所有资源,则进一步尝试并行化内部循环的速度将不会更快。
如果您的套件数量少于可用的内核数量,则需要对内部循环进行并行处理,并且您很可能已经占用了所有可用的计算能力。
如果你真的想并行化两个循环,那么你应该考虑MPI,并在几台计算机上进行混合并行处理; 外部循环在多台计算机上并行执行,内部循环在一台计算机的所有内核上并行执行。
链接地址: http://www.djcxy.com/p/79233.html上一篇: Nested openmp loop