这是使用openmp任务的示例程序。在规范中,它提到当我们遇到并行区域中的任务时,它将被分配给一个线程。
现在我无法弄清楚这种情况会发生什么。在每个递归调用中,正在创建任务。每个任务都有自己的堆栈空间,任务完成后将被销毁。你能解释一下,即使变量是共享的,递归调用中的值是如何预先设定的?
#include "stdio.h"
int com_fib(int n)
{
int f,fn2,fn1;
// f(n) = f(n-1) + f(n-2)
if(n == 0||n == 1) return n;
if ( n < 20 ) return(com_fib(n-1) + com_fib(n-2));
#pragma omp task shared(fn1)
{ fn1 = com_fib(n-1); }
#pragma omp task shared(fn2)
{ fn2 = com_fib(n-2); }
#pragma omp taskwait
f = fn1 + fn1;
return f;
}
void main(int argc, char *argv[])
{
int result;
// printf("arg is %d\n", atoi(argv[1]) );
#pragma omp parallel
{
#pragma omp single nowait
{
result = com_fib(atoi(argv[1]));
} // End of single
} // End of parallel region
printf("Fib is %d\n", result);
}