MAGMA  1.2.0
MatrixAlgebraonGPUandMulticoreArchitectures
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
testing_cgelqf.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 c Thu May 10 22:27:28 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_c
29 #if defined(PRECISION_z) || defined(PRECISION_c)
30 #define FLOPS(m, n) ( 6.*FMULS_GELQF(m, n) + 2.*FADDS_GELQF(m, n) )
31 #else
32 #define FLOPS(m, n) ( FMULS_GELQF(m, n) + FADDS_GELQF(m, n) )
33 #endif
34 
35 /* ////////////////////////////////////////////////////////////////////////////
36  -- Testing cgelqf
37 */
38 int main( int argc, char** argv)
39 {
41 
42  magma_timestr_t start, end;
43  float flops, gpu_perf, cpu_perf;
44  float matnorm, work[1];
45  cuFloatComplex c_neg_one = MAGMA_C_NEG_ONE;
46  cuFloatComplex *h_A, *h_R, *tau, *h_work, tmp[1];
47 
48  /* Matrix size */
49  magma_int_t M = 0, N = 0, n2, lda, lwork;
50  magma_int_t size[10] = {1024,2048,3072,4032,5184,6016,7040,8064,9088,9984};
51 
52  magma_int_t i, info, min_mn, nb;
53  magma_int_t ione = 1;
54  magma_int_t ISEED[4] = {0,0,0,1};
55 
56  if (argc != 1){
57  for(i = 1; i<argc; i++){
58  if (strcmp("-N", argv[i])==0)
59  N = atoi(argv[++i]);
60  else if (strcmp("-M", argv[i])==0)
61  M = atoi(argv[++i]);
62  }
63  if ( M == 0 ) {
64  M = N;
65  }
66  if ( N == 0 ) {
67  N = M;
68  }
69  if (N>0 && M>0)
70  printf(" testing_cgelqf -M %d -N %d\n\n", M, N);
71  else
72  {
73  printf("\nUsage: \n");
74  printf(" testing_cgelqf -M %d -N %d\n\n", M, N);
75  exit(1);
76  }
77  }
78  else {
79  printf("\nUsage: \n");
80  printf(" testing_cgelqf -M %d -N %d\n\n", 1024, 1024);
81  M = N = size[9];
82  }
83 
84  n2 = M * N;
85  min_mn = min(M, N);
86  nb = magma_get_cgeqrf_nb(M);
87 
88  TESTING_MALLOC( tau, cuFloatComplex, min_mn );
89  TESTING_MALLOC( h_A, cuFloatComplex, n2 );
90  TESTING_HOSTALLOC( h_R, cuFloatComplex, n2 );
91 
92  lwork = -1;
93  lapackf77_cgelqf(&M, &N, h_A, &M, tau, tmp, &lwork, &info);
94  lwork = (magma_int_t)MAGMA_C_REAL( tmp[0] );
95  lwork = max( lwork, M*nb );
96 
97  TESTING_HOSTALLOC( h_work, cuFloatComplex, lwork );
98 
99  printf("\n\n");
100  printf(" M N CPU GFlop/s GPU GFlop/s ||R||_F / ||A||_F\n");
101  printf("==========================================================\n");
102  for(i=0; i<10; i++){
103  if (argc == 1){
104  M = N = size[i];
105  }
106  min_mn= min(M, N);
107  lda = M;
108  n2 = lda*N;
109  flops = FLOPS( (float)M, (float)N ) / 1000000;
110 
111  /* Initialize the matrix */
112  lapackf77_clarnv( &ione, ISEED, &n2, h_A );
113  lapackf77_clacpy( MagmaUpperLowerStr, &M, &N, h_A, &lda, h_R, &lda );
114 
115  /* ====================================================================
116  Performs operation using MAGMA
117  =================================================================== */
118  start = get_current_time();
119  magma_cgelqf( M, N, h_R, lda, tau, h_work, lwork, &info);
120  end = get_current_time();
121  if (info < 0)
122  printf("Argument %d of magma_cgelqf had an illegal value.\n", -info);
123 
124  gpu_perf = flops / GetTimerValue(start, end);
125 
126  /* =====================================================================
127  Performs operation using LAPACK
128  =================================================================== */
129  start = get_current_time();
130  lapackf77_cgelqf(&M, &N, h_A, &lda, tau, h_work, &lwork, &info);
131  end = get_current_time();
132  if (info < 0)
133  printf("Argument %d of lapack_cgelqf had an illegal value.\n", -info);
134 
135  cpu_perf = flops / GetTimerValue(start, end);
136 
137  /* =====================================================================
138  Check the result compared to LAPACK
139  =================================================================== */
140  matnorm = lapackf77_clange("f", &M, &N, h_A, &lda, work);
141  blasf77_caxpy(&n2, &c_neg_one, h_A, &ione, h_R, &ione);
142 
143  printf("%5d %5d %6.2f %6.2f %e\n",
144  M, N, cpu_perf, gpu_perf,
145  lapackf77_clange("f", &M, &N, h_R, &lda, work) / matnorm);
146 
147  if (argc != 1)
148  break;
149  }
150 
151  /* Memory clean up */
152  TESTING_FREE( tau );
153  TESTING_FREE( h_A );
154  TESTING_HOSTFREE( h_R );
155  TESTING_HOSTFREE( h_work );
156 
157  /* Shutdown */
159 }