Advertisement
Guest User

Untitled

a guest
Feb 26th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <time.h>
  5. #include <omp.h>
  6.  
  7. #define NUM_CORES 2
  8.  
  9. void multiply_matrix_sequential(float **A, float **B, long n, float **C);
  10. void multiply_matrix_parallel_static(float **A, float **B, long n, float **C);
  11. void multiply_matrix_parallel_static_imgura(float **A, float **B, long n, float **C);
  12. void multiply_matrix_parallel_static_16(float **A, float **B, long n, float **C);
  13. void multiply_matrix_parallel_static_v2(float **A, float **B, long n, float **C);
  14. void multiply_matrix_parallel_static_v3(float **A, float **B, long n, float **C);
  15. void multiply_matrix_parallel_dynamic(float **A, float **B, long n, float **C);
  16. void multiply_matrix_parallel_guided(float **A, float **B, long n, float **C);
  17.  
  18. float** init_matrix(long n, bool init_empty);
  19. void zero_matrix(float **arr, long n);
  20. void print_matrix(float **arr, long n);
  21. void compare_two_matrices(float **C, float **Cs, long n);
  22.  
  23. int main(int argc, char* args[])
  24. {
  25. srand(time(NULL));
  26. printf("\nn;parallel_static,parallel_static_v2;parallel_static_v3;");
  27. for (int i = 1; i < 25; i = i + 4 ) {
  28. long n = i * 100;
  29. float **A = init_matrix(n, false);
  30. float **B = init_matrix(n, false);
  31. float **C = init_matrix(n, true);
  32. float **Cs = init_matrix(n, true);
  33.  
  34. zero_matrix(C, n);
  35. zero_matrix(Cs, n);
  36.  
  37. printf("\n%ld;",n);
  38. multiply_matrix_sequential(A, B, n, Cs);
  39.  
  40. multiply_matrix_parallel_static_imgura(A, B, n, C);
  41. // compare_two_matrices(C, Cs, n);
  42. zero_matrix(C, n);
  43.  
  44. // multiply_matrix_parallel_static_v2(A, B, n, C);
  45. // // compare_two_matrices(C, Cs, n);
  46. // zero_matrix(C, n);
  47.  
  48. // multiply_matrix_parallel_static_v3(A, B, n, C);
  49. // compare_two_matrices(C, Cs, n);
  50. // zero_matrix(C, n);
  51. printf("\n");
  52.  
  53. free(A); free(B); free(C); free(Cs);
  54. }
  55.  
  56. // printf("\n\n szeregowanie \n\n");
  57. // printf("n;seqentiual;parallel_static;parallel_dynamic;parallel_guided;");
  58. // for (int i = 1; i < 25; i = i + 4 ) {
  59.  
  60. // long n = i * 100;
  61. // float **A = init_matrix(n, false);
  62. // float **B = init_matrix(n, false);
  63. // float **C = init_matrix(n, true);
  64. // float **Cs = init_matrix(n, true);
  65.  
  66. // zero_matrix(C, n);
  67. // zero_matrix(Cs, n);
  68.  
  69. // printf("\n%ld;",n);
  70. // multiply_matrix_sequential(A, B, n, Cs);
  71.  
  72. // multiply_matrix_parallel_static(A, B, n, C);
  73. // compare_two_matrices(C, Cs, n);
  74. // zero_matrix(C, n);
  75.  
  76. // multiply_matrix_parallel_dynamic(A, B, n, C);
  77. // compare_two_matrices(C, Cs, n);
  78. // zero_matrix(C, n);
  79.  
  80. // multiply_matrix_parallel_guided(A, B, n, C);
  81. // compare_two_matrices(C, Cs, n);
  82. // zero_matrix(C, n);
  83. // printf("\n");
  84.  
  85. // free(A); free(B); free(C); free(Cs);
  86. // }
  87. return EXIT_SUCCESS;
  88. }
  89.  
  90. void multiply_matrix_sequential(float **A, float **B, long n, float **C)
  91. {
  92. long i, j, k;
  93. clock_t start, stop;
  94.  
  95. start = clock();
  96. for(i = 0 ; i < n; i++)
  97. for(k = 0 ; k < n ; k++)
  98. for(j = 0; j < n; j++)
  99. C[i][j] += A[i][k] * B[k][j];
  100. stop = clock();
  101.  
  102. printf("\t\t%5.5f;", ((double) (stop - start)) / CLOCKS_PER_SEC);
  103. }
  104.  
  105. void multiply_matrix_parallel_static(float **A, float **B, long n, float **C)
  106. {
  107. clock_t start, stop;
  108.  
  109. start = clock();
  110. #pragma omp parallel for schedule(static,16) num_threads(NUM_CORES)
  111. for(long i = 0 ; i < n; i++)
  112. for(long k = 0 ; k < n ; k++)
  113. for(long j = 0; j < n; j++) {
  114. C[i][j] += A[i][k] * B[k][j];
  115. }
  116. stop = clock();
  117.  
  118. printf("\t%5.5f;", (((double) (stop - start)) / CLOCKS_PER_SEC) / NUM_CORES);
  119. }
  120.  
  121. void multiply_matrix_parallel_static_imgura(float **A, float **B, long n, float **C)
  122. {
  123. clock_t start, stop;
  124.  
  125. start = clock();
  126. #pragma omp parallel for schedule(static,16) num_threads(NUM_CORES)
  127. for(long i = 0 ; i < n; i++)
  128. for(long j = 0; j < n; j++)
  129. for(long k = 0 ; k < n ; k++){
  130. C[i][j] += A[i][k] * B[k][j];
  131. }
  132. stop = clock();
  133.  
  134. printf("\t%5.5f;", (((double) (stop - start)) / CLOCKS_PER_SEC) / NUM_CORES);
  135. }
  136.  
  137. void multiply_matrix_parallel_static_16(float **A, float **B, long n, float **C)
  138. {
  139. clock_t start, stop;
  140.  
  141. start = clock();
  142. #pragma omp parallel for schedule(static) num_threads(NUM_CORES)
  143. for(long i = 0 ; i < n; i++)
  144. for(long k = 0 ; k < n ; k++)
  145. for(long j = 0; j < n; j++) {
  146. C[i][j] += A[i][k] * B[k][j];
  147. }
  148. stop = clock();
  149.  
  150. printf("\t%5.5f;", (((double) (stop - start)) / CLOCKS_PER_SEC) / NUM_CORES);
  151. }
  152.  
  153. void multiply_matrix_parallel_static_v2(float **A, float **B, long n, float **C)
  154. {
  155. clock_t start, stop;
  156.  
  157. start = clock();
  158. for(long i = 0 ; i < n; i++)
  159. #pragma omp parallel for schedule(static) num_threads(NUM_CORES)
  160. for(long k = 0 ; k < n ; k++) {
  161. for(long j = 0; j < n; j++) {
  162. #pragma omp atomic
  163. C[i][j] += A[i][k] * B[k][j];
  164. }
  165. }
  166. stop = clock();
  167.  
  168. printf("\t%5.5f;", (((double) (stop - start)) / CLOCKS_PER_SEC) / NUM_CORES);
  169. }
  170.  
  171. void multiply_matrix_parallel_static_v3(float **A, float **B, long n, float **C)
  172. {
  173. clock_t start, stop;
  174.  
  175. start = clock();
  176. for(long i = 0 ; i < n; i++)
  177. for(long k = 0 ; k < n ; k++)
  178. #pragma omp parallel for schedule(static) num_threads(NUM_CORES)
  179. for(long j = 0; j < n; j++) {
  180. C[i][j] += A[i][k] * B[k][j];
  181. }
  182. stop = clock();
  183.  
  184. printf("\t%5.5f;", (((double) (stop - start)) / CLOCKS_PER_SEC) / NUM_CORES);
  185. }
  186.  
  187. void multiply_matrix_parallel_dynamic(float **A, float **B, long n, float **C)
  188. {
  189. clock_t start, stop;
  190.  
  191. start = clock();
  192. #pragma omp parallel for schedule(dynamic) num_threads(NUM_CORES)
  193. for(long i = 0 ; i < n; i++)
  194. for(long k = 0 ; k < n ; k++)
  195. for(long j = 0; j < n; j++) {
  196. C[i][j] += A[i][k] * B[k][j];
  197. }
  198. stop = clock();
  199.  
  200. printf("\t%5.5f;", (((double) (stop - start)) / CLOCKS_PER_SEC) / NUM_CORES);
  201. }
  202.  
  203. void multiply_matrix_parallel_guided(float **A, float **B, long n, float **C)
  204. {
  205. clock_t start, stop;
  206.  
  207. start = clock();
  208. #pragma omp parallel for schedule(guided) num_threads(NUM_CORES)
  209. for(long i = 0 ; i < n; i++)
  210. for(long k = 0 ; k < n ; k++)
  211. for(long j = 0; j < n; j++) {
  212. C[i][j] += A[i][k] * B[k][j];
  213. }
  214. stop = clock();
  215.  
  216. printf("\t%5.5f;", (((double) (stop - start)) / CLOCKS_PER_SEC) / NUM_CORES);
  217. }
  218.  
  219. float** init_matrix(long n, bool init_empty)
  220. {
  221. long i, j;
  222. float **arr = (float **)malloc((size_t) (n * sizeof(float *)));
  223.  
  224. for(i = 0; i < n; i++)
  225. {
  226. arr[i] = (float *)malloc((size_t) (n * sizeof(float)));
  227.  
  228. for(j = 0; j < n; j++)
  229. {
  230. if(init_empty)
  231. arr[i][j] = 0;
  232. else
  233. arr[i][j] = (float) rand() / RAND_MAX;
  234. }
  235. }
  236.  
  237. return arr;
  238. }
  239.  
  240. void zero_matrix(float **arr, long n)
  241. {
  242. long i, j;
  243.  
  244. for(i = 0; i < n; i++)
  245. for(j = 0; j < n; j++)
  246. arr[i][j] = 0;
  247. }
  248.  
  249. void print_matrix(float **arr, long n)
  250. {
  251. long i, j;
  252.  
  253. for(i = 0; i < n; i++)
  254. {
  255. for(j = 0; j < n; j++)
  256. printf("%5.5f ", arr[i][j]);
  257.  
  258. printf("\n");
  259. }
  260. }
  261.  
  262. void compare_two_matrices(float **C, float **Cs, long n)
  263. {
  264. long i, j;
  265.  
  266. for(i = 0; i < n; i++)
  267. {
  268. for(j = 0; j < n; j++)
  269. if(C[i][j] != Cs[i][j]) {
  270. printf("Not indentical matrices, C = %.6f Cs = %.6f, C[%ld][%ld]",C[i][j] , Cs[i][j], i, j);
  271. return;
  272. }
  273. }
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement