
Programming Shared
Memory III
Dr. Cem Özdo
˘
gan
LOGIK
Parallelization
Application
Example-OpenMP
Computing π
11.7
Computing π IV - OpenMP Parallel Calculation
1 # i nc l ude < s t d i o . h>
2 # in c lu d e <math . h>
3 # in c lu d e <omp . h>
4 # de f ine NUM_THREADS 4
5
6 i n t main ( i n t argc , char
*
argv [ ] )
7 {
8 i n t done = 0 , n , i ;
9 double PI25DT = 3.141592653589793238462643;
10 double my pi , h , sum [NUM_THREADS] , x ;
11
12 w h il e ( ! done )
13 {
14 p r i n t f ( " Enter t he number of i n t e r v a l s : (0 qu i t s ) " ) ;
15 scanf ( "%d " ,&n ) ;
16
17 i f ( n == 0) break ; /
*
Qu it when " 0 " entered
*
/
18 /
*
I n t e g r a l l i m i t s are from 0 to 1
*
/
19 h = (1.0 − 0.0) / ( d ouble ) n ; /
*
Step l e ng t h
*
/
20 #pragma omp p a r a l l e l p r i v a t e ( i , x )
21 {
22 i n t id = omp_get_thread_num ( ) ;
23 sum[ id ] = 0 . 0 ; /
*
I n i t i a l i z e sum var i a b l e
*
/
24 f o r ( i = i d +1; i <= n ; i += NUM_THREADS) /
*
loop o ver i n t e r v a l f o r i n t e g r a t i o n
*
/
25 {
26 x = h
*
( ( dou ble ) i − 0 . 5 ) ; /
*
Middle p o i n t at s tep
*
/
27 sum[ id ] += 4.0 / ( 1 . 0 + x
*
x ) ; /
*
Sum up at each s tep
*
/
28 }
29 }
30 f o r ( i =1; i <NUM_THREADS; i ++)
31 sum[ 0 ] += sum[ i ] ;
32 mypi = h
*
sum[ 0 ] ; /
*
Obtain r e s u l t i n g pi number
*
/
33 p r i n t f ( " p i i s app r ox i m at e ly %.16f , E rro r i s %.16 f \ n " , mypi , fabs ( mypi − PI25DT ) ) ;
34 }
35 }