Guest User

lapack

a guest
May 13th, 2015
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.74 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "cpuidh.h"
  4.  
  5. void dgesv_(int *n, int *nrhs, double *a, int *lda, int *ipiv, double *b, int *ldb, int *info );
  6. void sgesv_(int *n, int *nrhs, float *a, int *lda, int *ipiv, float *b, int *ldb, int *info );
  7. int dgemm_(char *transa, char *transb, int *m, int *n,
  8.     int *k, double *alpha, double *a, int *lda,
  9.     double *b, int *ldb, double *beta, double *c,
  10.     int *ldc);
  11. int sgemm_(char *transa, char *transb, int *m, int *n,
  12.     int *k, float *alpha, float *a, int *lda,
  13.     float *b, int *ldb, float *beta, float *c,
  14.     int *ldc);
  15.  
  16. #ifdef DP
  17. #define REAL double
  18. #define xgesv dgesv_
  19. #define xgemm dgemm_
  20. #else
  21. #define REAL float
  22. #define xgesv sgesv_
  23. #define xgemm sgemm_
  24. #endif
  25.  
  26. #define N 200
  27. #define M (N + N/2)
  28. #define K (N - N/2)
  29. #define NN 2000
  30. #define LDAA 4000
  31. #define MOPS ((2.0*N*N*N/3.0 + 2.0*N*N)/1000000)
  32. #define LDA 200
  33. #define TIMES 1000
  34. #define PASS 5
  35.  
  36. void matgen (REAL a[], int lda, int n, REAL b[], REAL *norma)
  37. {
  38.         int init, i, j;
  39.  
  40.         init = 1325;
  41.         *norma = 0.0;
  42.         for (j = 0; j < n; j++) {
  43.                 for (i = 0; i < n; i++) {
  44.                         init = 3125*init % 65536;
  45.                         a[lda*j+i] = (init - 32768.0)/16384.0;                        
  46.                         *norma = (a[lda*j+i] > *norma) ? a[lda*j+i] : *norma;
  47.                        
  48.                         /* alternative for some compilers
  49.                         if (fabs(a[lda*j+i]) > *norma) *norma = fabs(a[lda*j+i]);
  50.                         */
  51.                 }
  52.         }
  53.         for (i = 0; i < n; i++) {
  54.           b[i] = 0.0;
  55.         }
  56.         for (j = 0; j < n; j++) {
  57.                 for (i = 0; i < n; i++) {
  58.                         b[i] = b[i] + a[lda*j+i];
  59.                 }
  60.         }
  61.         return;
  62. }
  63.  
  64. void rmatgen (REAL a[], int m, int n, REAL *norma)
  65. {
  66.         int init, i, j;
  67.  
  68.         init = 1325;
  69.         *norma = 0.0;
  70.         for (j = 0; j < m; j++) {
  71.                 for (i = 0; i < n; i++) {
  72.                         init = 3125*init % 65536;
  73.                         a[n*j+i] = (init - 32768.0)/16384.0;                        
  74.                         *norma = (a[n*j+i] > *norma) ? a[n*j+i] : *norma;
  75.                        
  76.                         /* alternative for some compilers
  77.                         if (fabs(a[lda*j+i]) > *norma) *norma = fabs(a[lda*j+i]);
  78.                         */
  79.                 }
  80.         }
  81.         return;
  82. }
  83.  
  84. int main (int argc, char * argv[])
  85. {
  86.     static REAL a[LDA * N], b[LDA], norma;
  87.     static int ipiv[N];
  88.     static REAL aa[LDAA * NN], bb[LDAA];
  89.     static int ipivx[NN];
  90.     static REAL mma[M * K], mmb[K * N], mmc[M * N];
  91.     int i, j, m, n, k, nrhs, ntimes, info, lda, ldb;
  92.     double gentime;
  93.     REAL alpha, beta;
  94.    
  95.     // TEST
  96.    
  97.     n = N;
  98.     lda = LDA;
  99.     ldb = LDA;
  100.     nrhs = 1;
  101.     matgen(a, LDA, N, b, &norma);
  102.     start_time();
  103.     xgesv(&n, &nrhs, a, &lda, ipiv, b, &ldb, &info);
  104.     end_time();
  105. #ifdef DP
  106.     printf ("DGESV returned %d (time %lf, %lf MFLOPS)\n", info, secs, MOPS/secs);
  107. #else
  108.     printf ("SGESV returned %d (time %lf, %lf MFLOPS)\n", info, secs, MOPS/secs);
  109. #endif
  110.     // matgen
  111.     printf ("matgen overhead calc\n");
  112.    
  113.     start_time();
  114.     for (i=0; i < TIMES * 10; i++)
  115.         matgen(a, LDA, N, b, &norma);
  116.     end_time();
  117.     gentime = secs/10;
  118.    
  119.     printf ("matgen time is %lf (%lf)\n", gentime/TIMES, gentime);
  120.    
  121.     // PASS passes
  122.    
  123.     for (i=0; i<PASS; i++)
  124.     {
  125.         start_time();
  126.         for (j=0; j< TIMES; j++){
  127.             matgen(a, LDA, N, b, &norma);
  128.             xgesv(&n, &nrhs, a, &lda, ipiv, b, &ldb, &info);
  129.         }
  130.         end_time();
  131.         printf ("n = %d, lda = %d, ldb = %d, nrhs = %d, info = %d\n", n, lda, ldb, nrhs, info);
  132.         printf ("%d. %d xGESV's took %lf sec, %lf MFLOPS\n",
  133.             i, TIMES, (secs-gentime), TIMES * MOPS/(secs - gentime));
  134.     }
  135.    
  136.     // FAT
  137.     matgen(aa, LDAA, NN, bb, &norma);
  138.     n = NN;
  139.     lda = ldb = LDAA;
  140.     start_time();
  141.     xgesv(&n, &nrhs, aa, &lda, ipivx, bb, &ldb, &info);
  142.     end_time();
  143.     printf ("n = %d, lda = %d, ldb = %d, nrhs = %d, info = %d\n", n, lda, ldb, nrhs, info);
  144.     printf ("This xGESV's took %lf sec, %lf MFLOPS\n", secs, TIMES * MOPS/secs);
  145.    
  146.     // xGEMM
  147.    
  148.     printf ("Timing rmatgen\n");
  149.     start_time();
  150.     for (i=0;i<TIMES*10;i++){
  151.         rmatgen(mma, M, K, &norma);
  152.         rmatgen(mmb, K, N, &norma);
  153.     }
  154.     end_time();
  155.     gentime = secs/10;
  156.     printf ("two TIMES rmatgen takes %lf sec\n", gentime);
  157.     alpha = 1.0;
  158.     beta = 1.0;
  159.     m = M;
  160.     n = N;
  161.     k = K;
  162.     for (i=0;i<PASS; i++){
  163.         start_time();
  164.         for (j=0;j<TIMES;j++) {
  165.             rmatgen(mma, M, K, &norma);
  166.             rmatgen(mmb, K, N, &norma);
  167.             xgemm("n", "n", &m, &n, &k, &alpha, mma, &m, mmb, &k, &beta, mmc, &m);
  168.         }
  169.         end_time();
  170.         printf ("%d. %d xGEMM's took %lf sec, %lf MFLOPS\n",
  171.             i, TIMES, (secs-gentime), TIMES * (M*N*K*2.0/1000000)/(secs - gentime));
  172.     }
  173.     return 0;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment