00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include <stdio.h>
00050 #include "lapacke.h"
00051 #include "lapacke_utils.h"
00052 #include "test_utils.h"
00053
00054 static void init_scalars_dgebrd( lapack_int *m, lapack_int *n, lapack_int *lda,
00055 lapack_int *lwork );
00056 static void init_a( lapack_int size, double *a );
00057 static void init_d( lapack_int size, double *d );
00058 static void init_e( lapack_int size, double *e );
00059 static void init_tauq( lapack_int size, double *tauq );
00060 static void init_taup( lapack_int size, double *taup );
00061 static void init_work( lapack_int size, double *work );
00062 static int compare_dgebrd( double *a, double *a_i, double *d, double *d_i,
00063 double *e, double *e_i, double *tauq, double *tauq_i,
00064 double *taup, double *taup_i, lapack_int info,
00065 lapack_int info_i, lapack_int lda, lapack_int m,
00066 lapack_int n );
00067
00068 int main(void)
00069 {
00070
00071 lapack_int m, m_i;
00072 lapack_int n, n_i;
00073 lapack_int lda, lda_i;
00074 lapack_int lda_r;
00075 lapack_int lwork, lwork_i;
00076 lapack_int info, info_i;
00077 lapack_int i;
00078 int failed;
00079
00080
00081 double *a = NULL, *a_i = NULL;
00082 double *d = NULL, *d_i = NULL;
00083 double *e = NULL, *e_i = NULL;
00084 double *tauq = NULL, *tauq_i = NULL;
00085 double *taup = NULL, *taup_i = NULL;
00086 double *work = NULL, *work_i = NULL;
00087 double *a_save = NULL;
00088 double *d_save = NULL;
00089 double *e_save = NULL;
00090 double *tauq_save = NULL;
00091 double *taup_save = NULL;
00092 double *a_r = NULL;
00093
00094
00095 init_scalars_dgebrd( &m, &n, &lda, &lwork );
00096 lda_r = n+2;
00097 m_i = m;
00098 n_i = n;
00099 lda_i = lda;
00100 lwork_i = lwork;
00101
00102
00103 a = (double *)LAPACKE_malloc( lda*n * sizeof(double) );
00104 d = (double *)LAPACKE_malloc( MIN(m,n) * sizeof(double) );
00105 e = (double *)LAPACKE_malloc( ((MIN(m,n)-1)) * sizeof(double) );
00106 tauq = (double *)LAPACKE_malloc( MIN(m,n) * sizeof(double) );
00107 taup = (double *)LAPACKE_malloc( MIN(m,n) * sizeof(double) );
00108 work = (double *)LAPACKE_malloc( lwork * sizeof(double) );
00109
00110
00111 a_i = (double *)LAPACKE_malloc( lda*n * sizeof(double) );
00112 d_i = (double *)LAPACKE_malloc( MIN(m,n) * sizeof(double) );
00113 e_i = (double *)LAPACKE_malloc( ((MIN(m,n)-1)) * sizeof(double) );
00114 tauq_i = (double *)LAPACKE_malloc( MIN(m,n) * sizeof(double) );
00115 taup_i = (double *)LAPACKE_malloc( MIN(m,n) * sizeof(double) );
00116 work_i = (double *)LAPACKE_malloc( lwork * sizeof(double) );
00117
00118
00119 a_save = (double *)LAPACKE_malloc( lda*n * sizeof(double) );
00120 d_save = (double *)LAPACKE_malloc( MIN(m,n) * sizeof(double) );
00121 e_save = (double *)LAPACKE_malloc( ((MIN(m,n)-1)) * sizeof(double) );
00122 tauq_save = (double *)LAPACKE_malloc( MIN(m,n) * sizeof(double) );
00123 taup_save = (double *)LAPACKE_malloc( MIN(m,n) * sizeof(double) );
00124
00125
00126 a_r = (double *)LAPACKE_malloc( m*(n+2) * sizeof(double) );
00127
00128
00129 init_a( lda*n, a );
00130 init_d( (MIN(m,n)), d );
00131 init_e( (MIN(m,n)-1), e );
00132 init_tauq( (MIN(m,n)), tauq );
00133 init_taup( (MIN(m,n)), taup );
00134 init_work( lwork, work );
00135
00136
00137 for( i = 0; i < lda*n; i++ ) {
00138 a_save[i] = a[i];
00139 }
00140 for( i = 0; i < (MIN(m,n)); i++ ) {
00141 d_save[i] = d[i];
00142 }
00143 for( i = 0; i < (MIN(m,n)-1); i++ ) {
00144 e_save[i] = e[i];
00145 }
00146 for( i = 0; i < (MIN(m,n)); i++ ) {
00147 tauq_save[i] = tauq[i];
00148 }
00149 for( i = 0; i < (MIN(m,n)); i++ ) {
00150 taup_save[i] = taup[i];
00151 }
00152
00153
00154 dgebrd_( &m, &n, a, &lda, d, e, tauq, taup, work, &lwork, &info );
00155
00156
00157
00158 for( i = 0; i < lda*n; i++ ) {
00159 a_i[i] = a_save[i];
00160 }
00161 for( i = 0; i < (MIN(m,n)); i++ ) {
00162 d_i[i] = d_save[i];
00163 }
00164 for( i = 0; i < (MIN(m,n)-1); i++ ) {
00165 e_i[i] = e_save[i];
00166 }
00167 for( i = 0; i < (MIN(m,n)); i++ ) {
00168 tauq_i[i] = tauq_save[i];
00169 }
00170 for( i = 0; i < (MIN(m,n)); i++ ) {
00171 taup_i[i] = taup_save[i];
00172 }
00173 for( i = 0; i < lwork; i++ ) {
00174 work_i[i] = work[i];
00175 }
00176 info_i = LAPACKE_dgebrd_work( LAPACK_COL_MAJOR, m_i, n_i, a_i, lda_i, d_i,
00177 e_i, tauq_i, taup_i, work_i, lwork_i );
00178
00179 failed = compare_dgebrd( a, a_i, d, d_i, e, e_i, tauq, tauq_i, taup, taup_i,
00180 info, info_i, lda, m, n );
00181 if( failed == 0 ) {
00182 printf( "PASSED: column-major middle-level interface to dgebrd\n" );
00183 } else {
00184 printf( "FAILED: column-major middle-level interface to dgebrd\n" );
00185 }
00186
00187
00188
00189 for( i = 0; i < lda*n; i++ ) {
00190 a_i[i] = a_save[i];
00191 }
00192 for( i = 0; i < (MIN(m,n)); i++ ) {
00193 d_i[i] = d_save[i];
00194 }
00195 for( i = 0; i < (MIN(m,n)-1); i++ ) {
00196 e_i[i] = e_save[i];
00197 }
00198 for( i = 0; i < (MIN(m,n)); i++ ) {
00199 tauq_i[i] = tauq_save[i];
00200 }
00201 for( i = 0; i < (MIN(m,n)); i++ ) {
00202 taup_i[i] = taup_save[i];
00203 }
00204 for( i = 0; i < lwork; i++ ) {
00205 work_i[i] = work[i];
00206 }
00207 info_i = LAPACKE_dgebrd( LAPACK_COL_MAJOR, m_i, n_i, a_i, lda_i, d_i, e_i,
00208 tauq_i, taup_i );
00209
00210 failed = compare_dgebrd( a, a_i, d, d_i, e, e_i, tauq, tauq_i, taup, taup_i,
00211 info, info_i, lda, m, n );
00212 if( failed == 0 ) {
00213 printf( "PASSED: column-major high-level interface to dgebrd\n" );
00214 } else {
00215 printf( "FAILED: column-major high-level interface to dgebrd\n" );
00216 }
00217
00218
00219
00220 for( i = 0; i < lda*n; i++ ) {
00221 a_i[i] = a_save[i];
00222 }
00223 for( i = 0; i < (MIN(m,n)); i++ ) {
00224 d_i[i] = d_save[i];
00225 }
00226 for( i = 0; i < (MIN(m,n)-1); i++ ) {
00227 e_i[i] = e_save[i];
00228 }
00229 for( i = 0; i < (MIN(m,n)); i++ ) {
00230 tauq_i[i] = tauq_save[i];
00231 }
00232 for( i = 0; i < (MIN(m,n)); i++ ) {
00233 taup_i[i] = taup_save[i];
00234 }
00235 for( i = 0; i < lwork; i++ ) {
00236 work_i[i] = work[i];
00237 }
00238
00239 LAPACKE_dge_trans( LAPACK_COL_MAJOR, m, n, a_i, lda, a_r, n+2 );
00240 info_i = LAPACKE_dgebrd_work( LAPACK_ROW_MAJOR, m_i, n_i, a_r, lda_r, d_i,
00241 e_i, tauq_i, taup_i, work_i, lwork_i );
00242
00243 LAPACKE_dge_trans( LAPACK_ROW_MAJOR, m, n, a_r, n+2, a_i, lda );
00244
00245 failed = compare_dgebrd( a, a_i, d, d_i, e, e_i, tauq, tauq_i, taup, taup_i,
00246 info, info_i, lda, m, n );
00247 if( failed == 0 ) {
00248 printf( "PASSED: row-major middle-level interface to dgebrd\n" );
00249 } else {
00250 printf( "FAILED: row-major middle-level interface to dgebrd\n" );
00251 }
00252
00253
00254
00255 for( i = 0; i < lda*n; i++ ) {
00256 a_i[i] = a_save[i];
00257 }
00258 for( i = 0; i < (MIN(m,n)); i++ ) {
00259 d_i[i] = d_save[i];
00260 }
00261 for( i = 0; i < (MIN(m,n)-1); i++ ) {
00262 e_i[i] = e_save[i];
00263 }
00264 for( i = 0; i < (MIN(m,n)); i++ ) {
00265 tauq_i[i] = tauq_save[i];
00266 }
00267 for( i = 0; i < (MIN(m,n)); i++ ) {
00268 taup_i[i] = taup_save[i];
00269 }
00270 for( i = 0; i < lwork; i++ ) {
00271 work_i[i] = work[i];
00272 }
00273
00274
00275 LAPACKE_dge_trans( LAPACK_COL_MAJOR, m, n, a_i, lda, a_r, n+2 );
00276 info_i = LAPACKE_dgebrd( LAPACK_ROW_MAJOR, m_i, n_i, a_r, lda_r, d_i, e_i,
00277 tauq_i, taup_i );
00278
00279 LAPACKE_dge_trans( LAPACK_ROW_MAJOR, m, n, a_r, n+2, a_i, lda );
00280
00281 failed = compare_dgebrd( a, a_i, d, d_i, e, e_i, tauq, tauq_i, taup, taup_i,
00282 info, info_i, lda, m, n );
00283 if( failed == 0 ) {
00284 printf( "PASSED: row-major high-level interface to dgebrd\n" );
00285 } else {
00286 printf( "FAILED: row-major high-level interface to dgebrd\n" );
00287 }
00288
00289
00290 if( a != NULL ) {
00291 LAPACKE_free( a );
00292 }
00293 if( a_i != NULL ) {
00294 LAPACKE_free( a_i );
00295 }
00296 if( a_r != NULL ) {
00297 LAPACKE_free( a_r );
00298 }
00299 if( a_save != NULL ) {
00300 LAPACKE_free( a_save );
00301 }
00302 if( d != NULL ) {
00303 LAPACKE_free( d );
00304 }
00305 if( d_i != NULL ) {
00306 LAPACKE_free( d_i );
00307 }
00308 if( d_save != NULL ) {
00309 LAPACKE_free( d_save );
00310 }
00311 if( e != NULL ) {
00312 LAPACKE_free( e );
00313 }
00314 if( e_i != NULL ) {
00315 LAPACKE_free( e_i );
00316 }
00317 if( e_save != NULL ) {
00318 LAPACKE_free( e_save );
00319 }
00320 if( tauq != NULL ) {
00321 LAPACKE_free( tauq );
00322 }
00323 if( tauq_i != NULL ) {
00324 LAPACKE_free( tauq_i );
00325 }
00326 if( tauq_save != NULL ) {
00327 LAPACKE_free( tauq_save );
00328 }
00329 if( taup != NULL ) {
00330 LAPACKE_free( taup );
00331 }
00332 if( taup_i != NULL ) {
00333 LAPACKE_free( taup_i );
00334 }
00335 if( taup_save != NULL ) {
00336 LAPACKE_free( taup_save );
00337 }
00338 if( work != NULL ) {
00339 LAPACKE_free( work );
00340 }
00341 if( work_i != NULL ) {
00342 LAPACKE_free( work_i );
00343 }
00344
00345 return 0;
00346 }
00347
00348
00349 static void init_scalars_dgebrd( lapack_int *m, lapack_int *n, lapack_int *lda,
00350 lapack_int *lwork )
00351 {
00352 *m = 4;
00353 *n = 4;
00354 *lda = 8;
00355 *lwork = 1024;
00356
00357 return;
00358 }
00359
00360
00361 static void init_a( lapack_int size, double *a ) {
00362 lapack_int i;
00363 for( i = 0; i < size; i++ ) {
00364 a[i] = 0;
00365 }
00366 a[0] = 3.61767881382524030e+000;
00367 a[8] = -5.56599992322389660e-001;
00368 a[16] = 8.47366545721238150e-001;
00369 a[24] = 7.46003207826611560e-001;
00370 a[1] = 0.00000000000000000e+000;
00371 a[9] = -2.02807703220235600e+000;
00372 a[17] = 5.51387235002093750e-001;
00373 a[25] = 1.16996276895584920e+000;
00374 a[2] = 0.00000000000000000e+000;
00375 a[10] = 0.00000000000000000e+000;
00376 a[18] = 1.37446064122229530e+000;
00377 a[26] = -1.41047378105999590e+000;
00378 a[3] = 0.00000000000000000e+000;
00379 a[11] = 0.00000000000000000e+000;
00380 a[19] = 0.00000000000000000e+000;
00381 a[27] = -2.37552731958861860e+000;
00382 }
00383 static void init_d( lapack_int size, double *d ) {
00384 lapack_int i;
00385 for( i = 0; i < size; i++ ) {
00386 d[i] = 0;
00387 }
00388 }
00389 static void init_e( lapack_int size, double *e ) {
00390 lapack_int i;
00391 for( i = 0; i < size; i++ ) {
00392 e[i] = 0;
00393 }
00394 }
00395 static void init_tauq( lapack_int size, double *tauq ) {
00396 lapack_int i;
00397 for( i = 0; i < size; i++ ) {
00398 tauq[i] = 0;
00399 }
00400 }
00401 static void init_taup( lapack_int size, double *taup ) {
00402 lapack_int i;
00403 for( i = 0; i < size; i++ ) {
00404 taup[i] = 0;
00405 }
00406 }
00407 static void init_work( lapack_int size, double *work ) {
00408 lapack_int i;
00409 for( i = 0; i < size; i++ ) {
00410 work[i] = 0;
00411 }
00412 }
00413
00414
00415
00416 static int compare_dgebrd( double *a, double *a_i, double *d, double *d_i,
00417 double *e, double *e_i, double *tauq, double *tauq_i,
00418 double *taup, double *taup_i, lapack_int info,
00419 lapack_int info_i, lapack_int lda, lapack_int m,
00420 lapack_int n )
00421 {
00422 lapack_int i;
00423 int failed = 0;
00424 for( i = 0; i < lda*n; i++ ) {
00425 failed += compare_doubles(a[i],a_i[i]);
00426 }
00427 for( i = 0; i < (MIN(m,n)); i++ ) {
00428 failed += compare_doubles(d[i],d_i[i]);
00429 }
00430 for( i = 0; i < (MIN(m,n)-1); i++ ) {
00431 failed += compare_doubles(e[i],e_i[i]);
00432 }
00433 for( i = 0; i < (MIN(m,n)); i++ ) {
00434 failed += compare_doubles(tauq[i],tauq_i[i]);
00435 }
00436 for( i = 0; i < (MIN(m,n)); i++ ) {
00437 failed += compare_doubles(taup[i],taup_i[i]);
00438 }
00439 failed += (info == info_i) ? 0 : 1;
00440 if( info != 0 || info_i != 0 ) {
00441 printf( "info=%d, info_i=%d\n",(int)info,(int)info_i );
00442 }
00443
00444 return failed;
00445 }