在openmp中使用任务进行递归调用

时间:2012-03-02 18:32:00

标签: c openmp parallel-processing

这是使用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);

}

0 个答案:

没有答案