2016-01-24 7 views
0

У меня есть следующая программа в OPen MP (C).Отладка параллельной программы В C

Иногда он дает 0 или 3 в качестве числа финнако или сбоев, выдающих ошибку сегментации.

#include <stdlib.h> 
#include <stdio.h> 
#include <omp.h> 

static int fib(int); 

int main(){ 
int nthreads, tid; 
int n =8; 
#pragma omp parallel num_threads(4) private(tid) 

{ 
#pragma omp single 

{ 
tid = omp_get_thread_num(); 
printf("Hello world from (%d)\n", tid); 
printf("Fib(%d) = %d by %d\n", n, fib(n), tid); 

} 
} // all threads join master thread and terminates 
} 
static int fib(int n){ 
int i, j, id; 
if(n < 2) 
return n; 
#pragma omp task shared (i) private (id) 

{ 

i = fib(n-1); 

} 
#pragma omp task shared (j) private (id) 
{ 
j = fib(n-2); 

} 

return (i+j); 
} 

Что не так с программой?

Выход как:

Привет мир из (3)

Фибо (8) = 3 по 3

+1

Итак, вы слышали лекарство от Сельчука Чихана. Это сработало? Мне очень хотелось бы услышать, что такое номера производительности; Fib (n), реализованный таким образом, является самым сложным на Земле, чтобы хорошо распараллелить. Для сравнения номеров см. Http://stackoverflow.com/q/5086040/120163 –

ответ

1

Вы должны иметь taskwait как в #pragma omp taskwait перед возвращение (i+j). В противном случае он вернется до того, как числа будут полностью вычислены, не дожидаясь других задач.

Смежные вопросы