From 6a50bacdffdce510df62b5c7d1702165d661ecb8 Mon Sep 17 00:00:00 2001 From: julie Date: Tue, 23 Feb 2016 05:39:23 +0000 Subject: [PATCH] APPLYING INTEL PATCHES sent to Julie on Feb 19th 2016 by Dima from INTEL (dmitry.g.baksheev@intel.com) [PATCH 27/42] Fix lapacke_?gesvdx* - NS is reference; VU, VL are real; ... - NS must be passed by ref - VU and VL shall be real, not integer - LWORK must be at least 1, even for N=0 - correct allocation of WORK, JOBU/JOBVT cannot be 'A' or 'S' - nrows/ncols = max(...,0), zero is possible, negatives are not fixup lapacke_?gesvdx --- LAPACKE/include/lapacke.h | 40 +++++++++++++++++++------------------- LAPACKE/src/lapacke_cgesvdx.c | 22 ++++++++++----------- LAPACKE/src/lapacke_cgesvdx_work.c | 40 ++++++++++++++++++++------------------ LAPACKE/src/lapacke_dgesvdx.c | 6 +++--- LAPACKE/src/lapacke_dgesvdx_work.c | 40 ++++++++++++++++++++------------------ LAPACKE/src/lapacke_sgesvdx.c | 6 +++--- LAPACKE/src/lapacke_sgesvdx_work.c | 40 ++++++++++++++++++++------------------ LAPACKE/src/lapacke_zgesvdx.c | 22 ++++++++++----------- LAPACKE/src/lapacke_zgesvdx_work.c | 40 ++++++++++++++++++++------------------ 9 files changed, 132 insertions(+), 124 deletions(-) diff --git a/LAPACKE/include/lapacke.h b/LAPACKE/include/lapacke.h index 03c3321..20f64d2 100644 --- a/LAPACKE/include/lapacke.h +++ b/LAPACKE/include/lapacke.h @@ -999,29 +999,29 @@ lapack_int LAPACKE_zgesvd( int matrix_layout, char jobu, char jobvt, lapack_int LAPACKE_sgesvdx( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, float* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, float vl, float vu, + lapack_int il, lapack_int iu, lapack_int* ns, float* s, float* u, lapack_int ldu, float* vt, lapack_int ldvt, lapack_int* superb ); lapack_int LAPACKE_dgesvdx( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, double* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, double vl, double vu, + lapack_int il, lapack_int iu, lapack_int* ns, double* s, double* u, lapack_int ldu, double* vt, lapack_int ldvt, lapack_int* superb ); lapack_int LAPACKE_cgesvdx( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_float* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, float vl, float vu, + lapack_int il, lapack_int iu, lapack_int* ns, float* s, lapack_complex_float* u, lapack_int ldu, lapack_complex_float* vt, lapack_int ldvt, lapack_int* superb ); lapack_int LAPACKE_zgesvdx( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_double* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, double vl, double vu, + lapack_int il, lapack_int iu, lapack_int* ns, double* s, lapack_complex_double* u, lapack_int ldu, lapack_complex_double* vt, lapack_int ldvt, lapack_int* superb ); @@ -5760,30 +5760,30 @@ lapack_int LAPACKE_zgesvd_work( int matrix_layout, char jobu, char jobvt, lapack_int LAPACKE_sgesvdx_work( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, float* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, float vl, float vu, + lapack_int il, lapack_int iu, lapack_int* ns, float* s, float* u, lapack_int ldu, float* vt, lapack_int ldvt, float* work, lapack_int lwork, lapack_int* iwork ); lapack_int LAPACKE_dgesvdx_work( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, double* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, double vl, double vu, + lapack_int il, lapack_int iu, lapack_int* ns, double* s, double* u, lapack_int ldu, double* vt, lapack_int ldvt, double* work, lapack_int lwork, lapack_int* iwork ); lapack_int LAPACKE_cgesvdx_work( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_float* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, float vl, float vu, + lapack_int il, lapack_int iu, lapack_int* ns, float* s, lapack_complex_float* u, lapack_int ldu, lapack_complex_float* vt, lapack_int ldvt, lapack_complex_float* work, lapack_int lwork, float* rwork, lapack_int* iwork ); lapack_int LAPACKE_zgesvdx_work( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_double* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, double vl, double vu, + lapack_int il, lapack_int iu, lapack_int* ns, double* s, lapack_complex_double* u, lapack_int ldu, lapack_complex_double* vt, lapack_int ldvt, lapack_complex_double* work, lapack_int lwork, @@ -16115,24 +16115,24 @@ void LAPACK_zgesvd( char* jobu, char* jobvt, lapack_int* m, lapack_int* n, lapack_complex_double* work, lapack_int* lwork, double* rwork, lapack_int *info ); void LAPACK_sgesvdx( char* jobu, char* jobvt, char* range, lapack_int* m, lapack_int* n, - float* a, lapack_int* lda, lapack_int* vl, lapack_int* vu, + float* a, lapack_int* lda, float* vl, float* vu, lapack_int* il, lapack_int* iu, lapack_int* ns, float* s, float* u, lapack_int* ldu, float* vt, lapack_int* ldvt, float* work, lapack_int* lwork, lapack_int *iwork, lapack_int *info ); void LAPACK_dgesvdx( char* jobu, char* jobvt, char* range, lapack_int* m, lapack_int* n, - double* a, lapack_int* lda, lapack_int* vl, lapack_int* vu, + double* a, lapack_int* lda, double* vl, double* vu, lapack_int* il, lapack_int* iu, lapack_int* ns, double* s, double* u, lapack_int* ldu, double* vt, lapack_int* ldvt, double* work, lapack_int* lwork, lapack_int *iwork, lapack_int *info ); void LAPACK_cgesvdx( char* jobu, char* jobvt, char* range, lapack_int* m, lapack_int* n, - lapack_complex_float* a, lapack_int* lda, lapack_int* vl, lapack_int* vu, + lapack_complex_float* a, lapack_int* lda, float* vl, float* vu, lapack_int* il, lapack_int* iu, lapack_int* ns, float* s, lapack_complex_float* u, lapack_int* ldu, lapack_complex_float* vt, lapack_int* ldvt, lapack_complex_float* work, lapack_int* lwork, float* rwork, lapack_int *iwork, lapack_int *info ); void LAPACK_zgesvdx( char* jobu, char* jobvt, char* range, lapack_int* m, lapack_int* n, - lapack_complex_double* a, lapack_int* lda, lapack_int* vl, lapack_int* vu, + lapack_complex_double* a, lapack_int* lda, double* vl, double* vu, lapack_int* il, lapack_int* iu, lapack_int* ns, double* s, lapack_complex_double* u, lapack_int* ldu, lapack_complex_double* vt, lapack_int* ldvt, diff --git a/LAPACKE/src/lapacke_cgesvdx.c b/LAPACKE/src/lapacke_cgesvdx.c index 56ee57f..de6f3df 100644 --- a/LAPACKE/src/lapacke_cgesvdx.c +++ b/LAPACKE/src/lapacke_cgesvdx.c @@ -35,8 +35,8 @@ lapack_int LAPACKE_cgesvdx( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_float* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, float vl, float vu, + lapack_int il, lapack_int iu, lapack_int* ns, float* s, lapack_complex_float* u, lapack_int ldu, lapack_complex_float* vt, lapack_int ldvt, lapack_int* superb ) @@ -44,9 +44,9 @@ lapack_int LAPACKE_cgesvdx( int matrix_layout, char jobu, char jobvt, char range lapack_int info = 0; lapack_int lwork = -1; lapack_complex_float* work = NULL; - lapack_complex_float work_query; + lapack_complex_float work_query; float* rwork = NULL; - lapack_int lrwork = MIN(m,n)*(MIN(m,n)*2+15*MIN(m,n)); + lapack_int lrwork = MAX(1, MIN(m,n)*(MIN(m,n)*2+15*MIN(m,n))); lapack_int* iwork = NULL; lapack_int i; if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) { @@ -68,18 +68,18 @@ lapack_int LAPACKE_cgesvdx( int matrix_layout, char jobu, char jobvt, char range } lwork = LAPACK_C2INT (work_query); /* Allocate memory for work arrays */ - rwork = (float*)LAPACKE_malloc( sizeof(float) * lwork ); - if( work == NULL ) { - info = LAPACK_WORK_MEMORY_ERROR; - goto exit_level_0; - } work = (lapack_complex_float*) - LAPACKE_malloc( sizeof(lapack_complex_float) * lrwork ); + LAPACKE_malloc( sizeof(lapack_complex_float) * lwork ); if( work == NULL ) { info = LAPACK_WORK_MEMORY_ERROR; goto exit_level_1; } - iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * (12*MIN(m,n)) ); + rwork = (float*)LAPACKE_malloc( sizeof(float) * lrwork ); + if( rwork == NULL ) { + info = LAPACK_WORK_MEMORY_ERROR; + goto exit_level_0; + } + iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * MAX(1,(12*MIN(m,n))) ); if( iwork == NULL ) { info = LAPACK_WORK_MEMORY_ERROR; goto exit_level_2; diff --git a/LAPACKE/src/lapacke_cgesvdx_work.c b/LAPACKE/src/lapacke_cgesvdx_work.c index 614cdae..0fb278b 100644 --- a/LAPACKE/src/lapacke_cgesvdx_work.c +++ b/LAPACKE/src/lapacke_cgesvdx_work.c @@ -35,8 +35,8 @@ lapack_int LAPACKE_cgesvdx_work( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_float* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, float vl, float vu, + lapack_int il, lapack_int iu, lapack_int* ns, float* s, lapack_complex_float* u, lapack_int ldu, lapack_complex_float* vt, lapack_int ldvt, lapack_complex_float* work, lapack_int lwork, @@ -46,21 +46,23 @@ lapack_int LAPACKE_cgesvdx_work( int matrix_layout, char jobu, char jobvt, char if( matrix_layout == LAPACK_COL_MAJOR ) { /* Call LAPACK function and adjust info */ LAPACK_cgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda, &vl, &vu, - &il, &iu, &ns, s, u, &ldu, vt, &ldvt, + &il, &iu, ns, s, u, &ldu, vt, &ldvt, work, &lwork, rwork, iwork, &info ); if( info < 0 ) { info = info - 1; } } else if( matrix_layout == LAPACK_ROW_MAJOR ) { - lapack_int nrows_u = ( LAPACKE_lsame( jobu, 'a' ) || - LAPACKE_lsame( jobu, 's' ) ) ? m : 1; - lapack_int ncols_u = LAPACKE_lsame( jobu, 'a' ) ? m : - ( LAPACKE_lsame( jobu, 's' ) ? MIN(m,n) : 1); - lapack_int nrows_vt = LAPACKE_lsame( jobvt, 'a' ) ? n : - ( LAPACKE_lsame( jobvt, 's' ) ? MIN(m,n) : 1); + lapack_int nrows_u = LAPACKE_lsame( jobu, 'v' ) ? m : 0; + lapack_int ncols_u = LAPACKE_lsame( jobu, 'v' ) ? + ( LAPACKE_lsame( range, 'i' ) ? MAX(iu - il + 1, 0) : MIN(m,n)) : 0; + lapack_int nrows_vt = LAPACKE_lsame( jobvt, 'v' ) ? + ( LAPACKE_lsame( range, 'i' ) ? MAX(iu - il + 1, 0) : MIN(m,n)) : 0; + lapack_int ncols_vt = LAPACKE_lsame( jobvt, 'v' ) ? n : 0; + lapack_int lda_t = MAX(1,m); lapack_int ldu_t = MAX(1,nrows_u); lapack_int ldvt_t = MAX(1,nrows_vt); + lapack_complex_float* a_t = NULL; lapack_complex_float* u_t = NULL; lapack_complex_float* vt_t = NULL; @@ -75,7 +77,7 @@ lapack_int LAPACKE_cgesvdx_work( int matrix_layout, char jobu, char jobvt, char LAPACKE_xerbla( "LAPACKE_cgesvdx_work", info ); return info; } - if( ldvt < n ) { + if( ldvt < ncols_vt ) { info = -18; LAPACKE_xerbla( "LAPACKE_cgesvdx_work", info ); return info; @@ -83,7 +85,7 @@ lapack_int LAPACKE_cgesvdx_work( int matrix_layout, char jobu, char jobvt, char /* Query optimal working array(s) size if requested */ if( lwork == -1 ) { LAPACK_cgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda_t, &vl, &vu, - &il, &iu, &ns, s, u, &ldu_t, vt, + &il, &iu, ns, s, u, &ldu_t, vt, &ldvt_t, work, &lwork, rwork, iwork, &info ); return (info < 0) ? (info - 1) : info; } @@ -94,7 +96,7 @@ lapack_int LAPACKE_cgesvdx_work( int matrix_layout, char jobu, char jobvt, char info = LAPACK_TRANSPOSE_MEMORY_ERROR; goto exit_level_0; } - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { u_t = (lapack_complex_float*) LAPACKE_malloc( sizeof(lapack_complex_float) * ldu_t * MAX(1,ncols_u) ); if( u_t == NULL ) { @@ -102,7 +104,7 @@ lapack_int LAPACKE_cgesvdx_work( int matrix_layout, char jobu, char jobvt, char goto exit_level_1; } } - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { vt_t = (lapack_complex_float*) LAPACKE_malloc( sizeof(lapack_complex_float) * ldvt_t * MAX(1,n) ); if( vt_t == NULL ) { @@ -113,28 +115,28 @@ lapack_int LAPACKE_cgesvdx_work( int matrix_layout, char jobu, char jobvt, char /* Transpose input matrices */ LAPACKE_cge_trans( matrix_layout, m, n, a, lda, a_t, lda_t ); /* Call LAPACK function and adjust info */ - LAPACK_cgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda_t, &vl, &vu, - &il, &iu, &ns, s, u, &ldu_t, vt, + LAPACK_cgesvdx( &jobu, &jobvt, &range, &m, &n, a_t, &lda_t, &vl, &vu, + &il, &iu, ns, s, u_t, &ldu_t, vt_t, &ldvt_t, work, &lwork, rwork, iwork, &info ); if( info < 0 ) { info = info - 1; } /* Transpose output matrices */ LAPACKE_cge_trans( LAPACK_COL_MAJOR, m, n, a_t, lda_t, a, lda ); - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { LAPACKE_cge_trans( LAPACK_COL_MAJOR, nrows_u, ncols_u, u_t, ldu_t, u, ldu ); } - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { LAPACKE_cge_trans( LAPACK_COL_MAJOR, nrows_vt, n, vt_t, ldvt_t, vt, ldvt ); } /* Release memory and exit */ - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { LAPACKE_free( vt_t ); } exit_level_2: - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { LAPACKE_free( u_t ); } exit_level_1: diff --git a/LAPACKE/src/lapacke_dgesvdx.c b/LAPACKE/src/lapacke_dgesvdx.c index ec487ce..d04e49a 100644 --- a/LAPACKE/src/lapacke_dgesvdx.c +++ b/LAPACKE/src/lapacke_dgesvdx.c @@ -35,8 +35,8 @@ lapack_int LAPACKE_dgesvdx( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, double* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, double vl, double vu, + lapack_int il, lapack_int iu, lapack_int* ns, double* s, double* u, lapack_int ldu, double* vt, lapack_int ldvt, lapack_int* superb ) @@ -71,7 +71,7 @@ lapack_int LAPACKE_dgesvdx( int matrix_layout, char jobu, char jobvt, char range info = LAPACK_WORK_MEMORY_ERROR; goto exit_level_0; } - iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * (12*MIN(m,n)) ); + iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * MAX(1,(12*MIN(m,n))) ); if( iwork == NULL ) { info = LAPACK_WORK_MEMORY_ERROR; goto exit_level_1; diff --git a/LAPACKE/src/lapacke_dgesvdx_work.c b/LAPACKE/src/lapacke_dgesvdx_work.c index b334486..977f7e2 100644 --- a/LAPACKE/src/lapacke_dgesvdx_work.c +++ b/LAPACKE/src/lapacke_dgesvdx_work.c @@ -35,8 +35,8 @@ lapack_int LAPACKE_dgesvdx_work( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, double* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, double vl, double vu, + lapack_int il, lapack_int iu, lapack_int* ns, double* s, double* u, lapack_int ldu, double* vt, lapack_int ldvt, double* work, lapack_int lwork, lapack_int* iwork ) @@ -45,21 +45,23 @@ lapack_int LAPACKE_dgesvdx_work( int matrix_layout, char jobu, char jobvt, char if( matrix_layout == LAPACK_COL_MAJOR ) { /* Call LAPACK function and adjust info */ LAPACK_dgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda, &vl, &vu, - &il, &iu, &ns, s, u, &ldu, vt, &ldvt, + &il, &iu, ns, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info ); if( info < 0 ) { info = info - 1; } } else if( matrix_layout == LAPACK_ROW_MAJOR ) { - lapack_int nrows_u = ( LAPACKE_lsame( jobu, 'a' ) || - LAPACKE_lsame( jobu, 's' ) ) ? m : 1; - lapack_int ncols_u = LAPACKE_lsame( jobu, 'a' ) ? m : - ( LAPACKE_lsame( jobu, 's' ) ? MIN(m,n) : 1); - lapack_int nrows_vt = LAPACKE_lsame( jobvt, 'a' ) ? n : - ( LAPACKE_lsame( jobvt, 's' ) ? MIN(m,n) : 1); + lapack_int nrows_u = LAPACKE_lsame( jobu, 'v' ) ? m : 0; + lapack_int ncols_u = LAPACKE_lsame( jobu, 'v' ) ? + ( LAPACKE_lsame( range, 'i' ) ? MAX(iu - il + 1, 0) : MIN(m,n)) : 0; + lapack_int nrows_vt = LAPACKE_lsame( jobvt, 'v' ) ? + ( LAPACKE_lsame( range, 'i' ) ? MAX(iu - il + 1, 0) : MIN(m,n)) : 0; + lapack_int ncols_vt = LAPACKE_lsame( jobvt, 'v' ) ? n : 0; + lapack_int lda_t = MAX(1,m); lapack_int ldu_t = MAX(1,nrows_u); lapack_int ldvt_t = MAX(1,nrows_vt); + double* a_t = NULL; double* u_t = NULL; double* vt_t = NULL; @@ -74,7 +76,7 @@ lapack_int LAPACKE_dgesvdx_work( int matrix_layout, char jobu, char jobvt, char LAPACKE_xerbla( "LAPACKE_dgesvdx_work", info ); return info; } - if( ldvt < n ) { + if( ldvt < ncols_vt ) { info = -18; LAPACKE_xerbla( "LAPACKE_dgesvdx_work", info ); return info; @@ -82,7 +84,7 @@ lapack_int LAPACKE_dgesvdx_work( int matrix_layout, char jobu, char jobvt, char /* Query optimal working array(s) size if requested */ if( lwork == -1 ) { LAPACK_dgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda_t, &vl, &vu, - &il, &iu, &ns, s, u, &ldu_t, vt, + &il, &iu, ns, s, u, &ldu_t, vt, &ldvt_t, work, &lwork, iwork, &info ); return (info < 0) ? (info - 1) : info; } @@ -92,7 +94,7 @@ lapack_int LAPACKE_dgesvdx_work( int matrix_layout, char jobu, char jobvt, char info = LAPACK_TRANSPOSE_MEMORY_ERROR; goto exit_level_0; } - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { u_t = (double*) LAPACKE_malloc( sizeof(double) * ldu_t * MAX(1,ncols_u) ); if( u_t == NULL ) { @@ -100,7 +102,7 @@ lapack_int LAPACKE_dgesvdx_work( int matrix_layout, char jobu, char jobvt, char goto exit_level_1; } } - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { vt_t = (double*) LAPACKE_malloc( sizeof(double) * ldvt_t * MAX(1,n) ); if( vt_t == NULL ) { @@ -111,28 +113,28 @@ lapack_int LAPACKE_dgesvdx_work( int matrix_layout, char jobu, char jobvt, char /* Transpose input matrices */ LAPACKE_dge_trans( matrix_layout, m, n, a, lda, a_t, lda_t ); /* Call LAPACK function and adjust info */ - LAPACK_dgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda_t, &vl, &vu, - &il, &iu, &ns, s, u, &ldu_t, vt, + LAPACK_dgesvdx( &jobu, &jobvt, &range, &m, &n, a_t, &lda_t, &vl, &vu, + &il, &iu, ns, s, u_t, &ldu_t, vt_t, &ldvt_t, work, &lwork, iwork, &info ); if( info < 0 ) { info = info - 1; } /* Transpose output matrices */ LAPACKE_dge_trans( LAPACK_COL_MAJOR, m, n, a_t, lda_t, a, lda ); - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrows_u, ncols_u, u_t, ldu_t, u, ldu ); } - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { LAPACKE_dge_trans( LAPACK_COL_MAJOR, nrows_vt, n, vt_t, ldvt_t, vt, ldvt ); } /* Release memory and exit */ - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { LAPACKE_free( vt_t ); } exit_level_2: - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { LAPACKE_free( u_t ); } exit_level_1: diff --git a/LAPACKE/src/lapacke_sgesvdx.c b/LAPACKE/src/lapacke_sgesvdx.c index c5d727a..c7f545a 100644 --- a/LAPACKE/src/lapacke_sgesvdx.c +++ b/LAPACKE/src/lapacke_sgesvdx.c @@ -35,8 +35,8 @@ lapack_int LAPACKE_sgesvdx( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, float* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, float vl, float vu, + lapack_int il, lapack_int iu, lapack_int* ns, float* s, float* u, lapack_int ldu, float* vt, lapack_int ldvt, lapack_int* superb ) @@ -71,7 +71,7 @@ lapack_int LAPACKE_sgesvdx( int matrix_layout, char jobu, char jobvt, char range info = LAPACK_WORK_MEMORY_ERROR; goto exit_level_0; } - iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * (12*MIN(m,n)) ); + iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * MAX(1,(12*MIN(m,n))) ); if( iwork == NULL ) { info = LAPACK_WORK_MEMORY_ERROR; goto exit_level_1; diff --git a/LAPACKE/src/lapacke_sgesvdx_work.c b/LAPACKE/src/lapacke_sgesvdx_work.c index edab2d1..f151563 100644 --- a/LAPACKE/src/lapacke_sgesvdx_work.c +++ b/LAPACKE/src/lapacke_sgesvdx_work.c @@ -35,8 +35,8 @@ lapack_int LAPACKE_sgesvdx_work( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, float* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, float vl, float vu, + lapack_int il, lapack_int iu, lapack_int* ns, float* s, float* u, lapack_int ldu, float* vt, lapack_int ldvt, float* work, lapack_int lwork, lapack_int* iwork ) @@ -45,21 +45,23 @@ lapack_int LAPACKE_sgesvdx_work( int matrix_layout, char jobu, char jobvt, char if( matrix_layout == LAPACK_COL_MAJOR ) { /* Call LAPACK function and adjust info */ LAPACK_sgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda, &vl, &vu, - &il, &iu, &ns, s, u, &ldu, vt, &ldvt, + &il, &iu, ns, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info ); if( info < 0 ) { info = info - 1; } } else if( matrix_layout == LAPACK_ROW_MAJOR ) { - lapack_int nrows_u = ( LAPACKE_lsame( jobu, 'a' ) || - LAPACKE_lsame( jobu, 's' ) ) ? m : 1; - lapack_int ncols_u = LAPACKE_lsame( jobu, 'a' ) ? m : - ( LAPACKE_lsame( jobu, 's' ) ? MIN(m,n) : 1); - lapack_int nrows_vt = LAPACKE_lsame( jobvt, 'a' ) ? n : - ( LAPACKE_lsame( jobvt, 's' ) ? MIN(m,n) : 1); + lapack_int nrows_u = LAPACKE_lsame( jobu, 'v' ) ? m : 0; + lapack_int ncols_u = LAPACKE_lsame( jobu, 'v' ) ? + ( LAPACKE_lsame( range, 'i' ) ? MAX(iu - il + 1, 0) : MIN(m,n)) : 0; + lapack_int nrows_vt = LAPACKE_lsame( jobvt, 'v' ) ? + ( LAPACKE_lsame( range, 'i' ) ? MAX(iu - il + 1, 0) : MIN(m,n)) : 0; + lapack_int ncols_vt = LAPACKE_lsame( jobvt, 'v' ) ? n : 0; + lapack_int lda_t = MAX(1,m); lapack_int ldu_t = MAX(1,nrows_u); lapack_int ldvt_t = MAX(1,nrows_vt); + float* a_t = NULL; float* u_t = NULL; float* vt_t = NULL; @@ -74,7 +76,7 @@ lapack_int LAPACKE_sgesvdx_work( int matrix_layout, char jobu, char jobvt, char LAPACKE_xerbla( "LAPACKE_sgesvdx_work", info ); return info; } - if( ldvt < n ) { + if( ldvt < ncols_vt ) { info = -18; LAPACKE_xerbla( "LAPACKE_sgesvdx_work", info ); return info; @@ -82,7 +84,7 @@ lapack_int LAPACKE_sgesvdx_work( int matrix_layout, char jobu, char jobvt, char /* Query optimal working array(s) size if requested */ if( lwork == -1 ) { LAPACK_sgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda_t, &vl, &vu, - &il, &iu, &ns, s, u, &ldu_t, vt, + &il, &iu, ns, s, u, &ldu_t, vt, &ldvt_t, work, &lwork, iwork, &info ); return (info < 0) ? (info - 1) : info; } @@ -92,7 +94,7 @@ lapack_int LAPACKE_sgesvdx_work( int matrix_layout, char jobu, char jobvt, char info = LAPACK_TRANSPOSE_MEMORY_ERROR; goto exit_level_0; } - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { u_t = (float*) LAPACKE_malloc( sizeof(float) * ldu_t * MAX(1,ncols_u) ); if( u_t == NULL ) { @@ -100,7 +102,7 @@ lapack_int LAPACKE_sgesvdx_work( int matrix_layout, char jobu, char jobvt, char goto exit_level_1; } } - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { vt_t = (float*) LAPACKE_malloc( sizeof(float) * ldvt_t * MAX(1,n) ); if( vt_t == NULL ) { @@ -111,28 +113,28 @@ lapack_int LAPACKE_sgesvdx_work( int matrix_layout, char jobu, char jobvt, char /* Transpose input matrices */ LAPACKE_sge_trans( matrix_layout, m, n, a, lda, a_t, lda_t ); /* Call LAPACK function and adjust info */ - LAPACK_sgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda_t, &vl, &vu, - &il, &iu, &ns, s, u, &ldu_t, vt, + LAPACK_sgesvdx( &jobu, &jobvt, &range, &m, &n, a_t, &lda_t, &vl, &vu, + &il, &iu, ns, s, u_t, &ldu_t, vt_t, &ldvt_t, work, &lwork, iwork, &info ); if( info < 0 ) { info = info - 1; } /* Transpose output matrices */ LAPACKE_sge_trans( LAPACK_COL_MAJOR, m, n, a_t, lda_t, a, lda ); - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { LAPACKE_sge_trans( LAPACK_COL_MAJOR, nrows_u, ncols_u, u_t, ldu_t, u, ldu ); } - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { LAPACKE_sge_trans( LAPACK_COL_MAJOR, nrows_vt, n, vt_t, ldvt_t, vt, ldvt ); } /* Release memory and exit */ - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { LAPACKE_free( vt_t ); } exit_level_2: - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { LAPACKE_free( u_t ); } exit_level_1: diff --git a/LAPACKE/src/lapacke_zgesvdx.c b/LAPACKE/src/lapacke_zgesvdx.c index c2635da..d2c42c3 100644 --- a/LAPACKE/src/lapacke_zgesvdx.c +++ b/LAPACKE/src/lapacke_zgesvdx.c @@ -35,8 +35,8 @@ lapack_int LAPACKE_zgesvdx( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_double* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, double vl, double vu, + lapack_int il, lapack_int iu, lapack_int* ns, double* s, lapack_complex_double* u, lapack_int ldu, lapack_complex_double* vt, lapack_int ldvt, lapack_int* superb ) @@ -44,9 +44,9 @@ lapack_int LAPACKE_zgesvdx( int matrix_layout, char jobu, char jobvt, char range lapack_int info = 0; lapack_int lwork = -1; lapack_complex_double* work = NULL; - lapack_complex_double work_query; + lapack_complex_double work_query; double* rwork = NULL; - lapack_int lrwork = MIN(m,n)*(MIN(m,n)*2+15*MIN(m,n)); + lapack_int lrwork = MAX(1,MIN(m,n)*(MIN(m,n)*2+15*MIN(m,n))); lapack_int* iwork = NULL; lapack_int i; if( matrix_layout != LAPACK_COL_MAJOR && matrix_layout != LAPACK_ROW_MAJOR ) { @@ -68,18 +68,18 @@ lapack_int LAPACKE_zgesvdx( int matrix_layout, char jobu, char jobvt, char range } lwork = LAPACK_Z2INT (work_query); /* Allocate memory for work arrays */ - rwork = (double*)LAPACKE_malloc( sizeof(double) * lwork ); - if( work == NULL ) { - info = LAPACK_WORK_MEMORY_ERROR; - goto exit_level_0; - } work = (lapack_complex_double*) - LAPACKE_malloc( sizeof(lapack_complex_double) * lrwork ); + LAPACKE_malloc( sizeof(lapack_complex_double) * lwork ); if( work == NULL ) { info = LAPACK_WORK_MEMORY_ERROR; goto exit_level_1; } - iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * (12*MIN(m,n)) ); + rwork = (double*)LAPACKE_malloc( sizeof(double) * lrwork ); + if( rwork == NULL ) { + info = LAPACK_WORK_MEMORY_ERROR; + goto exit_level_0; + } + iwork = (lapack_int*)LAPACKE_malloc( sizeof(lapack_int) * MAX(1,(12*MIN(m,n))) ); if( iwork == NULL ) { info = LAPACK_WORK_MEMORY_ERROR; goto exit_level_2; diff --git a/LAPACKE/src/lapacke_zgesvdx_work.c b/LAPACKE/src/lapacke_zgesvdx_work.c index 91b2016..9de0261 100644 --- a/LAPACKE/src/lapacke_zgesvdx_work.c +++ b/LAPACKE/src/lapacke_zgesvdx_work.c @@ -35,8 +35,8 @@ lapack_int LAPACKE_zgesvdx_work( int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_double* a, - lapack_int lda, lapack_int vl, lapack_int vu, - lapack_int il, lapack_int iu, lapack_int ns, + lapack_int lda, double vl, double vu, + lapack_int il, lapack_int iu, lapack_int* ns, double* s, lapack_complex_double* u, lapack_int ldu, lapack_complex_double* vt, lapack_int ldvt, lapack_complex_double* work, lapack_int lwork, @@ -46,21 +46,23 @@ lapack_int LAPACKE_zgesvdx_work( int matrix_layout, char jobu, char jobvt, char if( matrix_layout == LAPACK_COL_MAJOR ) { /* Call LAPACK function and adjust info */ LAPACK_zgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda, &vl, &vu, - &il, &iu, &ns, s, u, &ldu, vt, &ldvt, + &il, &iu, ns, s, u, &ldu, vt, &ldvt, work, &lwork, rwork, iwork, &info ); if( info < 0 ) { info = info - 1; } } else if( matrix_layout == LAPACK_ROW_MAJOR ) { - lapack_int nrows_u = ( LAPACKE_lsame( jobu, 'a' ) || - LAPACKE_lsame( jobu, 's' ) ) ? m : 1; - lapack_int ncols_u = LAPACKE_lsame( jobu, 'a' ) ? m : - ( LAPACKE_lsame( jobu, 's' ) ? MIN(m,n) : 1); - lapack_int nrows_vt = LAPACKE_lsame( jobvt, 'a' ) ? n : - ( LAPACKE_lsame( jobvt, 's' ) ? MIN(m,n) : 1); + lapack_int nrows_u = LAPACKE_lsame( jobu, 'v' ) ? m : 0; + lapack_int ncols_u = LAPACKE_lsame( jobu, 'v' ) ? + ( LAPACKE_lsame( range, 'i' ) ? MAX(iu - il + 1, 0) : MIN(m,n)) : 0; + lapack_int nrows_vt = LAPACKE_lsame( jobvt, 'v' ) ? + ( LAPACKE_lsame( range, 'i' ) ? MAX(iu - il + 1, 0) : MIN(m,n)) : 0; + lapack_int ncols_vt = LAPACKE_lsame( jobvt, 'v' ) ? n : 0; + lapack_int lda_t = MAX(1,m); lapack_int ldu_t = MAX(1,nrows_u); lapack_int ldvt_t = MAX(1,nrows_vt); + lapack_complex_double* a_t = NULL; lapack_complex_double* u_t = NULL; lapack_complex_double* vt_t = NULL; @@ -75,7 +77,7 @@ lapack_int LAPACKE_zgesvdx_work( int matrix_layout, char jobu, char jobvt, char LAPACKE_xerbla( "LAPACKE_zgesvdx_work", info ); return info; } - if( ldvt < n ) { + if( ldvt < ncols_vt ) { info = -18; LAPACKE_xerbla( "LAPACKE_zgesvdx_work", info ); return info; @@ -83,7 +85,7 @@ lapack_int LAPACKE_zgesvdx_work( int matrix_layout, char jobu, char jobvt, char /* Query optimal working array(s) size if requested */ if( lwork == -1 ) { LAPACK_zgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda_t, &vl, &vu, - &il, &iu, &ns, s, u, &ldu_t, vt, + &il, &iu, ns, s, u, &ldu_t, vt, &ldvt_t, work, &lwork, rwork, iwork, &info ); return (info < 0) ? (info - 1) : info; } @@ -94,7 +96,7 @@ lapack_int LAPACKE_zgesvdx_work( int matrix_layout, char jobu, char jobvt, char info = LAPACK_TRANSPOSE_MEMORY_ERROR; goto exit_level_0; } - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { u_t = (lapack_complex_double*) LAPACKE_malloc( sizeof(lapack_complex_double) * ldu_t * MAX(1,ncols_u) ); if( u_t == NULL ) { @@ -102,7 +104,7 @@ lapack_int LAPACKE_zgesvdx_work( int matrix_layout, char jobu, char jobvt, char goto exit_level_1; } } - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { vt_t = (lapack_complex_double*) LAPACKE_malloc( sizeof(lapack_complex_double) * ldvt_t * MAX(1,n) ); if( vt_t == NULL ) { @@ -113,28 +115,28 @@ lapack_int LAPACKE_zgesvdx_work( int matrix_layout, char jobu, char jobvt, char /* Transpose input matrices */ LAPACKE_zge_trans( matrix_layout, m, n, a, lda, a_t, lda_t ); /* Call LAPACK function and adjust info */ - LAPACK_zgesvdx( &jobu, &jobvt, &range, &m, &n, a, &lda_t, &vl, &vu, - &il, &iu, &ns, s, u, &ldu_t, vt, + LAPACK_zgesvdx( &jobu, &jobvt, &range, &m, &n, a_t, &lda_t, &vl, &vu, + &il, &iu, ns, s, u_t, &ldu_t, vt_t, &ldvt_t, work, &lwork, rwork, iwork, &info ); if( info < 0 ) { info = info - 1; } /* Transpose output matrices */ LAPACKE_zge_trans( LAPACK_COL_MAJOR, m, n, a_t, lda_t, a, lda ); - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { LAPACKE_zge_trans( LAPACK_COL_MAJOR, nrows_u, ncols_u, u_t, ldu_t, u, ldu ); } - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { LAPACKE_zge_trans( LAPACK_COL_MAJOR, nrows_vt, n, vt_t, ldvt_t, vt, ldvt ); } /* Release memory and exit */ - if( LAPACKE_lsame( jobvt, 'a' ) || LAPACKE_lsame( jobvt, 's' ) ) { + if( LAPACKE_lsame( jobvt, 'v' ) ) { LAPACKE_free( vt_t ); } exit_level_2: - if( LAPACKE_lsame( jobu, 'a' ) || LAPACKE_lsame( jobu, 's' ) ) { + if( LAPACKE_lsame( jobu, 'v' ) ) { LAPACKE_free( u_t ); } exit_level_1: -- 2.7.4