Advertisement
filip710

LV3 Z1

May 2nd, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.17 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <time.h>
  5. #include <math.h>
  6.  
  7. #define NTHRD 4 // Broj niti
  8. #define N 500 // Dimenzije matrice
  9.  
  10. double **matricaThread;
  11.  
  12. struct threadParams
  13. {
  14.     int rowStart, rowEnd, id;
  15.     double partSum;
  16. };
  17.  
  18. double** newMatrix(int rows, int columns) {
  19.     int i, j;
  20.  
  21.     double** Matrix = new double*[rows];
  22.     for (int i = 0; i < rows; ++i)
  23.         Matrix[i] = new double[columns];
  24.  
  25.     return Matrix;
  26. }
  27.  
  28. DWORD WINAPI threadFunction(VOID *params)
  29. {
  30.     time_t t1, t2;
  31.     int i, j, k;
  32.     struct threadParams *threadParam;
  33.     threadParam = (struct threadParams *)params;
  34.  
  35.     t1 = clock();
  36.     printf("I am thread no. %d\n", threadParam->id);
  37.     for (i = threadParam->rowStart; i < threadParam->rowEnd; i++)
  38.     {
  39.         for (j = 0; j < N; j++) {
  40.             matricaThread[i][j] = 0;
  41.  
  42.             for (k = 0; k <= i; k++) {
  43.                 matricaThread[i][j] += k * sin(j) - j * cos(k);
  44.             }
  45.             //printf("[%d][%d] = %.2f\t", i, j, matricaThread[i][j]);
  46.             threadParam->partSum += matricaThread[i][j];
  47.  
  48.         }
  49.         //printf("\n");
  50.     }
  51.     t2 = clock();
  52.  
  53.     printf("Thread %d time: %dms\n", threadParam->id, t2 - t1);
  54.     printf("Thread %d partial sum: %f\n", threadParam->id, threadParam->partSum);
  55.     return 0;
  56. }
  57.  
  58. int main()
  59. {
  60.     double matrixSum = 0;
  61.     HANDLE handleThread[NTHRD];
  62.     matricaThread = newMatrix(N, N);
  63.     double **matricaSeq = newMatrix(N, N);
  64.  
  65.     int i, j, k;
  66.  
  67.     time_t time1seq, time2seq;
  68.     time_t time1thr, time2thr;
  69.  
  70.     long delta = N / NTHRD;
  71.  
  72.     printf("DELTA: %d\n\n", delta);
  73.  
  74.     time1seq = clock();
  75.     printf("Started sequential timer...\n");
  76.     for (i = 0; i < N; i++) {
  77.         for (j = 0; j < N; j++) {
  78.             matricaSeq[i][j] = 0;
  79.  
  80.             for (k = 0; k <= i; k++) {
  81.                 matricaSeq[i][j] += k * sin(j) - j * cos(k);
  82.             }
  83.             //printf("[%d][%d] = %.2f\t", i, j, matricaSeq[i][j]);
  84.             matrixSum += matricaSeq[i][j];
  85.         }
  86.         //printf("\n");
  87.     }
  88.     time2seq = clock();
  89.  
  90.     printf("\nTime seq: %dms\n", time2seq - time1seq);
  91.     printf("Sum seq: %f\n\n", matrixSum);
  92.  
  93.     struct threadParams threadParam[NTHRD + 1];
  94.  
  95.     time1thr = clock();
  96.     printf("Started thread timer...\n");
  97.  
  98.     //threadParam[0].colStart = 0;
  99.     threadParam[0].rowStart = 0;
  100.     for (i = 1; i <= NTHRD; i++)
  101.     {
  102.         if (N / NTHRD == N) {
  103.             threadParam[i - 1].rowEnd = N;
  104.         }
  105.         else {
  106.             threadParam[i - 1].rowEnd = N % 2 == 0 ? delta * i : (delta * i) + 1;
  107.         }
  108.         threadParam[i - 1].id = i;
  109.         threadParam[i - 1].partSum = 0;
  110.         //threadParam[i - 1].colEnd = delta * i;
  111.         handleThread[i - 1] = CreateThread(NULL, 0, threadFunction, &threadParam[i - 1], 0, NULL);
  112.         printf("%d. thread [%d][%d] - [%d][%d]\n", i, threadParam[i - 1].rowStart, N, threadParam[i - 1].rowEnd, N);
  113.         threadParam[i].rowStart = threadParam[i - 1].rowEnd;
  114.  
  115.         //threadParam[i].colStart = threadParam[i - 1].colEnd;
  116.     }
  117.  
  118.     if (threadParam[NTHRD - 1].rowEnd < N) {
  119.         threadParam[NTHRD - 1].rowEnd = N;
  120.     }
  121.  
  122.     WaitForMultipleObjects(NTHRD, handleThread, TRUE, INFINITE);
  123.  
  124.     matrixSum = 0;
  125.     for (i = 0; i < NTHRD; i++) {
  126.         printf("sp[%d]=%f\n", i, threadParam[i].partSum);
  127.         matrixSum += threadParam[i].partSum;
  128.     }
  129.     time2thr = clock();
  130.     printf("\nTime thread: %dms\n", time2thr - time1thr);
  131.     printf("Sum thread: %f\n", matrixSum);
  132.  
  133.     system("pause");
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement