Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.66 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <pthread.h>
  5. #include <sys/types.h>
  6. #include <time.h>
  7. #ifndef N
  8. #define N (2)
  9. #endif
  10. //using namespace std;
  11. int A[N][N]={2, 2, 2, 2}, B[N][N]={3,3,3,3}, C[N][N];
  12.  
  13. static int COLS;
  14. static int ROWS;
  15. static int THREADS;
  16.  
  17. typedef struct argMatrix_tag {
  18.     int id;
  19.     int rows;
  20.     int cols;
  21.     int from;
  22.     int to;
  23.     int **a;
  24.     int **b;
  25.     int **c;
  26. } argMatrix_t;
  27.  
  28. void* func(void* num)
  29. {
  30.     //printf("n = %lx\n", (off_t)num);
  31.     // TODO: matrix * matrix // got it
  32.     for(int i = 0; i < N; i++)
  33.         for(int j = 0; j < N; j++)
  34.             {
  35.                 C[i][j] = 0;
  36.                 for(int k = 0; k < N; k++)
  37.                     C[i][j] += A[i][k] * B[k][j];
  38.             }
  39.     return NULL;
  40. }
  41.  
  42. void* mulrow(void *arg) {
  43.     argMatrix_t *mrx = (argMatrix_t*) arg;
  44.     int i, j, row_index;
  45.  
  46.     for (row_index = mrx->from; row_index < mrx->to; row_index++) {
  47.         for (i = 0; i < mrx->rows; i++) {
  48.             for (j = 0; j < mrx->cols; j++) {
  49.                 mrx->c[row_index][i] += mrx->a[row_index][j] * mrx->b[j][i];
  50.             }
  51.         }
  52.     }
  53.  
  54.     return 0;
  55. }
  56.  
  57. void createMatrix(int ***a, size_t rows, size_t cols) { //inline
  58.     size_t i;
  59.  
  60.     (*a) = (int**) malloc(rows * sizeof(int*));
  61.     (*a)[0] = (int*) malloc(rows * cols * sizeof(int));
  62.     for (i = 1; i < rows; i++) {
  63.         (*a)[i] = (*a)[0] + i * cols;
  64.     }
  65. }
  66.  
  67. void freeMatrix(int ***a) {
  68.     free((*a)[0]);
  69.     free(*a);
  70.     *a = NULL;
  71. }
  72.  
  73. int fillRand(size_t i, size_t j) { //inline
  74.     return rand() % 16;
  75. }
  76. //inline
  77. void fillMatrix(int **a, size_t rows, size_t cols, int (*f)(size_t, size_t)) {
  78.     size_t i, j;
  79.     for (i = 0; i < rows; i++) {
  80.         for (j = 0; j < cols; j++) {
  81.             a[i][j] = f(i, j);
  82.         }
  83.     }
  84. }
  85.  
  86. void testing()
  87. {
  88.     int **a = NULL;
  89.     int **b = NULL;
  90.     int **c = NULL;
  91.     argMatrix_t *mrx;
  92.     pthread_t *threads;
  93.     int i, j, k, t_tick, s_tick, attempt_counter;
  94.     int rows_per_thread, residue;
  95.     long int frequency, t1, t2;
  96.     double elapsedTime;
  97.     FILE *out = NULL;
  98.     const char *filename = "statistics.txt";
  99.     //float times[ATTEMPTS];
  100.     float mean_time;
  101.  
  102.     ROWS = COLS = 500; // MRX SIZE
  103.  
  104.         createMatrix(&a, ROWS, COLS);
  105.         createMatrix(&b, COLS, ROWS);
  106.         createMatrix(&c, COLS, COLS);
  107.         fillMatrix(a, ROWS, COLS, fillRand);
  108.         fillMatrix(b, COLS, ROWS, fillRand);
  109.         // THREADS +++++++++++++++++++++++++++++++++++++++++++++++
  110.         THREADS = 30;
  111.         mrx = (argMatrix_t*) malloc(sizeof(argMatrix_t)*THREADS);
  112.         threads = (pthread_t*) malloc(sizeof(pthread_t)*THREADS);
  113.         rows_per_thread = ROWS / THREADS;
  114.         residue = ROWS % THREADS;
  115.  
  116.         for (i = 0; i < THREADS; i++)
  117.         {
  118.             mrx[i].id = i;
  119.             mrx[i].a = a;
  120.             mrx[i].b = b;
  121.             mrx[i].c = c;
  122.             mrx[i].from = rows_per_thread * i;
  123.             mrx[i].to = (i + 1)*rows_per_thread;
  124.             mrx[i].cols = COLS;
  125.             mrx[i].rows = ROWS;
  126.         }
  127.         mrx[THREADS - 1].to += residue;
  128.  
  129.         for (i = 0; i < THREADS; i++)
  130.         {
  131.             pthread_create(&threads[i], NULL, mulrow, (void*)&mrx[i]);
  132.         }
  133.         for (i = 0; i < THREADS; i++)
  134.         {
  135.             pthread_join(threads[i], NULL);
  136.         }
  137.  
  138.         free(threads);
  139.         free(mrx);
  140.         freeMatrix(&a);
  141.         freeMatrix(&b);
  142.         freeMatrix(&c);
  143. }
  144.  
  145. int main (int argc, char* argv[])
  146. {
  147. /*  pthread_t pid;
  148.     void *res;
  149.     pthread_create(&pid, NULL, func, (void*)1);
  150.     pthread_join(pid, &res);
  151.  
  152.     // TODO display matrix // got it
  153.     for (int i = 0; i < N; i++)
  154.     {
  155.         for (int j = 0; j < N; j++)
  156.         {
  157.             printf("%d ", C[i][j]);
  158.         }
  159.     }
  160. */
  161.     //time_t start, end;
  162.     //time(&start);
  163.     float ttt = clock();
  164.     testing(); 
  165.     //for(int k=0; k<99999999; k++);
  166.     printf("THREADS = %d", THREADS);
  167.     printf("\n");
  168.     float answer = ((float)ttt) / CLOCKS_PER_SEC;
  169.     printf("%.30f", answer);
  170.     printf("\n");
  171.     //time(&end);
  172.     //double seconds = difftime(end, start);
  173.     //printf("The time: %f seconds\n", seconds);
  174.  
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement