libflame  revision_anchor
Functions
bl1_trsv.c File Reference

(r)

Functions

void bl1_strsv (uplo1_t uplo, trans1_t trans, diag1_t diag, int m, float *a, int a_rs, int a_cs, float *x, int incx)
 
void bl1_dtrsv (uplo1_t uplo, trans1_t trans, diag1_t diag, int m, double *a, int a_rs, int a_cs, double *x, int incx)
 
void bl1_ctrsv (uplo1_t uplo, trans1_t trans, diag1_t diag, int m, scomplex *a, int a_rs, int a_cs, scomplex *x, int incx)
 
void bl1_ztrsv (uplo1_t uplo, trans1_t trans, diag1_t diag, int m, dcomplex *a, int a_rs, int a_cs, dcomplex *x, int incx)
 
void bl1_strsv_blas (uplo1_t uplo, trans1_t trans, diag1_t diag, int m, float *a, int lda, float *x, int incx)
 
void bl1_dtrsv_blas (uplo1_t uplo, trans1_t trans, diag1_t diag, int m, double *a, int lda, double *x, int incx)
 
void bl1_ctrsv_blas (uplo1_t uplo, trans1_t trans, diag1_t diag, int m, scomplex *a, int lda, scomplex *x, int incx)
 
void bl1_ztrsv_blas (uplo1_t uplo, trans1_t trans, diag1_t diag, int m, dcomplex *a, int lda, dcomplex *x, int incx)
 

Function Documentation

◆ bl1_ctrsv()

void bl1_ctrsv ( uplo1_t  uplo,
trans1_t  trans,
diag1_t  diag,
int  m,
scomplex a,
int  a_rs,
int  a_cs,
scomplex x,
int  incx 
)

References bl1_callocv(), bl1_ccopyv(), bl1_ccreate_contigmr(), bl1_cfree(), bl1_cfree_contigm(), bl1_ctrsv_blas(), bl1_is_conjnotrans(), bl1_is_row_storage(), bl1_zero_dim1(), and BLIS1_CONJUGATE.

Referenced by bl1_ctrsvsx(), FLA_Chol_l_opc_var1(), FLA_Chol_u_opc_var1(), FLA_Eig_gest_il_opc_var1(), FLA_Eig_gest_il_opc_var5(), FLA_Eig_gest_iu_opc_var1(), FLA_Eig_gest_iu_opc_var5(), FLA_Hess_UT_step_opc_var5(), FLA_LU_nopiv_opc_var1(), FLA_LU_nopiv_opc_var2(), FLA_LU_nopiv_opc_var3(), FLA_LU_piv_opc_var3(), FLA_Lyap_h_opc_var1(), FLA_Lyap_h_opc_var2(), FLA_Lyap_h_opc_var3(), FLA_Lyap_h_opc_var4(), FLA_Lyap_n_opc_var1(), FLA_Lyap_n_opc_var2(), FLA_Lyap_n_opc_var3(), FLA_Lyap_n_opc_var4(), FLA_Trinv_ln_opc_var2(), FLA_Trinv_ln_opc_var4(), FLA_Trinv_lu_opc_var2(), FLA_Trinv_lu_opc_var4(), FLA_Trinv_un_opc_var2(), FLA_Trinv_un_opc_var4(), FLA_Trinv_uu_opc_var2(), FLA_Trinv_uu_opc_var4(), and FLA_Trsv_external().

100 {
101  scomplex* a_save = a;
102  int a_rs_save = a_rs;
103  int a_cs_save = a_cs;
104  scomplex* x_conj;
105  int incx_conj;
106  int lda, inca;
107 
108  // Return early if possible.
109  if ( bl1_zero_dim1( m ) ) return;
110 
111  // If necessary, allocate, initialize, and use a temporary contiguous
112  // copy of the matrix rather than the original matrix.
113  bl1_ccreate_contigmr( uplo,
114  m,
115  m,
116  a_save, a_rs_save, a_cs_save,
117  &a, &a_rs, &a_cs );
118 
119  // Initialize with values assuming column-major storage.
120  lda = a_cs;
121  inca = a_rs;
122 
123  // If A is a row-major matrix, then we can use the underlying column-major
124  // BLAS implementation by fiddling with the parameters.
125  if ( bl1_is_row_storage( a_rs, a_cs ) )
126  {
127  bl1_swap_ints( lda, inca );
128  bl1_toggle_uplo( uplo );
129  bl1_toggle_trans( trans );
130  }
131 
132  // Initialize with values assuming that trans is not conjnotrans.
133  x_conj = x;
134  incx_conj = incx;
135 
136  // We want to handle the conjnotrans case, but without explicitly
137  // conjugating A. To do so, we leverage the fact that computing the
138  // product conj(A) * x is equivalent to computing conj( A * conj(x) ).
139  // Note: strictly speaking, we don't need to create a copy of x since
140  // the operation is simpler than, say, gemv. However, we create a copy
141  // anyway since in practice it performs better due to increased spatial
142  // locality.
143  if ( bl1_is_conjnotrans( trans ) )
144  {
145  x_conj = bl1_callocv( m );
146  incx_conj = 1;
147 
149  m,
150  x, incx,
151  x_conj, incx_conj );
152  }
153 
154  bl1_ctrsv_blas( uplo,
155  trans,
156  diag,
157  m,
158  a, lda,
159  x_conj, incx_conj );
160 
161  // Save the contents of and then free the temporary conjugated x vector.
162  if ( bl1_is_conjnotrans( trans ) )
163  {
165  m,
166  x_conj, incx_conj,
167  x, incx );
168 
169  bl1_cfree( x_conj );
170  }
171 
172  // Free the temporary contiguous matrix.
173  bl1_cfree_contigm( a_save, a_rs_save, a_cs_save,
174  &a, &a_rs, &a_cs );
175 }
void bl1_ccreate_contigmr(uplo1_t uplo, int m, int n, scomplex *a_save, int a_rs_save, int a_cs_save, scomplex **a, int *a_rs, int *a_cs)
Definition: bl1_create_contigmr.c:77
int bl1_is_conjnotrans(trans1_t trans)
Definition: bl1_is.c:25
Definition: blis_type_defs.h:82
int bl1_zero_dim1(int m)
Definition: bl1_is.c:113
int bl1_is_row_storage(int rs, int cs)
Definition: bl1_is.c:95
void bl1_ctrsv_blas(uplo1_t uplo, trans1_t trans, diag1_t diag, int m, scomplex *a, int lda, scomplex *x, int incx)
Definition: bl1_trsv.c:331
Definition: blis_type_defs.h:132
void bl1_cfree(scomplex *p)
Definition: bl1_free.c:40
scomplex * bl1_callocv(unsigned int n_elem)
Definition: bl1_allocv.c:40
void bl1_ccopyv(conj1_t conj, int m, scomplex *x, int incx, scomplex *y, int incy)
Definition: bl1_copyv.c:49
void bl1_cfree_contigm(scomplex *a_save, int a_rs_save, int a_cs_save, scomplex **a, int *a_rs, int *a_cs)
Definition: bl1_free_contigm.c:45

◆ bl1_ctrsv_blas()

void bl1_ctrsv_blas ( uplo1_t  uplo,
trans1_t  trans,
diag1_t  diag,
int  m,
scomplex a,
int  lda,
scomplex x,
int  incx 
)

References bl1_param_map_to_netlib_diag(), bl1_param_map_to_netlib_trans(), bl1_param_map_to_netlib_uplo(), cblas_ctrsv(), CblasColMajor, and F77_ctrsv().

Referenced by bl1_ctrsv().

332 {
333 #ifdef BLIS1_ENABLE_CBLAS_INTERFACES
334  enum CBLAS_ORDER cblas_order = CblasColMajor;
335  enum CBLAS_UPLO cblas_uplo;
336  enum CBLAS_TRANSPOSE cblas_trans;
337  enum CBLAS_DIAG cblas_diag;
338 
339  bl1_param_map_to_netlib_uplo( uplo, &cblas_uplo );
340  bl1_param_map_to_netlib_trans( trans, &cblas_trans );
341  bl1_param_map_to_netlib_diag( diag, &cblas_diag );
342 
343  cblas_ctrsv( cblas_order,
344  cblas_uplo,
345  cblas_trans,
346  cblas_diag,
347  m,
348  a, lda,
349  x, incx );
350 #else
351  char blas_uplo;
352  char blas_trans;
353  char blas_diag;
354 
355  bl1_param_map_to_netlib_uplo( uplo, &blas_uplo );
356  bl1_param_map_to_netlib_trans( trans, &blas_trans );
357  bl1_param_map_to_netlib_diag( diag, &blas_diag );
358 
359  F77_ctrsv( &blas_uplo,
360  &blas_trans,
361  &blas_diag,
362  &m,
363  a, &lda,
364  x, &incx );
365 #endif
366 }
CBLAS_ORDER
Definition: blis_prototypes_cblas.h:17
void F77_ctrsv(char *uplo, char *transa, char *diag, int *n, scomplex *a, int *lda, scomplex *y, int *incy)
CBLAS_DIAG
Definition: blis_prototypes_cblas.h:20
CBLAS_TRANSPOSE
Definition: blis_prototypes_cblas.h:18
void bl1_param_map_to_netlib_trans(trans1_t blis_trans, void *blas_trans)
Definition: bl1_param_map.c:15
void cblas_ctrsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *A, const int lda, void *X, const int incX)
CBLAS_UPLO
Definition: blis_prototypes_cblas.h:19
Definition: blis_prototypes_cblas.h:17
void bl1_param_map_to_netlib_uplo(uplo1_t blis_uplo, void *blas_uplo)
Definition: bl1_param_map.c:47
void bl1_param_map_to_netlib_diag(diag1_t blis_diag, void *blas_diag)
Definition: bl1_param_map.c:95

◆ bl1_dtrsv()

void bl1_dtrsv ( uplo1_t  uplo,
trans1_t  trans,
diag1_t  diag,
int  m,
double *  a,
int  a_rs,
int  a_cs,
double *  x,
int  incx 
)

References bl1_dcreate_contigmr(), bl1_dfree_contigm(), bl1_dtrsv_blas(), bl1_is_row_storage(), and bl1_zero_dim1().

Referenced by bl1_dtrsvsx(), FLA_Chol_l_opd_var1(), FLA_Chol_u_opd_var1(), FLA_Eig_gest_il_opd_var1(), FLA_Eig_gest_il_opd_var5(), FLA_Eig_gest_iu_opd_var1(), FLA_Eig_gest_iu_opd_var5(), FLA_Hess_UT_step_opd_var5(), FLA_LU_nopiv_opd_var1(), FLA_LU_nopiv_opd_var2(), FLA_LU_nopiv_opd_var3(), FLA_LU_piv_opd_var3(), FLA_Lyap_h_opd_var1(), FLA_Lyap_h_opd_var2(), FLA_Lyap_h_opd_var3(), FLA_Lyap_h_opd_var4(), FLA_Lyap_n_opd_var1(), FLA_Lyap_n_opd_var2(), FLA_Lyap_n_opd_var3(), FLA_Lyap_n_opd_var4(), FLA_Trinv_ln_opd_var2(), FLA_Trinv_ln_opd_var4(), FLA_Trinv_lu_opd_var2(), FLA_Trinv_lu_opd_var4(), FLA_Trinv_un_opd_var2(), FLA_Trinv_un_opd_var4(), FLA_Trinv_uu_opd_var2(), FLA_Trinv_uu_opd_var4(), and FLA_Trsv_external().

57 {
58  double* a_save = a;
59  int a_rs_save = a_rs;
60  int a_cs_save = a_cs;
61  int lda, inca;
62 
63  // Return early if possible.
64  if ( bl1_zero_dim1( m ) ) return;
65 
66  // If necessary, allocate, initialize, and use a temporary contiguous
67  // copy of the matrix rather than the original matrix.
69  m,
70  m,
71  a_save, a_rs_save, a_cs_save,
72  &a, &a_rs, &a_cs );
73 
74  // Initialize with values assuming column-major storage.
75  lda = a_cs;
76  inca = a_rs;
77 
78  // If A is a row-major matrix, then we can use the underlying column-major
79  // BLAS implementation by fiddling with the parameters.
80  if ( bl1_is_row_storage( a_rs, a_cs ) )
81  {
82  bl1_swap_ints( lda, inca );
83  bl1_toggle_uplo( uplo );
84  bl1_toggle_trans( trans );
85  }
86 
87  bl1_dtrsv_blas( uplo,
88  trans,
89  diag,
90  m,
91  a, lda,
92  x, incx );
93 
94  // Free the temporary contiguous matrix.
95  bl1_dfree_contigm( a_save, a_rs_save, a_cs_save,
96  &a, &a_rs, &a_cs );
97 }
void bl1_dtrsv_blas(uplo1_t uplo, trans1_t trans, diag1_t diag, int m, double *a, int lda, double *x, int incx)
Definition: bl1_trsv.c:294
int bl1_zero_dim1(int m)
Definition: bl1_is.c:113
int bl1_is_row_storage(int rs, int cs)
Definition: bl1_is.c:95
void bl1_dfree_contigm(double *a_save, int a_rs_save, int a_cs_save, double **a, int *a_rs, int *a_cs)
Definition: bl1_free_contigm.c:29
void bl1_dcreate_contigmr(uplo1_t uplo, int m, int n, double *a_save, int a_rs_save, int a_cs_save, double **a, int *a_rs, int *a_cs)
Definition: bl1_create_contigmr.c:45

◆ bl1_dtrsv_blas()

void bl1_dtrsv_blas ( uplo1_t  uplo,
trans1_t  trans,
diag1_t  diag,
int  m,
double *  a,
int  lda,
double *  x,
int  incx 
)

References bl1_param_map_to_netlib_diag(), bl1_param_map_to_netlib_trans(), bl1_param_map_to_netlib_uplo(), cblas_dtrsv(), CblasColMajor, and F77_dtrsv().

Referenced by bl1_dtrsv().

295 {
296 #ifdef BLIS1_ENABLE_CBLAS_INTERFACES
297  enum CBLAS_ORDER cblas_order = CblasColMajor;
298  enum CBLAS_UPLO cblas_uplo;
299  enum CBLAS_TRANSPOSE cblas_trans;
300  enum CBLAS_DIAG cblas_diag;
301 
302  bl1_param_map_to_netlib_uplo( uplo, &cblas_uplo );
303  bl1_param_map_to_netlib_trans( trans, &cblas_trans );
304  bl1_param_map_to_netlib_diag( diag, &cblas_diag );
305 
306  cblas_dtrsv( cblas_order,
307  cblas_uplo,
308  cblas_trans,
309  cblas_diag,
310  m,
311  a, lda,
312  x, incx );
313 #else
314  char blas_uplo;
315  char blas_trans;
316  char blas_diag;
317 
318  bl1_param_map_to_netlib_uplo( uplo, &blas_uplo );
319  bl1_param_map_to_netlib_trans( trans, &blas_trans );
320  bl1_param_map_to_netlib_diag( diag, &blas_diag );
321 
322  F77_dtrsv( &blas_uplo,
323  &blas_trans,
324  &blas_diag,
325  &m,
326  a, &lda,
327  x, &incx );
328 #endif
329 }
CBLAS_ORDER
Definition: blis_prototypes_cblas.h:17
CBLAS_DIAG
Definition: blis_prototypes_cblas.h:20
CBLAS_TRANSPOSE
Definition: blis_prototypes_cblas.h:18
void F77_dtrsv(char *uplo, char *transa, char *diag, int *n, double *a, int *lda, double *y, int *incy)
void bl1_param_map_to_netlib_trans(trans1_t blis_trans, void *blas_trans)
Definition: bl1_param_map.c:15
CBLAS_UPLO
Definition: blis_prototypes_cblas.h:19
Definition: blis_prototypes_cblas.h:17
void bl1_param_map_to_netlib_uplo(uplo1_t blis_uplo, void *blas_uplo)
Definition: bl1_param_map.c:47
void cblas_dtrsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const double *A, const int lda, double *X, const int incX)
void bl1_param_map_to_netlib_diag(diag1_t blis_diag, void *blas_diag)
Definition: bl1_param_map.c:95

◆ bl1_strsv()

void bl1_strsv ( uplo1_t  uplo,
trans1_t  trans,
diag1_t  diag,
int  m,
float *  a,
int  a_rs,
int  a_cs,
float *  x,
int  incx 
)

References bl1_is_row_storage(), bl1_screate_contigmr(), bl1_sfree_contigm(), bl1_strsv_blas(), and bl1_zero_dim1().

Referenced by bl1_strsvsx(), FLA_Chol_l_ops_var1(), FLA_Chol_u_ops_var1(), FLA_Eig_gest_il_ops_var1(), FLA_Eig_gest_il_ops_var5(), FLA_Eig_gest_iu_ops_var1(), FLA_Eig_gest_iu_ops_var5(), FLA_Hess_UT_step_ops_var5(), FLA_LU_nopiv_ops_var1(), FLA_LU_nopiv_ops_var2(), FLA_LU_nopiv_ops_var3(), FLA_LU_piv_ops_var3(), FLA_Lyap_h_ops_var1(), FLA_Lyap_h_ops_var2(), FLA_Lyap_h_ops_var3(), FLA_Lyap_h_ops_var4(), FLA_Lyap_n_ops_var1(), FLA_Lyap_n_ops_var2(), FLA_Lyap_n_ops_var3(), FLA_Lyap_n_ops_var4(), FLA_Trinv_ln_ops_var2(), FLA_Trinv_ln_ops_var4(), FLA_Trinv_lu_ops_var2(), FLA_Trinv_lu_ops_var4(), FLA_Trinv_un_ops_var2(), FLA_Trinv_un_ops_var4(), FLA_Trinv_uu_ops_var2(), FLA_Trinv_uu_ops_var4(), and FLA_Trsv_external().

14 {
15  float* a_save = a;
16  int a_rs_save = a_rs;
17  int a_cs_save = a_cs;
18  int lda, inca;
19 
20  // Return early if possible.
21  if ( bl1_zero_dim1( m ) ) return;
22 
23  // If necessary, allocate, initialize, and use a temporary contiguous
24  // copy of the matrix rather than the original matrix.
26  m,
27  m,
28  a_save, a_rs_save, a_cs_save,
29  &a, &a_rs, &a_cs );
30 
31  // Initialize with values assuming column-major storage.
32  lda = a_cs;
33  inca = a_rs;
34 
35  // If A is a row-major matrix, then we can use the underlying column-major
36  // BLAS implementation by fiddling with the parameters.
37  if ( bl1_is_row_storage( a_rs, a_cs ) )
38  {
39  bl1_swap_ints( lda, inca );
40  bl1_toggle_uplo( uplo );
41  bl1_toggle_trans( trans );
42  }
43 
44  bl1_strsv_blas( uplo,
45  trans,
46  diag,
47  m,
48  a, lda,
49  x, incx );
50 
51  // Free the temporary contiguous matrix.
52  bl1_sfree_contigm( a_save, a_rs_save, a_cs_save,
53  &a, &a_rs, &a_cs );
54 }
int bl1_zero_dim1(int m)
Definition: bl1_is.c:113
int bl1_is_row_storage(int rs, int cs)
Definition: bl1_is.c:95
void bl1_sfree_contigm(float *a_save, int a_rs_save, int a_cs_save, float **a, int *a_rs, int *a_cs)
Definition: bl1_free_contigm.c:13
void bl1_screate_contigmr(uplo1_t uplo, int m, int n, float *a_save, int a_rs_save, int a_cs_save, float **a, int *a_rs, int *a_cs)
Definition: bl1_create_contigmr.c:13
void bl1_strsv_blas(uplo1_t uplo, trans1_t trans, diag1_t diag, int m, float *a, int lda, float *x, int incx)
Definition: bl1_trsv.c:257

◆ bl1_strsv_blas()

void bl1_strsv_blas ( uplo1_t  uplo,
trans1_t  trans,
diag1_t  diag,
int  m,
float *  a,
int  lda,
float *  x,
int  incx 
)

References bl1_param_map_to_netlib_diag(), bl1_param_map_to_netlib_trans(), bl1_param_map_to_netlib_uplo(), cblas_strsv(), CblasColMajor, and F77_strsv().

Referenced by bl1_strsv().

258 {
259 #ifdef BLIS1_ENABLE_CBLAS_INTERFACES
260  enum CBLAS_ORDER cblas_order = CblasColMajor;
261  enum CBLAS_UPLO cblas_uplo;
262  enum CBLAS_TRANSPOSE cblas_trans;
263  enum CBLAS_DIAG cblas_diag;
264 
265  bl1_param_map_to_netlib_uplo( uplo, &cblas_uplo );
266  bl1_param_map_to_netlib_trans( trans, &cblas_trans );
267  bl1_param_map_to_netlib_diag( diag, &cblas_diag );
268 
269  cblas_strsv( cblas_order,
270  cblas_uplo,
271  cblas_trans,
272  cblas_diag,
273  m,
274  a, lda,
275  x, incx );
276 #else
277  char blas_uplo;
278  char blas_trans;
279  char blas_diag;
280 
281  bl1_param_map_to_netlib_uplo( uplo, &blas_uplo );
282  bl1_param_map_to_netlib_trans( trans, &blas_trans );
283  bl1_param_map_to_netlib_diag( diag, &blas_diag );
284 
285  F77_strsv( &blas_uplo,
286  &blas_trans,
287  &blas_diag,
288  &m,
289  a, &lda,
290  x, &incx );
291 #endif
292 }
CBLAS_ORDER
Definition: blis_prototypes_cblas.h:17
CBLAS_DIAG
Definition: blis_prototypes_cblas.h:20
CBLAS_TRANSPOSE
Definition: blis_prototypes_cblas.h:18
void F77_strsv(char *uplo, char *transa, char *diag, int *n, float *a, int *lda, float *y, int *incy)
void bl1_param_map_to_netlib_trans(trans1_t blis_trans, void *blas_trans)
Definition: bl1_param_map.c:15
CBLAS_UPLO
Definition: blis_prototypes_cblas.h:19
Definition: blis_prototypes_cblas.h:17
void bl1_param_map_to_netlib_uplo(uplo1_t blis_uplo, void *blas_uplo)
Definition: bl1_param_map.c:47
void cblas_strsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const float *A, const int lda, float *X, const int incX)
void bl1_param_map_to_netlib_diag(diag1_t blis_diag, void *blas_diag)
Definition: bl1_param_map.c:95

◆ bl1_ztrsv()

void bl1_ztrsv ( uplo1_t  uplo,
trans1_t  trans,
diag1_t  diag,
int  m,
dcomplex a,
int  a_rs,
int  a_cs,
dcomplex x,
int  incx 
)

References bl1_is_conjnotrans(), bl1_is_row_storage(), bl1_zallocv(), bl1_zcopyv(), bl1_zcreate_contigmr(), bl1_zero_dim1(), bl1_zfree(), bl1_zfree_contigm(), bl1_ztrsv_blas(), and BLIS1_CONJUGATE.

Referenced by bl1_ztrsvsx(), FLA_Chol_l_opz_var1(), FLA_Chol_u_opz_var1(), FLA_Eig_gest_il_opz_var1(), FLA_Eig_gest_il_opz_var5(), FLA_Eig_gest_iu_opz_var1(), FLA_Eig_gest_iu_opz_var5(), FLA_Hess_UT_step_opz_var5(), FLA_LU_nopiv_opz_var1(), FLA_LU_nopiv_opz_var2(), FLA_LU_nopiv_opz_var3(), FLA_LU_piv_opz_var3(), FLA_Lyap_h_opz_var1(), FLA_Lyap_h_opz_var2(), FLA_Lyap_h_opz_var3(), FLA_Lyap_h_opz_var4(), FLA_Lyap_n_opz_var1(), FLA_Lyap_n_opz_var2(), FLA_Lyap_n_opz_var3(), FLA_Lyap_n_opz_var4(), FLA_Trinv_ln_opz_var2(), FLA_Trinv_ln_opz_var4(), FLA_Trinv_lu_opz_var2(), FLA_Trinv_lu_opz_var4(), FLA_Trinv_un_opz_var2(), FLA_Trinv_un_opz_var4(), FLA_Trinv_uu_opz_var2(), FLA_Trinv_uu_opz_var4(), and FLA_Trsv_external().

178 {
179  dcomplex* a_save = a;
180  int a_rs_save = a_rs;
181  int a_cs_save = a_cs;
182  dcomplex* x_conj;
183  int incx_conj;
184  int lda, inca;
185 
186  // Return early if possible.
187  if ( bl1_zero_dim1( m ) ) return;
188 
189  // If necessary, allocate, initialize, and use a temporary contiguous
190  // copy of the matrix rather than the original matrix.
191  bl1_zcreate_contigmr( uplo,
192  m,
193  m,
194  a_save, a_rs_save, a_cs_save,
195  &a, &a_rs, &a_cs );
196 
197  // Initialize with values assuming column-major storage.
198  lda = a_cs;
199  inca = a_rs;
200 
201  // If A is a row-major matrix, then we can use the underlying column-major
202  // BLAS implementation by fiddling with the parameters.
203  if ( bl1_is_row_storage( a_rs, a_cs ) )
204  {
205  bl1_swap_ints( lda, inca );
206  bl1_toggle_uplo( uplo );
207  bl1_toggle_trans( trans );
208  }
209 
210  // Initialize with values assuming that trans is not conjnotrans.
211  x_conj = x;
212  incx_conj = incx;
213 
214  // We want to handle the conjnotrans case, but without explicitly
215  // conjugating A. To do so, we leverage the fact that computing the
216  // product conj(A) * x is equivalent to computing conj( A * conj(x) ).
217  // Note: strictly speaking, we don't need to create a copy of x since
218  // the operation is simpler than, say, gemv. However, we create a copy
219  // anyway since in practice it performs better due to increased spatial
220  // locality.
221  if ( bl1_is_conjnotrans( trans ) )
222  {
223  x_conj = bl1_zallocv( m );
224  incx_conj = 1;
225 
227  m,
228  x, incx,
229  x_conj, incx_conj );
230  }
231 
232  bl1_ztrsv_blas( uplo,
233  trans,
234  diag,
235  m,
236  a, lda,
237  x_conj, incx_conj );
238 
239  // Save the contents of and then free the temporary conjugated x vector.
240  if ( bl1_is_conjnotrans( trans ) )
241  {
243  m,
244  x_conj, incx_conj,
245  x, incx );
246 
247  bl1_zfree( x_conj );
248  }
249 
250  // Free the temporary contiguous matrix.
251  bl1_zfree_contigm( a_save, a_rs_save, a_cs_save,
252  &a, &a_rs, &a_cs );
253 }
void bl1_zcreate_contigmr(uplo1_t uplo, int m, int n, dcomplex *a_save, int a_rs_save, int a_cs_save, dcomplex **a, int *a_rs, int *a_cs)
Definition: bl1_create_contigmr.c:109
void bl1_zfree(dcomplex *p)
Definition: bl1_free.c:45
int bl1_is_conjnotrans(trans1_t trans)
Definition: bl1_is.c:25
Definition: blis_type_defs.h:82
int bl1_zero_dim1(int m)
Definition: bl1_is.c:113
int bl1_is_row_storage(int rs, int cs)
Definition: bl1_is.c:95
void bl1_ztrsv_blas(uplo1_t uplo, trans1_t trans, diag1_t diag, int m, dcomplex *a, int lda, dcomplex *x, int incx)
Definition: bl1_trsv.c:368
dcomplex * bl1_zallocv(unsigned int n_elem)
Definition: bl1_allocv.c:45
void bl1_zfree_contigm(dcomplex *a_save, int a_rs_save, int a_cs_save, dcomplex **a, int *a_rs, int *a_cs)
Definition: bl1_free_contigm.c:61
void bl1_zcopyv(conj1_t conj, int m, dcomplex *x, int incx, dcomplex *y, int incy)
Definition: bl1_copyv.c:63
Definition: blis_type_defs.h:137

◆ bl1_ztrsv_blas()

void bl1_ztrsv_blas ( uplo1_t  uplo,
trans1_t  trans,
diag1_t  diag,
int  m,
dcomplex a,
int  lda,
dcomplex x,
int  incx 
)

References bl1_param_map_to_netlib_diag(), bl1_param_map_to_netlib_trans(), bl1_param_map_to_netlib_uplo(), cblas_ztrsv(), CblasColMajor, and F77_ztrsv().

Referenced by bl1_ztrsv().

369 {
370 #ifdef BLIS1_ENABLE_CBLAS_INTERFACES
371  enum CBLAS_ORDER cblas_order = CblasColMajor;
372  enum CBLAS_UPLO cblas_uplo;
373  enum CBLAS_TRANSPOSE cblas_trans;
374  enum CBLAS_DIAG cblas_diag;
375 
376  bl1_param_map_to_netlib_uplo( uplo, &cblas_uplo );
377  bl1_param_map_to_netlib_trans( trans, &cblas_trans );
378  bl1_param_map_to_netlib_diag( diag, &cblas_diag );
379 
380  cblas_ztrsv( cblas_order,
381  cblas_uplo,
382  cblas_trans,
383  cblas_diag,
384  m,
385  a, lda,
386  x, incx );
387 #else
388  char blas_uplo;
389  char blas_trans;
390  char blas_diag;
391 
392  bl1_param_map_to_netlib_uplo( uplo, &blas_uplo );
393  bl1_param_map_to_netlib_trans( trans, &blas_trans );
394  bl1_param_map_to_netlib_diag( diag, &blas_diag );
395 
396  F77_ztrsv( &blas_uplo,
397  &blas_trans,
398  &blas_diag,
399  &m,
400  a, &lda,
401  x, &incx );
402 #endif
403 }
CBLAS_ORDER
Definition: blis_prototypes_cblas.h:17
CBLAS_DIAG
Definition: blis_prototypes_cblas.h:20
void cblas_ztrsv(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const int N, const void *A, const int lda, void *X, const int incX)
CBLAS_TRANSPOSE
Definition: blis_prototypes_cblas.h:18
void F77_ztrsv(char *uplo, char *transa, char *diag, int *n, dcomplex *a, int *lda, dcomplex *y, int *incy)
void bl1_param_map_to_netlib_trans(trans1_t blis_trans, void *blas_trans)
Definition: bl1_param_map.c:15
CBLAS_UPLO
Definition: blis_prototypes_cblas.h:19
Definition: blis_prototypes_cblas.h:17
void bl1_param_map_to_netlib_uplo(uplo1_t blis_uplo, void *blas_uplo)
Definition: bl1_param_map.c:47
void bl1_param_map_to_netlib_diag(diag1_t blis_diag, void *blas_diag)
Definition: bl1_param_map.c:95