2016-01-24 57 views
0

我在OPen MP(C)中有以下程序。調試並行程序在C中

它有時給出0或3作爲fibonnaci數字或崩潰給出分段錯誤。

#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

所以你聽說過SelçukCihan的治療方法。它有用嗎?我真的很想聽聽演奏的數字是什麼;以這種方式實施的Fib(n)是在地球上最難並行化的一種。有關比較編號,請參閱http://stackoverflow.com/q/5086040/120163 –

回答

1

您需要正確之前,有一個taskwait在#pragma omp taskwait返回(i+j)。否則它將在數字完全計算之前返回,而不等待其他任務。