Advertisement
Alchemik96

PRIR WIELOMIAN OPENMP

Jan 31st, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.06 KB | None | 0 0
  1. // wielomian open mp.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <conio.h>
  6. #include <omp.h>
  7. #include <malloc.h>
  8. #include <stdlib.h>
  9. #include <time.h>
  10.  
  11.  
  12. double potega(double wartosc,int potega)
  13. {
  14. double wynik = 1;
  15.  
  16. for(int i=0;i<potega;i++)
  17. {
  18. wynik*=wartosc;
  19. }
  20. return wynik;
  21. }
  22.  
  23.  
  24.  
  25. //x poniżej wartości 1
  26. //a od 1 do 10
  27. double metoda_bezposrednia(double x, double a[],int stopien)
  28. {
  29. double Wx=0;
  30.  
  31. for(int i = 0;i <=stopien; i++)
  32. {
  33. Wx+=(a[i]*potega(x,i));
  34. }
  35. return Wx;
  36.  
  37. }
  38.  
  39. double metoda_bezposrednia_rownolegle(double x, double a[],int stopien,int watki)
  40. {
  41. double Wx=0;
  42. int i;
  43.  
  44. omp_set_num_threads(watki);
  45. #pragma omp parallel for shared(x,a,stopien) private(i) reduction (+ : Wx)
  46. for( i = 0;i <=stopien; i++)
  47. {
  48. Wx+=(a[i]*potega(x,i));
  49. }
  50. return Wx;
  51.  
  52. }
  53.  
  54. double metoda_bezposrednia_rownolegle_ato(double x, double a[],int stopien,int watki)
  55. {
  56. double Wx=0;
  57. int i;
  58.  
  59. omp_set_num_threads(watki);
  60. #pragma omp parallel for shared(x,a,stopien) private(i)// reduction (+ : Wx)
  61. for( i = 0;i <=stopien; i++)
  62. {
  63. #pragma omp atomic
  64. Wx+=(a[i]*potega(x,i));
  65. }
  66. return Wx;
  67.  
  68. }
  69.  
  70. double metoda_Hohnera(double x, double a[],int stopien)
  71. {
  72. double Wx= 0;
  73.  
  74. for(int i=stopien;i>=0;i--)
  75. {
  76. Wx = (Wx*x + a[i]);
  77. }
  78.  
  79. return Wx;
  80. }
  81.  
  82. double metoda_Hohnera_rownolegle(double x, double a[],int stopien,int watki)
  83. {
  84. double Wx= 0;
  85. int i;
  86. #pragma omp parallel for shared(x,a,stopien,watki) private(i)
  87. for(i=stopien;i>=0;i--)
  88. {
  89. Wx = (Wx*x + a[i]);
  90. }
  91.  
  92. return Wx;
  93. }
  94. double Dorn(double x, double a[],int stopien,int watki)
  95. {
  96. double Wx=0;
  97. double *q;
  98. int j,i;
  99. omp_set_num_threads(watki);
  100. q=(double*)malloc(sizeof(double)*watki);
  101.  
  102. for(int x = 0;x<watki;x++)
  103. {
  104. q[x]=0;
  105. }
  106. #pragma omp parallel for shared(x,a,stopien,watki) private(j,i) reduction (+ : Wx)
  107. for(int i=0;i<watki-1;i++)
  108. {
  109.  
  110. for(int j=0;j<watki-1;j++)
  111. {
  112. q[i]=a[j]*potega(x,watki*j);
  113. }
  114. Wx+=potega(x, i)*q[i]*potega(x, watki);
  115. }
  116. return Wx;
  117.  
  118. //for( i=0;i<watki;i++)
  119. //{
  120. // //#pragma omp parallel for shared(x,a,stopien,watki) private(j)
  121. // for( j=0;j<watki;j++)
  122. // {
  123. // q[i]=a[j]*(potega(x,j*watki));
  124. // }
  125.  
  126. // Wx+=potega(x,i)*q[i]*potega(x,watki);//q[i];
  127. //}
  128.  
  129.  
  130. }
  131.  
  132. int _tmain(int argc, _TCHAR* argv[])
  133. {
  134. int watki =4;
  135. srand( time( NULL ));
  136.  
  137. double r =( rand() % 10 );
  138.  
  139. double x,start,stop,wynik=0;
  140. int n1,n2,n3;
  141. double *A1,*A2,*A3;
  142.  
  143. printf("Podaj x z zakresu 0 do 1\n");
  144. scanf("%lf",&x);
  145. printf("Podaj 3 różne wartości N(stopień wielomianu)\n");
  146. scanf("%d %d %d",&n1,&n2,&n3);
  147.  
  148. A1=(double*)malloc(sizeof(double)*n1+1);
  149. A2=(double*)malloc(sizeof(double)*n2+1);
  150. A3=(double*)malloc(sizeof(double)*n3+1);
  151.  
  152. for(int i=0;i<=n1;i++)
  153. {
  154. A1[i]=rand() % 10;
  155. //printf("%lf \n",A1[i]);
  156. }
  157. for(int i=0;i<=n2;i++)
  158. {
  159. A2[i]=rand() % 10;
  160. //printf("%lf \n",A1[i]);
  161. }
  162. for(int i=0;i<=n3;i++)
  163. {
  164. A3[i]=rand() % 10;
  165. //printf("%lf \n",A1[i]);
  166. }
  167.  
  168. start= omp_get_wtime();
  169. wynik= metoda_bezposrednia(x,A1,n1);
  170. stop=omp_get_wtime();
  171. printf("Metoda bezposrednia dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n1,wynik,stop-start);
  172.  
  173.  
  174. start= omp_get_wtime();
  175. wynik= metoda_bezposrednia(x,A2,n2);
  176. stop=omp_get_wtime();
  177. printf("Metoda bezposrednia dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n2,wynik,stop-start);
  178.  
  179.  
  180. start= omp_get_wtime();
  181. wynik= metoda_bezposrednia(x,A3,n3);
  182. stop=omp_get_wtime();
  183. printf("Metoda bezposrednia dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n3,wynik,stop-start);
  184. puts("//////////////////////\n");
  185. /////////////////////////////////////// metoda Hornera
  186. start= omp_get_wtime();
  187. wynik= metoda_Hohnera(x,A1,n1);
  188. stop=omp_get_wtime();
  189. printf("Metoda Hornera dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n1,wynik,stop-start);
  190.  
  191.  
  192. start= omp_get_wtime();
  193. wynik= metoda_Hohnera(x,A2,n2);
  194. stop=omp_get_wtime();
  195. printf("Metoda Hornera dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n2,wynik,stop-start);
  196.  
  197.  
  198. start= omp_get_wtime();
  199. wynik= metoda_Hohnera(x,A3,n3);
  200. stop=omp_get_wtime();
  201. printf("Metoda Hornera dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n3,wynik,stop-start);
  202.  
  203. puts("//////////////////////\n");
  204. /////////////////////////////////////// metoda rownolegla bezposrednia
  205. start= omp_get_wtime();
  206. wynik= metoda_bezposrednia_rownolegle(x,A1,n1,watki);
  207. stop=omp_get_wtime();
  208. printf("Metoda rownolegla bezposrednia dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n1,wynik,stop-start);
  209.  
  210.  
  211. start= omp_get_wtime();
  212. wynik= metoda_bezposrednia_rownolegle(x,A2,n2,watki);
  213. stop=omp_get_wtime();
  214. printf("Metoda rownolegla bezposrednia dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n2,wynik,stop-start);
  215.  
  216.  
  217. start= omp_get_wtime();
  218. wynik= metoda_bezposrednia_rownolegle(x,A3,n3,watki);
  219. stop=omp_get_wtime();
  220. printf("Metoda rownolegla bezposrednia dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n3,wynik,stop-start);
  221.  
  222. //////////////dorn
  223. puts("//////////////////////\n");
  224.  
  225. start= omp_get_wtime();
  226. wynik= metoda_bezposrednia_rownolegle_ato(x,A1,n1,watki);
  227. stop=omp_get_wtime();
  228. printf("Metoda rownolegla ATO dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n1,wynik,stop-start);
  229.  
  230.  
  231. start= omp_get_wtime();
  232. wynik= metoda_bezposrednia_rownolegle_ato(x,A2,n2,watki);
  233. stop=omp_get_wtime();
  234. printf("Metoda rownolegla ATO dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n2,wynik,stop-start);
  235.  
  236.  
  237. start= omp_get_wtime();
  238. wynik= metoda_bezposrednia_rownolegle_ato(x,A3,n3,watki);
  239. stop=omp_get_wtime();
  240. printf("Metoda rownolegla ATO dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n3,wynik,stop-start);
  241.  
  242. //////////////dorn
  243. puts("//////////////////////\n");
  244. /////////////////////////////////// metoda rownolegla bezposrednia
  245. start= omp_get_wtime();
  246. wynik= Dorn(x,A1,n1,watki);
  247. stop=omp_get_wtime();
  248. printf("Metoda Dorna dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n1,wynik,stop-start);
  249.  
  250.  
  251. start= omp_get_wtime();
  252. wynik= Dorn(x,A2,n2,watki);
  253. stop=omp_get_wtime();
  254. printf("Metoda Dorna dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n2,wynik,stop-start);
  255.  
  256.  
  257. start= omp_get_wtime();
  258. wynik= Dorn(x,A3,n3,watki);
  259. stop=omp_get_wtime();
  260. printf("Metoda Dorna dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n3,wynik,stop-start);
  261. puts("//////////////////////\n");
  262. ///////////
  263. start= omp_get_wtime();
  264. wynik= metoda_Hohnera_rownolegle(x,A1,n1,watki);
  265. stop=omp_get_wtime();
  266. printf("Metoda rownolegla Hornera dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n1,wynik,stop-start);
  267.  
  268.  
  269. start= omp_get_wtime();
  270. wynik= metoda_Hohnera_rownolegle(x,A2,n2,watki);
  271. stop=omp_get_wtime();
  272. printf("Metoda rownolegla Hornera dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n2,wynik,stop-start);
  273.  
  274.  
  275. start= omp_get_wtime();
  276. wynik= metoda_Hohnera_rownolegle(x,A3,n3,watki);
  277. stop=omp_get_wtime();
  278. printf("Metoda rownolegla Hornera dla wielomianu stopnia %d wynik %lf w czasie %lf\n",n3,wynik,stop-start);
  279.  
  280.  
  281.  
  282. // printf("%lf",potega(5,2));
  283.  
  284. getch();
  285. return 0;
  286. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement