我正在尝试了解如何使final
的{{1}}条实际有效,我在this链接中找到了以下代码示例。
task
但是当我通过调试检查#include <stdio.h>
#include <omp.h>
#define THRESHOLD 5
int fib(int n)
{
int i, j;
if (n<2)
return n;
#pragma omp task shared(i) firstprivate(n) final(n <= THRESHOLD)
i=fib(n-1);
#pragma omp task shared(j) firstprivate(n) final(n <= THRESHOLD)
j=fib(n-2);
#pragma omp taskwait
return i+j;
}
int main()
{
int n = 30;
omp_set_dynamic(0);
omp_set_num_threads(4);
#pragma omp parallel shared(n)
{
#pragma omp single
printf ("fib(%d) = %d\n", n, fib(n));
}
}
的值时,我注意到即使条件n
为真,仍然会调用递归函数。所以,我的问题是,我是否误解了某些内容或者代码有什么问题?
答案 0 :(得分:3)
当您致电final
时会发生什么事情,即从这个任务中产生的任务不能从中完成任务。
当任务构造和最终子句表达式出现最后一个子句时 如果计算结果为true,则生成的任务将成为最终任务。所有任务构造 在执行最终任务期间遇到的任务将生成最终和包含的任务。注意 在任务构造的final子句表达式中使用变量会导致 隐式引用所有封闭结构中的变量。
最终任务是:
强制所有子任务成为最终任务和任务的任务。
包含的任务是:
执行顺序包含在生成任务区域中的任务。 也就是说,包含的任务不会被延期并立即执行 遇到线程。
在您的情况下,这意味着:
如果在此任务中满足THREASHOLD
,则会生成n-1
和n-2
生成的新任务,并且这些任务在进入递归调用时不会生成新任务但仍会调用功能在老式的&#39;函数调用方式。