【发布时间】:2018-05-03 09:55:24
【问题描述】:
我想知道以下代码的行为是什么。这是一个使用 OpenMP 任务并行化的简单阶乘程序。 当我运行这个程序时,我得到 0 作为输出。我知道缺少 shared(b) 子句。这是我从主要方面调用事实的方式。
#pragma omp parallel
{
#pragma omp single nowait
{
fact_result = fact(4);
}
}
这是实际的阶乘函数。
int fact(int n) {
if(n == 0)
return 1;
int b = 0;
#pragma omp task
b = fact(n - 1);
#pragma omp taskwait
return n * b;
}
我不明白为什么没有 shared(b) 的结果不正确,为什么 shared(b) 的结果正确。我正在寻找这样的运行时图:
我知道一旦第 1 步完成,线程就会开始处理任务,但它们在处理什么?什么变量?他们真的在做什么吗?我们真的可以加快这样的递归计算吗?有时一棵树中有很多叶子,我们可以使用多个线程加快合并操作,但在这种情况下,最终只有 1 个叶子。如果有人能解释这段代码的行为,我真的很感激。 提前致谢。
【问题讨论】: