MAGMA  1.2.0
MatrixAlgebraonGPUandMulticoreArchitectures
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
testing_dgehrd.cpp
Go to the documentation of this file.
1 /*
2  -- MAGMA (version 1.2.0) --
3  Univ. of Tennessee, Knoxville
4  Univ. of California, Berkeley
5  Univ. of Colorado, Denver
6  May 2012
7 
8  @generated d Thu May 10 22:27:33 2012
9 
10 */
11 
12 // includes, system
13 #include <stdlib.h>
14 #include <stdio.h>
15 #include <string.h>
16 #include <math.h>
17 #include <cuda.h>
18 #include <cuda_runtime_api.h>
19 #include <cublas.h>
20 
21 // includes, project
22 #include "flops.h"
23 #include "magma.h"
24 #include "magma_lapack.h"
25 #include "testings.h"
26 
27 // Flops formula
28 #define PRECISION_d
29 #define CHECK_ERROR
30 #if defined(PRECISION_z) || defined(PRECISION_c)
31 #define FLOPS(n) ( 6. * FMULS_GEHRD(n) + 2. * FADDS_GEHRD(n))
32 #else
33 #define FLOPS(n) ( FMULS_GEHRD(n) + FADDS_GEHRD(n))
34 #endif
35 
36 /* ////////////////////////////////////////////////////////////////////////////
37  -- Testing dgehrd2
38 */
39 int main( int argc, char** argv)
40 {
42 
43  magma_timestr_t start, end;
44  double eps, flops, gpu_perf, cpu_perf;
45  double *h_A, *h_R, *h_Q, *h_work, *tau, *twork, *dT;
46  double *rwork;
47  double result[2] = {0., 0.};
48 
49  /* Matrix size */
50  int N=0, n2, lda, nb, lwork, ltwork, once = 0;
51  int size[10] = {1024,2048,3072,4032,5184,6016,7040,8064,9088,10112};
52 
53  int i, info, checkres;
54  int ione = 1;
55  int ISEED[4] = {0,0,0,1};
56 
57  if (argc != 1){
58  for(i = 1; i<argc; i++){
59  if (strcmp("-N", argv[i])==0)
60  N = atoi(argv[++i]);
61  }
62  if ( N > 0 )
63  printf(" testing_dgehrd -N %d\n\n", N);
64  else
65  {
66  printf("\nUsage: \n");
67  printf(" testing_dgehrd -N %d\n\n", 1024);
68  exit(1);
69  }
70  }
71  else {
72  printf("\nUsage: \n");
73  printf(" testing_dgehrd -N %d\n\n", 1024);
74  N = size[9];
75  }
76 
77  checkres = getenv("MAGMA_TESTINGS_CHECK") != NULL;
78 
79  eps = lapackf77_dlamch( "E" );
80  lda = N;
81  n2 = N*lda;
82  nb = magma_get_dgehrd_nb(N);
83  /* We suppose the magma nb is bigger than lapack nb */
84  lwork = N*nb;
85 
86  TESTING_MALLOC ( h_A , double, n2 );
87  TESTING_MALLOC ( tau , double, N );
88  TESTING_HOSTALLOC( h_R , double, n2 );
89  TESTING_HOSTALLOC( h_work, double, lwork );
90  TESTING_DEVALLOC ( dT , double, nb*N );
91 
92  /* To avoid uninitialized variable warning */
93  h_Q = NULL;
94  twork = NULL;
95  rwork = NULL;
96 
97  if ( checkres ) {
98  ltwork = 2*(N*N);
99  TESTING_HOSTALLOC( h_Q, double, lda*N );
100  TESTING_MALLOC( twork, double, ltwork );
101 #if defined(PRECISION_z) || defined(PRECISION_c)
102  TESTING_MALLOC( rwork, double, N );
103 #endif
104  }
105 
106  printf("\n\n");
107  printf(" N CPU GFlop/s GPU GFlop/s |A-QHQ'|/N|A| |I-QQ'|/N \n");
108  printf("=============================================================\n");
109  for(i=0; i<10; i++){
110  if ( !once ) {
111  N = size[i];
112  }
113  lda = N;
114  n2 = lda*N;
115  flops = FLOPS( (double)N ) / 1e6;
116 
117  /* Initialize the matrices */
118  lapackf77_dlarnv( &ione, ISEED, &n2, h_A );
119  lapackf77_dlacpy( MagmaUpperLowerStr, &N, &N, h_A, &lda, h_R, &lda );
120 
121  /* ====================================================================
122  Performs operation using MAGMA
123  =================================================================== */
124  start = get_current_time();
125  magma_dgehrd ( N, ione, N, h_R, lda, tau, h_work, lwork, dT, &info);
126  end = get_current_time();
127  if ( info < 0 )
128  printf("Argument %d of magma_dgehrd had an illegal value\n", -info);
129 
130  gpu_perf = flops / GetTimerValue(start,end);
131 
132  /* =====================================================================
133  Check the factorization
134  =================================================================== */
135  if ( checkres ) {
136 
137  lapackf77_dlacpy(MagmaUpperLowerStr, &N, &N, h_R, &lda, h_Q, &lda);
138  {
139  int i, j;
140  for(j=0; j<N-1; j++)
141  for(i=j+2; i<lda; i++)
142  h_R[i+j*lda] = MAGMA_D_ZERO;
143  }
144 
145  nb = magma_get_dgehrd_nb(N);
146  magma_dorghr(N, ione, N, h_Q, lda, tau, dT, nb, &info);
147 #if defined(PRECISION_z) || defined(PRECISION_c)
148  lapackf77_dhst01(&N, &ione, &N,
149  h_A, &lda, h_R, &lda,
150  h_Q, &lda, twork, &ltwork, rwork, result);
151 #else
152  lapackf77_dhst01(&N, &ione, &N,
153  h_A, &lda, h_R, &lda,
154  h_Q, &lda, twork, &ltwork, result);
155 #endif
156  }
157 
158  /* =====================================================================
159  Performs operation using LAPACK
160  =================================================================== */
161  start = get_current_time();
162  lapackf77_dgehrd(&N, &ione, &N, h_R, &lda, tau, h_work, &lwork, &info);
163  end = get_current_time();
164  if (info < 0)
165  printf("Argument %d of lapack_dgehrd had an illegal value.\n", -info);
166 
167  cpu_perf = flops / GetTimerValue(start,end);
168 
169  /* =====================================================================
170  Print performance and error.
171  =================================================================== */
172  if ( checkres ) {
173  printf("%5d %6.2f %6.2f %e %e\n",
174  N, cpu_perf, gpu_perf,
175  result[0]*eps, result[1]*eps );
176  } else {
177  printf("%5d %6.2f %6.2f\n",
178  N, cpu_perf, gpu_perf );
179  }
180 
181  if ( once )
182  break;
183  }
184 
185  /* Memory clean up */
186  TESTING_FREE ( h_A );
187  TESTING_FREE ( tau );
188  TESTING_HOSTFREE( h_work);
189  TESTING_HOSTFREE( h_R );
190  TESTING_DEVFREE ( dT );
191 
192  if ( checkres ) {
193  TESTING_HOSTFREE( h_Q );
194  TESTING_FREE( twork );
195 #if defined(PRECISION_z) || defined(PRECISION_c)
196  TESTING_FREE( rwork );
197 #endif
198  }
199 
200  /* Shutdown */
202  return EXIT_SUCCESS;
203 }