Advertisement
gladilov-gleb

sqrm

Dec 18th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. static void sqrm(double *src, double *buffer, int size)
  2. {
  3.     memset(buffer, 0, size * size * sizeof(double));
  4.  
  5. #if defined(SEPARATED)
  6.     #pragma omp parallel for
  7.     for (int i = 0; i < size; i++)
  8.     for (int k = 0; k < size; k++)
  9.     for (int j = 0; j < size; j++)
  10.         buffer[i * size + j] += src[i * size + k] * src[k * size + j];
  11.  
  12.     #pragma omp parallel for
  13.     for (int i = 0; i < size; i++)
  14.     for (int j = 0; j < size; j++)
  15.         src[j * size + i] = buffer[i * size + j];
  16. #elif defined(BLOCK_ROW)
  17.     #pragma omp parallel for
  18.     for (int ib = 0; ib < size; ib += BLOCK_SIZE)
  19.     {
  20.         int ie = ib + BLOCK_SIZE;
  21.         if (size < ie)
  22.             ie = size;
  23.  
  24.         for (int jb = 0; jb < size; jb += BLOCK_SIZE)
  25.         {
  26.             int je = jb + BLOCK_SIZE;
  27.             if (size < je)
  28.                 je = size;
  29.  
  30.             for (int ii = ib; ii < ie;   ii++)
  31.             for (int kk = jb; kk < je;   kk++)
  32.             for (int jj =  0; jj < size; jj++)
  33.                 buffer[ii * size + jj] += src[ii * size + kk] * src[kk * size + jj];
  34.         }
  35.     }
  36.  
  37.     #pragma omp parallel for
  38.     for (int i = 0; i < size; i++)
  39.     for (int j = 0; j < size; j++)
  40.         src[j * size + i] = buffer[i * size + j];
  41. #elif defined(BLOCK_BLOCK)
  42.     #pragma omp parallel for
  43.     for (int ib = 0; ib < size; ib += BLOCK_SIZE)
  44.     {
  45.         int ie = ib + BLOCK_SIZE;
  46.         if (size < ie)
  47.             ie = size;
  48.  
  49.         for (int kb = 0; kb < size; kb += BLOCK_SIZE)
  50.         {
  51.             int ke = kb + BLOCK_SIZE;
  52.             if (size < ke)
  53.                 ke = size;
  54.  
  55.             for (int jb = 0; jb < size; jb += BLOCK_SIZE)
  56.             {
  57.                 int je = jb + BLOCK_SIZE;
  58.                 if (size < je)
  59.                     je = size;
  60.  
  61.                 for (int ii = ib; ii < ie; ii++)
  62.                 for (int kk = kb; kk < ke; kk++)
  63.                 for (int jj = jb; je < je; jj++)
  64.                     buffer[ii * size + jj] += src[ii * size + kk] * src[kk * size + jj];
  65.             }
  66.         }
  67.     }
  68.  
  69.     #pragma omp parallel for
  70.     for (int i = 0; i < size; i++)
  71.     for (int j = 0; j < size; j++)
  72.         src[j * size + i] = buffer[i * size + j];
  73. #endif
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement