diff --git a/compute/CMakeLists.txt b/compute/CMakeLists.txt index 8d61cde9313c0a9207783c0dc6eb2a14363fef77..9dcc70224ccba1d5c1647b4169cdaafd15bbbae7 100644 --- a/compute/CMakeLists.txt +++ b/compute/CMakeLists.txt @@ -130,6 +130,7 @@ set(ZSRC pzunmlqrh.c pzunmqr.c pzunmqrrh.c + pztpgqrt.c pztpqrt.c ### zgels.c @@ -168,6 +169,7 @@ set(ZSRC zungqr.c zunmlq.c zunmqr.c + ztpgqrt.c ztpqrt.c ################## # MIXED PRECISION diff --git a/compute/pztpgqrt.c b/compute/pztpgqrt.c new file mode 100644 index 0000000000000000000000000000000000000000..723dbf369753f5e4e8287ff062a95ff97efc221b --- /dev/null +++ b/compute/pztpgqrt.c @@ -0,0 +1,106 @@ +/** + * + * @copyright (c) 2009-2016 The University of Tennessee and The University + * of Tennessee Research Foundation. + * All rights reserved. + * @copyright (c) 2012-2016 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, + * Univ. Bordeaux. All rights reserved. + * + **/ + +/** + * + * @file pztpgqrt.c + * + * MORSE computational routines + * MORSE is a software package provided by Univ. of Tennessee, + * Univ. of California Berkeley and Univ. of Colorado Denver + * + * @version 0.9.0 + * @author Mathieu Faverge + * @date 2016-12-15 + * @precisions normal z -> s d c + * + **/ +#include "control/common.h" + +#define V(m,n) V, m, n +#define T(m,n) T, m, n +#define A(m,n) A, m, n +#define B(m,n) B, m, n + +/***************************************************************************//** + * Parallel tile QR factorization - dynamic scheduling + **/ +void morse_pztpgqrt( int L, MORSE_desc_t *V, MORSE_desc_t *T, MORSE_desc_t *A, MORSE_desc_t *B, + MORSE_sequence_t *sequence, MORSE_request_t *request ) +{ + MORSE_context_t *morse; + MORSE_option_t options; + size_t ws_worker = 0; + size_t ws_host = 0; + + int k, m, n; + int ldak, ldvm, ldbm; + int tempkn, tempnn, tempmm, templm; + int ib; + + /* Dimension of the first column */ + int maxm = B->m - L; + int maxmt = (maxm % B->mb == 0) ? (maxm / B->mb) : (maxm / B->mb + 1); + int maxmtk; + + morse = morse_context_self(); + if (sequence->status != MORSE_SUCCESS) + return; + RUNTIME_options_init(&options, morse, sequence, request); + + ib = MORSE_IB; + + /* + * ztsmqr = A->nb * ib + */ + ws_worker = A->nb * ib; + + /* Allocation of temporary (scratch) working space */ +#if defined(CHAMELEON_USE_CUDA) + /* Worker space + * + * ztsmqr = 2 * A->nb * ib + */ + ws_worker = max( ws_worker, ib * A->nb * 2 ); +#endif + + ws_worker *= sizeof(MORSE_Complex64_t); + ws_host *= sizeof(MORSE_Complex64_t); + + RUNTIME_options_ws_alloc( &options, ws_worker, ws_host ); + + for (k = V->nt-1; k >= 0; k--) { + tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb; + ldak = BLKLDD(A, k); + + maxmtk = min( B->mt, maxmt+k ) - 1; + for (m = maxmtk; m > -1; m--) { + tempmm = m == B->mt-1 ? B->m-m*B->mb : B->mb; + templm = m == maxmtk ? tempmm : 0; + ldvm = BLKLDD(V, m); + ldbm = BLKLDD(B, m); + + for (n = k; n < B->nt; n++) { + tempnn = n == B->nt-1 ? B->n-n*B->nb : B->nb; + MORSE_TASK_ztpmqrt( + &options, + MorseLeft, MorseConjTrans, + tempmm, tempnn, tempkn, templm, ib, T->nb, + V(m, k), ldvm, + T(m, k), T->mb, + A(k, n), ldak, + B(m, n), ldbm ); + } + } + } + RUNTIME_options_ws_free(&options); + RUNTIME_options_finalize(&options, morse); + MORSE_TASK_dataflush_all(); +} diff --git a/compute/ztpgqrt.c b/compute/ztpgqrt.c new file mode 100644 index 0000000000000000000000000000000000000000..6a4ef6d7c68cf879e30bd14c55a18aecdc14b0ba --- /dev/null +++ b/compute/ztpgqrt.c @@ -0,0 +1,371 @@ +/** + * + * @copyright (c) 2009-2016 The University of Tennessee and The University + * of Tennessee Research Foundation. + * All rights reserved. + * @copyright (c) 2012-2016 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria, + * Univ. Bordeaux. All rights reserved. + * + **/ + +/** + * + * @file ztpgqrt.c + * + * MORSE computational routines + * MORSE is a software package provided by Univ. of Tennessee, + * Univ. of California Berkeley and Univ. of Colorado Denver + * + * @version 0.9.0 + * @author Mathieu Faverge + * @date 2016-12-15 + * @precisions normal z -> s d c + * + **/ +#include "control/common.h" + +/** + ****************************************************************************** + * + * @ingroup MORSE_Complex64_t + * + * MORSE_ztpgqrt - Generates a partial Q matrix formed with a blocked QR + * factorization of a "triangular-pentagonal" matrix C, which is composed of an + * unused triangular block and a pentagonal block V, using the compact + * representation for Q. See MORSE_ztpqrt() to generate V. + * + ******************************************************************************* + * + * @param[in] M + * The number of rows of the matrices B, and V. M >= 0. + * + * @param[in] N + * The number of columns of the matrices B, and A. N >= 0. + * + * @param[in] K + * The number of elementary reflectors whose product defines + * the matrix Q in the matrix V. + * + * @param[in] L + * The number of rows of the upper trapezoidal part of V. + * MIN(M,N) >= L >= 0. See Further Details. + * + * @param[in] V + * The i-th row must contain the vector which defines the + * elementary reflector H(i), for i = 1,2,...,k, as returned by + * MORSE_ztpqrt() in the first k rows of its array argument V. + * V is matrx of size M-by-K. The first M-L rows + * are rectangular, and the last L rows are upper trapezoidal. + * + * @param[in] LDV + * The leading dimension of the array V. LDV >= max(1,K). + * + * @param[int] descT + * On exit, auxiliary factorization data, required by MORSE_zgeqrs to + * solve the system of equations, or by any function to apply the Q. + * + * @param[in,out] A + * A is COMPLEX*16 array, dimension (LDA,N) + * On entry, the K-by-N matrix A. + * On exit, A is overwritten by the corresponding block of + * Q*A. See Further Details. + * + * @param[in] LDA + * The leading dimension of the array A. LDA >= max(1,K). + * + * @param[in,out] B + * On entry, the pentagonal M-by-N matrix B. + * On exit, B contains Q. + * + * @param[in] LDB + * The leading dimension of the array B. LDB >= max(1,M). + * + * @par Further Details: + * ===================== + * + * The input matrix Q is a (K+M)-by-N matrix + * + * Q = [ A ] + * [ B ] + * + * where A is an identity matrix, and B is a M-by-N matrix of 0. + * V a matrix of householder reflectors with a pentagonal shape consisting of a + * (M-L)-by-K rectangular matrix V1 on top of a L-by-N + * Upper trapezoidal matrix V2: + * + * V = [ V1 ] <- (M-L)-by-N rectangular + * [ V2 ] <- L-by-N upper trapezoidal. + * + * The upper trapezoidal matrix V2 consists of the first L rows of a + * K-by-K upper triangular matrix, where 0 <= L <= MIN(M,K). If L=0, + * V is rectangular M-by-K; if M=L=K, V is upper triangular. + * + ******************************************************************************* + * + * @return + * \retval MORSE_SUCCESS successful exit + * \retval <0 if -i, the i-th argument had an illegal value + * + ******************************************************************************* + * + * @sa MORSE_ztpgqrt_Tile + * @sa MORSE_ztpgqrt_Tile_Async + * @sa MORSE_ctpgqrt + * @sa MORSE_dtpgqrt + * @sa MORSE_stpgqrt + * @sa MORSE_zgeqrs + * + ******************************************************************************/ +int MORSE_ztpgqrt( int M, int N, int K, int L, + MORSE_Complex64_t *V, int LDV, + MORSE_desc_t *descT, + MORSE_Complex64_t *A, int LDA, + MORSE_Complex64_t *B, int LDB ) +{ + int NB; + int status; + MORSE_context_t *morse; + MORSE_sequence_t *sequence = NULL; + MORSE_request_t request = MORSE_REQUEST_INITIALIZER; + MORSE_desc_t descA, descB, descV; + int minMK = min( M, K ); + + morse = morse_context_self(); + if (morse == NULL) { + morse_fatal_error("MORSE_ztpgqrt", "MORSE not initialized"); + return MORSE_ERR_NOT_INITIALIZED; + } + + /* Check input arguments */ + if (M < 0) { + morse_error("MORSE_ztpgqrt", "illegal value of M"); + return -1; + } + if (N < 0) { + morse_error("MORSE_ztpgqrt", "illegal value of N"); + return -2; + } + if (K < 0) { + morse_error("MORSE_ztpgqrt", "illegal value of K"); + return -3; + } + if ((L < 0) || ((L > minMK) && (minMK > 0))) { + morse_error("MORSE_ztpgqrt", "illegal value of N"); + return -4; + } + if (LDV < max(1, M)) { + morse_error("MORSE_ztpgqrt", "illegal value of LDV"); + return -6; + } + if (LDA < max(1, K)) { + morse_error("MORSE_ztpgqrt", "illegal value of LDA"); + return -9; + } + if (LDB < max(1, M)) { + morse_error("MORSE_ztpgqrt", "illegal value of LDB"); + return -11; + } + + /* Quick return */ + if (minMK == 0) + return MORSE_SUCCESS; + + /* Tune NB & IB depending on M, N & NRHS; Set NBNBSIZE */ + status = morse_tune(MORSE_FUNC_ZGELS, M, K, 0); + if (status != MORSE_SUCCESS) { + morse_error("MORSE_ztpgqrt", "morse_tune() failed"); + return status; + } + + /* Set NT */ + NB = MORSE_NB; + + morse_sequence_create(morse, &sequence); + +/* if ( MORSE_TRANSLATION == MORSE_OUTOFPLACE ) {*/ + morse_zooplap2tile( descV, V, NB, NB, LDB, K, 0, 0, M, K, sequence, &request, + morse_desc_mat_free(&(descV)) ); + morse_zooplap2tile( descA, A, NB, NB, LDA, N, 0, 0, K, N, sequence, &request, + (morse_desc_mat_free(&(descV)), + morse_desc_mat_free(&(descA))) ); + morse_zooplap2tile( descB, B, NB, NB, LDB, N, 0, 0, M, N, sequence, &request, + (morse_desc_mat_free(&(descV)), + morse_desc_mat_free(&(descA)), + morse_desc_mat_free(&(descB))) ); +/* } else {*/ +/* morse_ziplap2tile( descA, A, NB, NB, LDA, N, 0, 0, M, N,*/ +/* sequence, &request);*/ +/* }*/ + + /* Call the tile interface */ + MORSE_ztpgqrt_Tile_Async(L, &descV, descT, &descA, &descB, sequence, &request); + +/* if ( MORSE_TRANSLATION == MORSE_OUTOFPLACE ) {*/ + morse_zooptile2lap(descA, A, NB, NB, LDA, N, sequence, &request); + morse_zooptile2lap(descB, B, NB, NB, LDB, N, sequence, &request); + morse_sequence_wait(morse, sequence); + morse_desc_mat_free(&descV); + morse_desc_mat_free(&descA); + morse_desc_mat_free(&descB); +/* } else {*/ +/* morse_ziptile2lap( descV, V, NB, NB, LDV, K, sequence, &request);*/ +/* morse_ziptile2lap( descA, A, NB, NB, LDA, N, sequence, &request);*/ +/* morse_ziptile2lap( descB, B, NB, NB, LDB, N, sequence, &request);*/ +/* morse_sequence_wait(morse, sequence);*/ +/* }*/ + + status = sequence->status; + morse_sequence_destroy(morse, sequence); + return status; +} + +/** + ******************************************************************************* + * + * @ingroup MORSE_Complex64_t_Tile + * + * MORSE_ztpgqrt_Tile - Generates a partial Q matrix formed with a blocked QR + * factorization of a "triangular-pentagonal" matrix C, which is composed of an + * unused triangular block and a pentagonal block V, using the compact + * representation for Q. See MORSE_ztpqrt() to generate V. + * + ******************************************************************************* + * + * @param[in,out] A + * On entry, the M-by-N matrix A. + * On exit, the elements on and above the diagonal of the array contain the min(M,N)-by-N + * upper trapezoidal matrix R (R is upper triangular if M >= N); the elements below the + * diagonal represent the unitary matrix Q as a product of elementary reflectors stored + * by tiles. + * + * @param[out] T + * On exit, auxiliary factorization data, required by MORSE_zgeqrs to solve the system + * of equations. + * + ******************************************************************************* + * + * @return + * \retval MORSE_SUCCESS successful exit + * + ******************************************************************************* + * + * @sa MORSE_ztpgqrt + * @sa MORSE_ztpgqrt_Tile_Async + * @sa MORSE_ctpgqrt_Tile + * @sa MORSE_dtpgqrt_Tile + * @sa MORSE_stpgqrt_Tile + * @sa MORSE_zgeqrs_Tile + * + ******************************************************************************/ +int MORSE_ztpgqrt_Tile( int L, MORSE_desc_t *V, MORSE_desc_t *T, MORSE_desc_t *A, MORSE_desc_t *B ) +{ + MORSE_context_t *morse; + MORSE_sequence_t *sequence = NULL; + MORSE_request_t request = MORSE_REQUEST_INITIALIZER; + int status; + + morse = morse_context_self(); + if (morse == NULL) { + morse_fatal_error("MORSE_ztpgqrt_Tile", "MORSE not initialized"); + return MORSE_ERR_NOT_INITIALIZED; + } + morse_sequence_create(morse, &sequence); + MORSE_ztpgqrt_Tile_Async(L, V, T, A, B, sequence, &request); + morse_sequence_wait(morse, sequence); + RUNTIME_desc_getoncpu(A); + RUNTIME_desc_getoncpu(B); + + status = sequence->status; + morse_sequence_destroy(morse, sequence); + return status; +} + +/** + ******************************************************************************* + * + * @ingroup MORSE_Complex64_t_Tile_Async + * + * MORSE_ztpgqrt_Tile_Async - Generates a partial Q matrix formed with a blocked QR + * factorization of a "triangular-pentagonal" matrix C, which is composed of an + * unused triangular block and a pentagonal block V, using the compact + * representation for Q. See MORSE_ztpqrt() to generate V. + * + ******************************************************************************* + * + * @param[in] sequence + * Identifies the sequence of function calls that this call belongs to + * (for completion checks and exception handling purposes). + * + * @param[out] request + * Identifies this function call (for exception handling purposes). + * + ******************************************************************************* + * + * @sa MORSE_ztpgqrt + * @sa MORSE_ztpgqrt_Tile + * @sa MORSE_ctpgqrt_Tile_Async + * @sa MORSE_dtpgqrt_Tile_Async + * @sa MORSE_stpgqrt_Tile_Async + * @sa MORSE_zgeqrs_Tile_Async + * + ******************************************************************************/ +int MORSE_ztpgqrt_Tile_Async( int L, MORSE_desc_t *V, MORSE_desc_t *T, MORSE_desc_t *A, MORSE_desc_t *B, + MORSE_sequence_t *sequence, MORSE_request_t *request ) +{ + MORSE_context_t *morse; + + morse = morse_context_self(); + if (morse == NULL) { + morse_error("MORSE_ztpgqrt_Tile", "MORSE not initialized"); + return MORSE_ERR_NOT_INITIALIZED; + } + if (sequence == NULL) { + morse_fatal_error("MORSE_ztpgqrt_Tile", "NULL sequence"); + return MORSE_ERR_UNALLOCATED; + } + if (request == NULL) { + morse_fatal_error("MORSE_ztpgqrt_Tile", "NULL request"); + return MORSE_ERR_UNALLOCATED; + } + /* Check sequence status */ + if (sequence->status == MORSE_SUCCESS) + request->status = MORSE_SUCCESS; + else + return morse_request_fail(sequence, request, MORSE_ERR_SEQUENCE_FLUSHED); + + /* Check descriptors for correctness */ + if (morse_desc_check(V) != MORSE_SUCCESS) { + morse_error("MORSE_ztpgqrt_Tile", "invalid third descriptor"); + return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE); + } + if (morse_desc_check(T) != MORSE_SUCCESS) { + morse_error("MORSE_ztpgqrt_Tile", "invalid third descriptor"); + return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE); + } + if (morse_desc_check(A) != MORSE_SUCCESS) { + morse_error("MORSE_ztpgqrt_Tile", "invalid first descriptor"); + return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE); + } + if (morse_desc_check(B) != MORSE_SUCCESS) { + morse_error("MORSE_ztpgqrt_Tile", "invalid second descriptor"); + return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE); + } + /* Check input arguments */ + if (A->nb != A->mb) { + morse_error("MORSE_ztpgqrt_Tile", "only square tiles supported"); + return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE); + } + if (((B->m - L) % B->mb) != 0) { + morse_error("MORSE_ztpgqrt_Tile", "Triangular part must be aligned with tiles"); + return morse_request_fail(sequence, request, MORSE_ERR_ILLEGAL_VALUE); + } + + /* if (morse->householder == MORSE_FLAT_HOUSEHOLDER) { */ + morse_pztpgqrt(L, V, T, A, B, sequence, request); + /* } */ + /* else { */ + /* morse_pztpgqrtrh(A, T, MORSE_RHBLK, sequence, request); */ + /* } */ + + return MORSE_SUCCESS; +} diff --git a/control/compute_z.h b/control/compute_z.h index d99406b1474862f19a864f56fa8b8a5a78e63eb3..122120e48999160fafb1e01aef495670fe363dba 100644 --- a/control/compute_z.h +++ b/control/compute_z.h @@ -134,6 +134,7 @@ void morse_pzsyrk(MORSE_enum uplo, MORSE_enum trans, MORSE_Complex64_t alpha, MO void morse_pzsyr2k(MORSE_enum uplo, MORSE_enum trans, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_Complex64_t beta, MORSE_desc_t *C, MORSE_sequence_t *sequence, MORSE_request_t *request); void morse_pzsytrf(MORSE_enum uplo, MORSE_desc_t *A, MORSE_sequence_t *sequence, MORSE_request_t *request); void morse_pztile2band(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *descAB, MORSE_sequence_t *sequence, MORSE_request_t *request); +void morse_pztpgqrt( int L, MORSE_desc_t *V, MORSE_desc_t *T, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_sequence_t *sequence, MORSE_request_t *request ); void morse_pztpqrt( int L, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_desc_t *T, MORSE_sequence_t *sequence, MORSE_request_t *request ); void morse_pztradd(MORSE_enum uplo, MORSE_enum trans, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_Complex64_t beta, MORSE_desc_t *B, MORSE_sequence_t *sequence, MORSE_request_t *request); void morse_pztrmm(MORSE_enum side, MORSE_enum uplo, MORSE_enum transA, MORSE_enum diag, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_sequence_t *sequence, MORSE_request_t *request); diff --git a/include/morse_z.h b/include/morse_z.h index 07c81112acc974d522bc571d876e28152957aafc..2718a6bea1c82411a0c4c401821f0b5be940f90d 100644 --- a/include/morse_z.h +++ b/include/morse_z.h @@ -102,6 +102,7 @@ int MORSE_zsyrk(MORSE_enum uplo, MORSE_enum trans, int N, int K, MORSE_Complex64 int MORSE_zsyr2k(MORSE_enum uplo, MORSE_enum trans, int N, int K, MORSE_Complex64_t alpha, MORSE_Complex64_t *A, int LDA, MORSE_Complex64_t *B, int LDB, MORSE_Complex64_t beta, MORSE_Complex64_t *C, int LDC); int MORSE_zsysv(MORSE_enum uplo, int N, int NRHS, MORSE_Complex64_t *A, int LDA, MORSE_Complex64_t *B, int LDB); int MORSE_zsytrs(MORSE_enum uplo, int N, int NRHS, MORSE_Complex64_t *A, int LDA, MORSE_Complex64_t *B, int LDB); +int MORSE_ztpgqrt( int M, int N, int K, int L, MORSE_Complex64_t *V, int LDV, MORSE_desc_t *descT, MORSE_Complex64_t *A, int LDA, MORSE_Complex64_t *B, int LDB ); int MORSE_ztpqrt( int M, int N, int L, MORSE_Complex64_t *A, int LDA, MORSE_Complex64_t *B, int LDB, MORSE_desc_t *descT ); int MORSE_ztradd(MORSE_enum uplo, MORSE_enum trans, int M, int N, MORSE_Complex64_t alpha, MORSE_Complex64_t *A, int LDA, MORSE_Complex64_t beta, MORSE_Complex64_t *B, int LDB); int MORSE_ztrmm(MORSE_enum side, MORSE_enum uplo, MORSE_enum transA, MORSE_enum diag, int N, int NRHS, MORSE_Complex64_t alpha, MORSE_Complex64_t *A, int LDA, MORSE_Complex64_t *B, int LDB); @@ -180,6 +181,7 @@ int MORSE_zsyrk_Tile(MORSE_enum uplo, MORSE_enum trans, MORSE_Complex64_t alpha, int MORSE_zsyr2k_Tile(MORSE_enum uplo, MORSE_enum trans, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_Complex64_t beta, MORSE_desc_t *C); int MORSE_zsysv_Tile(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B); int MORSE_zsytrs_Tile(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B); +int MORSE_ztpgqrt_Tile( int L, MORSE_desc_t *V, MORSE_desc_t *T, MORSE_desc_t *A, MORSE_desc_t *B ); int MORSE_ztpqrt_Tile( int L, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_desc_t *T ); int MORSE_ztradd_Tile(MORSE_enum uplo, MORSE_enum trans, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_Complex64_t beta, MORSE_desc_t *B); int MORSE_ztrmm_Tile(MORSE_enum side, MORSE_enum uplo, MORSE_enum transA, MORSE_enum diag, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_desc_t *B); @@ -255,6 +257,7 @@ int MORSE_zsytrs_Tile_Async(MORSE_enum uplo, MORSE_desc_t *A, MORSE_desc_t *B, M int MORSE_zsymm_Tile_Async(MORSE_enum side, MORSE_enum uplo, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_Complex64_t beta, MORSE_desc_t *C, MORSE_sequence_t *sequence, MORSE_request_t *request); int MORSE_zsyrk_Tile_Async(MORSE_enum uplo, MORSE_enum trans, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_Complex64_t beta, MORSE_desc_t *C, MORSE_sequence_t *sequence, MORSE_request_t *request); int MORSE_zsyr2k_Tile_Async(MORSE_enum uplo, MORSE_enum trans, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_Complex64_t beta, MORSE_desc_t *C, MORSE_sequence_t *sequence, MORSE_request_t *request); +int MORSE_ztpgqrt_Tile_Async( int L, MORSE_desc_t *V, MORSE_desc_t *T, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_sequence_t *sequence, MORSE_request_t *request ); int MORSE_ztpqrt_Tile_Async( int L, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_desc_t *T, MORSE_sequence_t *sequence, MORSE_request_t *request ); int MORSE_ztradd_Tile_Async(MORSE_enum uplo, MORSE_enum trans, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_Complex64_t beta, MORSE_desc_t *B, MORSE_sequence_t *sequence, MORSE_request_t *request); int MORSE_ztrmm_Tile_Async(MORSE_enum side, MORSE_enum uplo, MORSE_enum transA, MORSE_enum diag, MORSE_Complex64_t alpha, MORSE_desc_t *A, MORSE_desc_t *B, MORSE_sequence_t *sequence, MORSE_request_t *request);