Использование задач в openmp для рекурсивных вызовов - PullRequest
3 голосов
/ 02 марта 2012

Это пример программы, использующей задачи 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);

}
...