Advertisement
Ladies_Man

Sparse matrix multiplication. single-thread

Feb 23rd, 2015
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <time.h>
  5. #define ORD 200
  6. #define SIZE (ORD*ORD/100)
  7.  
  8. typedef struct _matrix {
  9.     int size;
  10.     int ord;
  11.     int val[ORD*ORD];
  12.     int col[ORD*ORD];
  13.     int row[ORD*ORD];
  14. } matrix;
  15.  
  16. matrix A, B, C;
  17.  
  18. void swap (matrix *m, int i, int j)
  19. {
  20.     int temp = m->val[i];
  21.     m->val[i] = m->val[j];
  22.     m->val[j] = temp;
  23.  
  24.     temp = m->row[i];
  25.     m->row[i] = m->row[j];
  26.     m->row[j] = temp;
  27.  
  28.     temp = m->col[i];
  29.     m->col[i] = m->col[j];
  30.     m->col[j] = temp;
  31. }
  32.  
  33. void fill_matrix (matrix* m)
  34. {
  35.     int i, j, gap;
  36.     m->ord = ORD;
  37.     m->size = SIZE;
  38.  
  39.     srand( time(NULL) );
  40.     for (i = 0; i < SIZE; i++) {
  41.         m->val[i] = rand() % 18 - 9;
  42.         m->col[i] = rand() % ORD + 0;
  43.         m->row[i] = rand() % ORD + 0;
  44.     }
  45.  
  46.     for (gap = SIZE/2; gap > 0;gap /= 2)
  47.         for (i = gap; i < SIZE; i++)
  48.             for (j = i; j >= gap && ((m->row[j] < m->row[j-gap]) ||
  49.                 (m->row[j] == m->row[j-gap] && m->col[j] < m->col[j-gap])); j -= gap)
  50.                 swap (m, j, j - gap);
  51.  
  52.     printf("Matrix: ord:%dx%d size:%d (%d)\n", ORD, ORD, SIZE, ORD*ORD);
  53. }
  54.  
  55. void multi (matrix* A, matrix* B, matrix* C)
  56. {
  57.     int i, j, k, l, p, q, m;
  58.     int sum, curr_row_A, curr_row_B, curr_col_A, curr_col_B;
  59.     int size = A->size, ord = A->ord;
  60.  
  61.     C->ord = ord;
  62.     C->size = size;
  63.  
  64.     printf("calculating:");
  65.     p = 0;
  66.     q = 0;
  67.     m = 0;
  68.     for (i = 0; i < ord; i++) {
  69.         //printf(" i=%d\n", i);
  70.         for (j = 0; j < ord; j++) {
  71.             //printf("  j=%d\n", j);
  72.             sum = 0;
  73.             for (k = p; k < size; k++) {
  74.                 curr_row_A = i;
  75.                 curr_row_B = j;
  76.                 curr_col_A = A->col[k];
  77.                 if (A->row[k] == i) {
  78.                     for (l = q; l < size; l++) {
  79.                         curr_col_B = B->col[l];
  80.                         if (curr_col_A == curr_col_B && curr_row_B == B->row[l]) {
  81.                             sum += A->val[k] * B->val[l];
  82.                             break;
  83.                         }
  84.                     }
  85.                 }
  86.             }
  87.             if (0 != sum) {
  88.                 //printf("%d\n", sum);
  89.                 C->val[m] = sum;
  90.                 C->row[m] = i;
  91.                 C->col[m] = j;
  92.                 m++;
  93.             }
  94.         }
  95.     }
  96.     printf("done\n");
  97.     printf("Result: ord:%dx%d size:%d (%d)\n", ord, ord, m, ord*ord);
  98. }
  99.  
  100. int main()
  101. {
  102.     double single_thr_time, multi_thr_time, st0, st1, mt0, mt1;
  103.  
  104.     fill_matrix(&A);
  105.     fill_matrix(&B);
  106.  
  107.     st0 = clock();
  108.     multi(&A, &B, &C);
  109.     st1 = clock();
  110.     single_thr_time = st1 - st0;
  111.  
  112.     printf("\nsingle-thread time:%f\n", single_thr_time);
  113.  
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement