Advertisement
filip710

LV3 Z2 djelomični

May 2nd, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.02 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 2
  8. #define N 5
  9.  
  10. CRITICAL_SECTION cs;
  11. double **matricaThread;
  12. HANDLE handleThread[NTHRD];
  13. volatile double columnAverageGlobal = 0;
  14.  
  15. struct threadParams
  16. {
  17.     int rowStart, rowEnd, id;
  18.     double partSum;
  19.     double colAvg;
  20. };
  21.  
  22. double** newMatrix(int rows, int columns) {
  23.     int i, j;
  24.  
  25.     double** Matrix = new double*[rows];
  26.     for (int i = 0; i < rows; ++i)
  27.         Matrix[i] = new double[columns];
  28.  
  29.     return Matrix;
  30. }
  31.  
  32. double colAverage(int column, double** matrix, int numRows) {
  33.     double asps = 0;
  34.     int i, j;
  35.  
  36.     for (i = 0; i < numRows; i++) {
  37.         asps += matrix[i][column];
  38.     }
  39.  
  40.     return asps/numRows;
  41. }
  42.  
  43. DWORD WINAPI threadFunction(VOID *params)
  44. {
  45.     time_t t1, t2;
  46.     int i, j, k;
  47.     struct threadParams *threadParam;
  48.     threadParam = (struct threadParams *)params;
  49.  
  50.     t1 = clock();
  51.     printf("I am thread no. %d\n", threadParam->id);
  52.     for (j = threadParam->rowStart; j < threadParam->rowEnd; j++) {
  53.         threadParam->colAvg = 0;
  54.         for (i = 0; i < N; i++) {
  55.             matricaThread[i][j] = 0;
  56.  
  57.             for (k = 0; k <= i; k++) {
  58.                 matricaThread[i][j] += k * sin(j) - j * cos(k);
  59.             }
  60.             printf("[%d][%d] = %.2f\t", i, j, matricaThread[i][j]);
  61.  
  62.             matricaThread[i][j] += columnAverageGlobal;
  63.             threadParam->partSum += matricaThread[i][j];
  64.         }
  65.         threadParam->colAvg = colAverage(j, matricaThread, N);
  66.         EnterCriticalSection(&cs);
  67.         columnAverageGlobal = threadParam->colAvg;
  68.         LeaveCriticalSection(&cs);
  69.         printf("Prosjek %d.: %f\n", j, columnAverageGlobal);
  70.     }
  71.     t2 = clock();
  72.  
  73.     printf("Thread %d time: %dms\n", threadParam->id, t2 - t1);
  74.     printf("Thread %d partial sum: %f\n", threadParam->id, threadParam->partSum);
  75.     return 0;
  76. }
  77.  
  78. int main()
  79. {
  80.     double matrixSum = 0;
  81.     double matrixSum2 = 0;
  82.     double colAvgSeq = 0;
  83.     matricaThread = newMatrix(N, N);
  84.     double **matricaSeq = newMatrix(N, N);
  85.  
  86.     int i, j, k;
  87.  
  88.     time_t time1seq, time2seq;
  89.     time_t time1thr, time2thr;
  90.  
  91.     long delta = N / NTHRD;
  92.  
  93.     printf("DELTA: %d\n\n", delta);
  94.  
  95.     time1seq = clock();
  96.     printf("Started sequential timer...\n");
  97.  
  98.     //S prosjekom
  99.     for (j = 0; j < N; j++) {
  100.         for (i = 0; i < N; i++) {
  101.             matricaSeq[i][j] = 0;
  102.  
  103.             for (k = 0; k <= i; k++) {
  104.                 matricaSeq[i][j] += k * sin(j) - j * cos(k);
  105.             }
  106.             matricaSeq[i][j] += colAvgSeq;
  107.             matrixSum += matricaSeq[i][j];
  108.         }
  109.         colAvgSeq = colAverage(j, matricaSeq, N);
  110.         printf("Prosjek %d.: %f\n", j, colAvgSeq);
  111.     }
  112.  
  113.     printf("Matrica s prosjekom: \n");
  114.     for (i = 0; i < N; i++) {
  115.         for (j = 0; j < N; j++) {
  116.             printf("[%d][%d] = %.2f\t", i, j, matricaSeq[i][j]);
  117.         }
  118.         printf("\n");
  119.     }
  120.  
  121.     time2seq = clock();
  122.  
  123.     printf("\nTime seq: %dms\n", time2seq - time1seq);
  124.     printf("Sum seq: %f\n\n", matrixSum);
  125.    
  126.     struct threadParams threadParam[NTHRD + 1];
  127.  
  128.     time1thr = clock();
  129.     printf("Started thread timer...\n");
  130.     InitializeCriticalSection(&cs);
  131.     //threadParam[0].colStart = 0;
  132.     threadParam[0].rowStart = 0;
  133.     for (i = 1; i <= NTHRD; i++)
  134.     {
  135.         if (N / NTHRD == N) {
  136.             threadParam[i - 1].rowEnd = N;
  137.         }
  138.         else {
  139.             threadParam[i - 1].rowEnd = N % 2 == 0 ? delta * i : (delta * i) + 1;
  140.         }
  141.         threadParam[i - 1].id = i;
  142.         threadParam[i - 1].partSum = 0;
  143.         //threadParam[i - 1].colEnd = delta * i;
  144.         handleThread[i - 1] = CreateThread(NULL, 0, threadFunction, &threadParam[i - 1], 0, NULL);
  145.         printf("%d. thread [%d][%d] - [%d][%d]\n", i, threadParam[i - 1].rowStart, N, threadParam[i - 1].rowEnd, N);
  146.         threadParam[i].rowStart = threadParam[i - 1].rowEnd;
  147.  
  148.         //threadParam[i].colStart = threadParam[i - 1].colEnd;
  149.     }
  150.  
  151.     if (threadParam[NTHRD - 1].rowEnd < N) {
  152.         threadParam[NTHRD - 1].rowEnd = N;
  153.     }
  154.  
  155.     WaitForMultipleObjects(NTHRD, handleThread, TRUE, INFINITE);
  156.     DeleteCriticalSection(&cs);
  157.     matrixSum = 0;
  158.     for (i = 0; i < NTHRD; i++) {
  159.         printf("sp[%d]=%f\n", i, threadParam[i].partSum);
  160.         matrixSum += threadParam[i].partSum;
  161.     }
  162.     time2thr = clock();
  163.     printf("\nTime thread: %dms\n", time2thr - time1thr);
  164.     printf("Sum thread: %f\n", matrixSum);
  165.  
  166.     system("pause");
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement