From 6c3ff5cd7ec67c415c6ae4b41bd45710b8228663 Mon Sep 17 00:00:00 2001 From: patataman Date: Wed, 14 Jun 2023 14:27:47 +0900 Subject: [PATCH] fix seg fault bc arrays were too big --- src/simulators/matrix_product_state/svd.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/simulators/matrix_product_state/svd.cpp b/src/simulators/matrix_product_state/svd.cpp index a71f2b5a05..746d72b278 100644 --- a/src/simulators/matrix_product_state/svd.cpp +++ b/src/simulators/matrix_product_state/svd.cpp @@ -576,6 +576,7 @@ void lapack_csvd_wrapper(cmatrix_t &A, cmatrix_t &U, rvector_t &S, cmatrix_t &V) #ifdef DEBUG cmatrix_t tempA = A; #endif + const size_t m = A.GetRows(), n = A.GetColumns(); const size_t min_dim = std::min(m, n); const size_t lda = std::max(m, n); @@ -589,25 +590,32 @@ void lapack_csvd_wrapper(cmatrix_t &A, cmatrix_t &U, rvector_t &S, cmatrix_t &V) *lapackV = V.move_to_buffer(); double lapackS[min_dim]; - complex_t work[lwork] = {0.0}; + complex_t work[lwork]; int info; if (strcmp(getenv("QISKIT_LAPACK_SVD"), "DC") == 0) { - int iwork[8*min_dim] = {0}; - double rwork[5*min_dim*min_dim+5*min_dim] = {0.0}; - lwork = -1; + int iwork[8*min_dim]; + int rwork_size = std::max( + 5*min_dim*min_dim + 5*min_dim, + 2*m*n + 2*min_dim*min_dim + min_dim); + double *rwork = (double*)calloc(rwork_size, sizeof(double)); + lwork = -1; zgesdd_( "A", &m, &n, lapackA, &m, lapackS, lapackU, &m, lapackV, &n, work, &lwork, rwork, iwork, &info); lwork = (int)work[0].real(); - complex_t work_[lwork] = {0.0}; + complex_t *work_= (complex_t*)calloc(lwork, sizeof(complex_t)); + zgesdd_( "A", &m, &n, lapackA, &m, lapackS, lapackU, &m, lapackV, &n, work_, &lwork, rwork, iwork, &info); + + free(rwork); + free(work_); } else { // Default execution follows original method double rwork[5*min_dim] = {0.0}; @@ -616,7 +624,6 @@ void lapack_csvd_wrapper(cmatrix_t &A, cmatrix_t &U, rvector_t &S, cmatrix_t &V) lapackU, &m, lapackV, &n, work, &lwork, rwork, &info); } - A = cmatrix_t::move_from_buffer(m, n, lapackA); U = cmatrix_t::move_from_buffer(m, m, lapackU); V = cmatrix_t::move_from_buffer(n, n, lapackV);