gpt4 book ai didi

c++ - OpenMP 递归任务

转载 作者:可可西里 更新时间:2023-11-01 18:39:07 25 4
gpt4 key购买 nike

考虑以下计算斐波那契数列的程序。
它使用 OpenMP 任务进行并行化。

#include <iostream> 
#include <omp.h>

using namespace std;

int fib(int n)
{
if(n == 0 || n == 1)
return n;

int res, a, b;
#pragma omp parallel
{
#pragma omp single
{
#pragma omp task shared(a)
a = fib(n-1);
#pragma omp task shared(b)
b = fib(n-2);
#pragma omp taskwait
res = a+b;
}

}
return res;
}

int main()
{
cout << fib(40);
}

我使用 gcc 4.8.2 版和 Fedora 20。
用 g++ -fopenmp name_of_program.cpp -Wall 编译上述程序时并运行它,我在查看 htop 时看到只有两个(有时是 3 个)线程在运行。我运行这个程序的机器有 8 个逻辑 CPU。我的问题是,我需要做什么才能将工作卸载到 8 个线程上。我试过 export OMP_NESTED=TRUE,但这会导致在运行时出现以下错误程序:
libgomp:线程创建失败:资源暂时不可用
我的程序的重点不是有效地计算斐波那契数列,而是在 OpenMP 中使用任务或类似的东西。

最佳答案

在 OMP_NESTED=FALSE 的情况下,一组线程被分配到顶层并行区域,并且在每个嵌套级别没有额外的线程,因此最多两个线程将做有用的工作。

如果 OMP_NESTED=TRUE,则在每个级别分配一组线程。在您的系统上有 8 个逻辑 CPU,因此团队大小可能为 8。该团队包括一个来自区域外的线程,因此仅启动 7 个新线程。 fib(n) 的递归树有大约 fib(n) 个节点。 (fib 的一个很好的自引用属性!)因此代码可能会创建 7*fib(n) 个线程,这会很快耗尽资源。

解决方法是在整个任务树周围使用一个平行区域。将 omp parallelomp single 逻辑移至 fib 之外的 main。这样一个单线程团队将处理整个任务树。

一般要点是区分潜在的并行性和实际的并行性。任务指令指定潜在的并行性,在执行期间可能会或可能不会实际使用。 omp parallel(出于所有实际目的)指定实际的并行性。通常您希望实际的并行度与可用的硬件相匹配,以免使机器陷入困境,但潜在的并行度要大得多,以便运行时可以平衡负载。

关于c++ - OpenMP 递归任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22621157/

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