PLASMA  2.4.5
PLASMA - Parallel Linear Algebra for Scalable Multi-core Architectures
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
cgesv.c
Go to the documentation of this file.
1 
16 #include "common.h"
17 
18 /***************************************************************************/
70 int PLASMA_cgesv(int N, int NRHS,
71  PLASMA_Complex32_t *A, int LDA,
72  int *IPIV,
73  PLASMA_Complex32_t *B, int LDB)
74 {
75  int NB;
76  int status;
78  PLASMA_sequence *sequence = NULL;
80  PLASMA_desc descA, descB;
81 
82  plasma = plasma_context_self();
83  if (plasma == NULL) {
84  plasma_error("PLASMA_cgesv", "PLASMA not initialized");
86  }
87  /* Check input arguments */
88  if (N < 0) {
89  plasma_error("PLASMA_cgesv", "illegal value of N");
90  return -1;
91  }
92  if (NRHS < 0) {
93  plasma_error("PLASMA_cgesv", "illegal value of NRHS");
94  return -2;
95  }
96  if (LDA < max(1, N)) {
97  plasma_error("PLASMA_cgesv", "illegal value of LDA");
98  return -4;
99  }
100  if (LDB < max(1, N)) {
101  plasma_error("PLASMA_cgesv", "illegal value of LDB");
102  return -8;
103  }
104  /* Quick return */
105  if (min(N, NRHS) == 0)
106  return PLASMA_SUCCESS;
107 
108  /* Tune NB & IB depending on M, N & NRHS; Set NBNB */
109  status = plasma_tune(PLASMA_FUNC_CGESV, N, N, NRHS);
110  if (status != PLASMA_SUCCESS) {
111  plasma_error("PLASMA_cgesv", "plasma_tune() failed");
112  return status;
113  }
114 
115  /* Set NT & NTRHS */
116  NB = PLASMA_NB;
117 
118  plasma_sequence_create(plasma, &sequence);
119 
121  plasma_cooplap2tile( descA, A, NB, NB, LDA, N, 0, 0, N, N , plasma_desc_mat_free(&(descA)) );
122  plasma_cooplap2tile( descB, B, NB, NB, LDB, NRHS, 0, 0, N, NRHS, plasma_desc_mat_free(&(descA)); plasma_desc_mat_free(&(descB)));
123  } else {
124  plasma_ciplap2tile( descA, A, NB, NB, LDA, N, 0, 0, N, N );
125  plasma_ciplap2tile( descB, B, NB, NB, LDB, NRHS, 0, 0, N, NRHS);
126  }
127 
128  /* Call the tile interface */
129  PLASMA_cgesv_Tile_Async(&descA, IPIV, &descB, sequence, &request);
130 
132  plasma_cooptile2lap( descA, A, NB, NB, LDA, N );
133  plasma_cooptile2lap( descB, B, NB, NB, LDB, NRHS );
135  plasma_desc_mat_free(&descA);
136  plasma_desc_mat_free(&descB);
137  } else {
138  plasma_ciptile2lap( descA, A, NB, NB, LDA, N );
139  plasma_ciptile2lap( descB, B, NB, NB, LDB, NRHS );
141  }
142 
143  status = sequence->status;
144  plasma_sequence_destroy(plasma, sequence);
145  return status;
146 }
147 /***************************************************************************/
188 {
190  PLASMA_sequence *sequence = NULL;
192  int status;
193 
194  plasma = plasma_context_self();
195  if (plasma == NULL) {
196  plasma_fatal_error("PLASMA_cgesv_Tile", "PLASMA not initialized");
198  }
199  plasma_sequence_create(plasma, &sequence);
200  PLASMA_cgesv_Tile_Async(A, IPIV, B, sequence, &request);
202  status = sequence->status;
203  plasma_sequence_destroy(plasma, sequence);
204  return status;
205 }
206 
207 /***************************************************************************/
237  PLASMA_sequence *sequence, PLASMA_request *request)
238 {
239  PLASMA_desc descA = *A;
240  PLASMA_desc descB = *B;
242 
243  plasma = plasma_context_self();
244  if (plasma == NULL) {
245  plasma_fatal_error("PLASMA_cgesv_Tile", "PLASMA not initialized");
247  }
248  if (sequence == NULL) {
249  plasma_fatal_error("PLASMA_cgesv_Tile", "NULL sequence");
250  return PLASMA_ERR_UNALLOCATED;
251  }
252  if (request == NULL) {
253  plasma_fatal_error("PLASMA_cgesv_Tile", "NULL request");
254  return PLASMA_ERR_UNALLOCATED;
255  }
256  /* Check sequence status */
257  if (sequence->status == PLASMA_SUCCESS)
258  request->status = PLASMA_SUCCESS;
259  else
260  return plasma_request_fail(sequence, request, PLASMA_ERR_SEQUENCE_FLUSHED);
261 
262  /* Check descriptors for correctness */
263  if (plasma_desc_check(&descA) != PLASMA_SUCCESS) {
264  plasma_error("PLASMA_cgesv_Tile", "invalid first descriptor");
265  return plasma_request_fail(sequence, request, PLASMA_ERR_ILLEGAL_VALUE);
266  }
267  if (plasma_desc_check(&descB) != PLASMA_SUCCESS) {
268  plasma_error("PLASMA_cgesv_Tile", "invalid third descriptor");
269  return plasma_request_fail(sequence, request, PLASMA_ERR_ILLEGAL_VALUE);
270  }
271  /* Check input arguments */
272  if (descA.nb != descA.mb || descB.nb != descB.mb) {
273  plasma_error("PLASMA_cgesv_Tile", "only square tiles supported");
274  return plasma_request_fail(sequence, request, PLASMA_ERR_ILLEGAL_VALUE);
275  }
276  /* Quick return */
277 /*
278  if (min(N, NRHS) == 0)
279  return PLASMA_SUCCESS;
280 */
281 
283  plasma_pcbarrier_tl2pnl,
284  PLASMA_desc, descA,
285  PLASMA_sequence*, sequence,
286  PLASMA_request*, request);
287 
288  plasma_dynamic_call_4(plasma_pcgetrf_rectil,
289  PLASMA_desc, descA,
290  int*, IPIV,
291  PLASMA_sequence*, sequence,
292  PLASMA_request*, request);
293 
294  /* swap */
296  plasma_pcbarrier_tl2pnl,
297  PLASMA_desc, descB,
298  PLASMA_sequence*, sequence,
299  PLASMA_request*, request);
300 
302  plasma_pclaswp,
303  PLASMA_desc, descB,
304  int *, IPIV,
305  int, 1,
306  PLASMA_sequence*, sequence,
307  PLASMA_request*, request);
308 
315  PLASMA_Complex32_t, 1.0,
316  PLASMA_desc, descA,
317  PLASMA_desc, descB,
318  PLASMA_sequence*, sequence,
319  PLASMA_request*, request);
320 
327  PLASMA_Complex32_t, 1.0,
328  PLASMA_desc, descA,
329  PLASMA_desc, descB,
330  PLASMA_sequence*, sequence,
331  PLASMA_request*, request);
332 
333  return PLASMA_SUCCESS;
334 }