Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.36 KB | None | 0 0
  1. /**
  2. * Obliczanie calek rownolegle
  3. * Kamil Pastwa
  4. */
  5.  
  6. #include<pthread.h>
  7. #include"pomiar_czasu.h"
  8.  
  9. //pthread_mutex_t mutex;
  10.  
  11. double f(double x)
  12. {
  13. return(4/(1+x*x));
  14. }
  15.  
  16. typedef struct params
  17. {
  18. //thread info
  19. int tid;
  20. int nthreads;
  21.  
  22. // data info
  23. double x1; // poczatek przedziaku
  24. double x2; // koniec
  25. int N; // ilosc trapezow
  26. double S;
  27. } params;
  28.  
  29. double S_GLOBAL;
  30.  
  31. /**
  32. * Calkowanie sekwencyjne
  33. * x1, x2 - przedzial calkowania
  34. * N - ilosc trapezow
  35. *
  36. * funkcja zwraca wartosc calki w zadanym zakresie
  37. */
  38. double integrate1(double x1, double x2, int N)
  39. {
  40. double s = 0; // wartosc calki
  41. double dx = (x2 - x1) / N; // odleglosc miedzy dwoma wezlami
  42.  
  43. int i;
  44. for(i = 1; i < N; i++)
  45. s += f(x1 + i * dx);
  46.  
  47. s = (s + (f(x1) + f(x2)) / 2) * dx;
  48.  
  49. return s;
  50. }
  51.  
  52.  
  53. void* calc3();
  54. /**
  55. * Calkowanie rownolegle. Zrownoleglenie petli
  56. * nthreads - liczba watkow uzytych do policzenia calki
  57. */
  58. double integrate3(double x1, double x2, int N, int nthreads)
  59. {
  60. S_GLOBAL=0;
  61. pthread_t threads_t[nthreads]; // tablica przechowujaca numery id watkow
  62. params *tp = (params*) malloc(nthreads * sizeof(params)); // tp - thread_params
  63.  
  64. int i;
  65. for(i = 0 ; i < nthreads ; ++i)
  66. {
  67. //info o watku
  68. tp[i].tid = i;
  69. tp[i].nthreads = nthreads;
  70. //info o danych
  71. tp[i].x1 = x1;
  72. tp[i].x2 = x2;
  73. tp[i].N = N;
  74.  
  75. pthread_create(&threads_t[i], NULL, calc3, (void*) &tp[i] );
  76. }
  77.  
  78. for(i = 0 ; i < nthreads ; ++i)
  79. pthread_join(threads_t[i], NULL);
  80.  
  81. double returnS = 0;
  82. for(i = 0 ; i < nthreads ; ++i){
  83. // printf("retS[%d] = %f\n", i, tp[i].S);
  84. returnS += tp[i].S;
  85.  
  86. }
  87.  
  88. return returnS;
  89. }
  90.  
  91. // funkcja watku dla integrate3
  92. void* calc3(void* _p)
  93. {
  94. struct params* p = (params*) _p;
  95. //printf("Watek nr %d. x1= %f x2=%f N=%d. Ilosc wszystkich watkow:%d\n", p->tid, p->x1, p->x2, p->N, p->nthreads);
  96.  
  97. int tid = p->tid;
  98. int chunk_size = (p->N / p->nthreads);
  99.  
  100. int start = tid * chunk_size;
  101. int end = start + chunk_size;
  102. //printf("Watek nr %d. start= %d end= %d\n", tid, start, end);
  103.  
  104. int i;
  105. double dx = (p->x2 - p->x1) / p->N;
  106.  
  107. double _s = 0;
  108. for(i = start ; i < end ; ++i)
  109. _s += f( p->x1 + i * dx);
  110.  
  111. _s = (_s + (f(p->x1) + f(p->x2)) / 2) * dx;
  112.  
  113. p->S = _s;
  114. //printf("Watek nr %d. wynik lokalny = %f\n", tid, _s);
  115.  
  116. // pthread_mutex_lock(&mutex);
  117. //S_GLOBAL += _s;
  118. //pthread_mutex_unlock(&mutex);
  119. }
  120.  
  121. int main()
  122. {
  123. //pthread_mutex_init(&mutex, NULL);
  124. const int N = 10000000; // liczba trapezĂłw
  125. double x1 = 0; // poczatek przedzialu calkowania
  126. double x2 = 1; // koniec przedzialu calkowania
  127. int nthreads = 4; // liczba watkow
  128. //int n = 10000; // ilosc wywolan funkcji liczacej
  129.  
  130. int i,j;
  131. double _s, sekwS;
  132.  
  133. // ==== Calkowanie sekwencyjne =====
  134. inicjuj_czas();
  135. //for(i = 0 ; i < n ; ++i)
  136. _s = integrate1(x1,x2,N);
  137. printf("Wynik calkowania sekwencyjnego S= %f\n", _s);
  138. drukuj_czas();
  139.  
  140. sekwS = _s;
  141. // ==== Calkowanie rownolegle - zrownoleglenie petli =====
  142. double czasCalkowityRownolegly = czas_zegara();
  143. double localTime;
  144.  
  145. //for(j = 1 ; j <= nthreads ; ++j){
  146. //localTime=czas_zegara();
  147. printf("\n----\nLiczba watkow: %d\n", nthreads);
  148. printf("wynik= %f\n", _s);
  149. inicjuj_czas();
  150. _s = integrate3(x1,x2,N,nthreads);
  151. drukuj_czas();
  152. //localTime=czas_zegara() - localTime;
  153.  
  154. //printf("localTime = %f\n", localTime);
  155. //}
  156.  
  157. czasCalkowityRownolegly = czas_zegara() - czasCalkowityRownolegly;
  158. printf("\n\nWynik calkowania rownoleglego S= %f\nCzas calkowania rownoleglego: %f", _s, czasCalkowityRownolegly);
  159.  
  160. //printf("Wynik calkowania ze zrownolegleniem petli S= %f\nWynik 2 sposobem:\t%f", S_GLOBAL, test);
  161. nthreads = 4;
  162. printf("\n\n\n===== TESTOWANIE DOKLADNOSCI dla %d watkow =======\n\n", nthreads);
  163. for(i = 10 ; i < 10000000 ; i*=10){
  164. _s = integrate3(x1,x2,i,nthreads);
  165. printf("Wynik dla n = %i \t=\t%f\tblad= %f\n", i, _s, _s-sekwS);
  166. }
  167. return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement