Advertisement
Guest User

Untitled

a guest
Jul 19th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <omp.h>
  4.  
  5. void transpose(double *A, double *B, int n) {
  6.     int i,j;
  7.     for(i=0; i<n; i++) {
  8.         for(j=0; j<n; j++) {
  9.             B[j*n+i] = A[i*n+j];
  10.         }
  11.     }
  12. }
  13.  
  14. void gemm(double *A, double *B, double *C, int n)
  15. {  
  16.     int i, j, k;
  17.     for (i = 0; i < n; i++) {
  18.         for (j = 0; j < n; j++) {
  19.             double dot  = 0;
  20.             for (k = 0; k < n; k++) {
  21.                 dot += A[i*n+k]*B[k*n+j];
  22.             }
  23.             C[i*n+j ] = dot;
  24.         }
  25.     }
  26. }
  27.  
  28. void gemm_omp(double *A, double *B, double *C, int n)
  29. {  
  30.     #pragma omp parallel
  31.     {
  32.         int i, j, k;
  33.         #pragma omp for
  34.         for (i = 0; i < n; i++) {
  35.             for (j = 0; j < n; j++) {
  36.                 double dot  = 0;
  37.                 for (k = 0; k < n; k++) {
  38.                     dot += A[i*n+k]*B[k*n+j];
  39.                 }
  40.                 C[i*n+j ] = dot;
  41.             }
  42.         }
  43.  
  44.     }
  45. }
  46.  
  47. void gemmT(double *A, double *B, double *C, int n)
  48. {  
  49.     int i, j, k;
  50.     double *B2;
  51.     B2 = (double*)malloc(sizeof(double)*n*n);
  52.     transpose(B,B2, n);
  53.     for (i = 0; i < n; i++) {
  54.         for (j = 0; j < n; j++) {
  55.             double dot  = 0;
  56.             for (k = 0; k < n; k++) {
  57.                 dot += A[i*n+k]*B2[j*n+k];
  58.             }
  59.             C[i*n+j ] = dot;
  60.         }
  61.     }
  62.     free(B2);
  63. }
  64.  
  65. void gemmT_omp(double *A, double *B, double *C, int n)
  66. {  
  67.     double *B2;
  68.     B2 = (double*)malloc(sizeof(double)*n*n);
  69.     transpose(B,B2, n);
  70.     #pragma omp parallel
  71.     {
  72.         int i, j, k;
  73.         #pragma omp for
  74.         for (i = 0; i < n; i++) {
  75.             for (j = 0; j < n; j++) {
  76.                 double dot  = 0;
  77.                 for (k = 0; k < n; k++) {
  78.                     dot += A[i*n+k]*B2[j*n+k];
  79.                 }
  80.                 C[i*n+j ] = dot;
  81.             }
  82.         }
  83.  
  84.     }
  85.     free(B2);
  86. }
  87.  
  88. int main() {
  89.     int i, n;
  90.     double *A, *B, *C, dtime;
  91.  
  92.     n=8192;
  93.     A = (double*)malloc(sizeof(double)*n*n);
  94.     B = (double*)malloc(sizeof(double)*n*n);
  95.     C = (double*)malloc(sizeof(double)*n*n);
  96.     for(i=0; i<n*n; i++) { A[i] = rand()/RAND_MAX; B[i] = rand()/RAND_MAX;}
  97. /*
  98. //    dtime = omp_get_wtime();
  99. //    gemm(A,B,C, n);
  100. //    dtime = omp_get_wtime() - dtime;
  101. //    printf("%f\n", dtime);
  102. */
  103.     dtime = omp_get_wtime();
  104.     gemm_omp(A,B,C, n);
  105.     dtime = omp_get_wtime() - dtime;
  106.     printf("%f\n", dtime);
  107.  
  108. /*
  109. //    dtime = omp_get_wtime();
  110. //    gemmT(A,B,C, n);
  111. //    dtime = omp_get_wtime() - dtime;
  112. //    printf("%f\n", dtime);
  113. */
  114.     dtime = omp_get_wtime();
  115.     gemmT_omp(A,B,C, n);
  116.     dtime = omp_get_wtime() - dtime;
  117.     printf("%f\n", dtime);
  118.  
  119.     return 0;
  120.  
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement