Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.58 KB | None | 0 0
  1. void
  2. m_mult (double *a, double *b, double *c, int N, int M, int K)
  3. {
  4.   int i, j, k;
  5.   double s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15, s16;
  6.  
  7.   if (M == 0 || K == 0)
  8.     M = K = N;
  9.  
  10.   for (i = 0; i < N - 3; i += 4)
  11.     {
  12.       for (j = 0; j < K - 3; j += 4)
  13.         {
  14.           s01 = s02 = s03 = s04 = 0;
  15.           s05 = s06 = s07 = s08 = 0;
  16.           s09 = s10 = s11 = s12 = 0;
  17.           s13 = s14 = s15 = s16 = 0;
  18.           for (k = 0; k < M; k++)
  19.             {
  20.               s01 += a[(i + 0) * M + k] * b[k * K + j + 0];
  21.               s02 += a[(i + 0) * M + k] * b[k * K + j + 1];
  22.               s03 += a[(i + 0) * M + k] * b[k * K + j + 2];
  23.               s04 += a[(i + 0) * M + k] * b[k * K + j + 3];
  24.  
  25.               s05 += a[(i + 1) * M + k] * b[k * K + j + 0];
  26.               s06 += a[(i + 1) * M + k] * b[k * K + j + 1];
  27.               s07 += a[(i + 1) * M + k] * b[k * K + j + 2];
  28.               s08 += a[(i + 1) * M + k] * b[k * K + j + 3];
  29.  
  30.               s09 += a[(i + 2) * M + k] * b[k * K + j + 0];
  31.               s10 += a[(i + 2) * M + k] * b[k * K + j + 1];
  32.               s11 += a[(i + 2) * M + k] * b[k * K + j + 2];
  33.               s12 += a[(i + 2) * M + k] * b[k * K + j + 3];
  34.  
  35.               s13 += a[(i + 3) * M + k] * b[k * K + j + 0];
  36.               s14 += a[(i + 3) * M + k] * b[k * K + j + 1];
  37.               s15 += a[(i + 3) * M + k] * b[k * K + j + 2];
  38.               s16 += a[(i + 3) * M + k] * b[k * K + j + 3];
  39.             }
  40.           c[(i + 0) * K + j + 0] = s01;
  41.           c[(i + 0) * K + j + 1] = s02;
  42.           c[(i + 0) * K + j + 2] = s03;
  43.           c[(i + 0) * K + j + 3] = s04;
  44.  
  45.           c[(i + 1) * K + j + 0] = s05;
  46.           c[(i + 1) * K + j + 1] = s06;
  47.           c[(i + 1) * K + j + 2] = s07;
  48.           c[(i + 1) * K + j + 3] = s08;
  49.  
  50.           c[(i + 2) * K + j + 0] = s09;
  51.           c[(i + 2) * K + j + 1] = s10;
  52.           c[(i + 2) * K + j + 2] = s11;
  53.           c[(i + 2) * K + j + 3] = s12;
  54.  
  55.           c[(i + 3) * K + j + 0] = s13;
  56.           c[(i + 3) * K + j + 1] = s14;
  57.           c[(i + 3) * K + j + 2] = s15;
  58.           c[(i + 3) * K + j + 3] = s16;
  59.         }
  60.     }
  61.  
  62.   for (; i < N; i++)
  63.     {
  64.       for (j = 0; j < K - 3; j += 4)
  65.         {
  66.           s01 = s02 = s03 = s04 = 0;
  67.           for (k = 0; k < M; k++)
  68.             {
  69.               s01 += a[(i + 0) * M + k] * b[k * K + j + 0];
  70.               s02 += a[(i + 0) * M + k] * b[k * K + j + 1];
  71.               s03 += a[(i + 0) * M + k] * b[k * K + j + 2];
  72.               s04 += a[(i + 0) * M + k] * b[k * K + j + 3];
  73.             }
  74.           c[(i + 0) * K + j + 0] = s01;
  75.           c[(i + 0) * K + j + 1] = s02;
  76.           c[(i + 0) * K + j + 2] = s03;
  77.           c[(i + 0) * K + j + 3] = s04;
  78.         }
  79.     }
  80.  
  81.   for (i = 0; i < N - 3; i += 4)
  82.     {
  83.       for (j = K - (K & 3); j < K; j++)
  84.         {
  85.           s01 = s05 = s09 = s13 = 0;
  86.           for (k = 0; k < M; k++)
  87.             {
  88.               s01 += a[(i + 0) * M + k] * b[k * K + j];
  89.               s05 += a[(i + 1) * M + k] * b[k * K + j];
  90.               s09 += a[(i + 2) * M + k] * b[k * K + j];
  91.               s13 += a[(i + 3) * M + k] * b[k * K + j];
  92.             }
  93.           c[(i + 0) * K + j] = s01;
  94.           c[(i + 1) * K + j] = s05;
  95.           c[(i + 2) * K + j] = s09;
  96.           c[(i + 3) * K + j] = s13;
  97.         }
  98.     }
  99.  
  100.   for (; i < N; i++)
  101.     {
  102.       for (j = K - (K & 3); j < K; j++)
  103.         {
  104.           s01 = 0;
  105.           for (k = 0; k < M; k++)
  106.             {
  107.               s01 += a[i * M + k] * b[k * K + j];
  108.             }
  109.           c[i * K + j] = s01;
  110.         }
  111.     }
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement