23 #include "sopalin/sopalin_data.h"
26 #if defined(PASTIX_WITH_STARPU)
55 sopalin_data_t *sopalin_data,
66 cblknbr = (mode == PastixSolvModeSchur) ? datacode->
cblknbr : datacode->
cblkschur;
67 for (i=0; i<cblknbr; i++, cblk++) {
68 if ( cblk->
ownerid != datacode->clustnum ) {
72 nrhs, b + cblk->
lcolidx, ldb, NULL );
82 sopalin_data_t *sopalin_data;
86 volatile int32_t taskcnt;
107 struct args_ddiag_t *arg = (
struct args_ddiag_t*)args;
109 sopalin_data_t *sopalin_data = arg->sopalin_data;
112 int nrhs = arg->nrhs;
119 int rank = ctx->rank;
121 tasknbr = datacode->ttsknbr[rank];
122 tasktab = datacode->ttsktab[rank];
123 cblknbr = (mode == PastixSolvModeSchur) ? datacode->
cblknbr : datacode->
cblkschur;
125 for (ii=0; ii<tasknbr; ii++) {
127 t = datacode->tasktab + i;
133 if ( cblk->
ownerid != datacode->clustnum ) {
137 nrhs, b + cblk->
lcolidx, ldb, NULL );
166 sopalin_data_t *sopalin_data,
171 struct args_ddiag_t args_ddiag = {pastix_data, sopalin_data, nrhs, b, ldb, 0};
193 struct args_ddiag_t *arg = (
struct args_ddiag_t*)args;
195 sopalin_data_t *sopalin_data = arg->sopalin_data;
204 int32_t local_taskcnt = 0;
205 int nrhs = arg->nrhs;
207 int rank = ctx->rank;
211 tasknbr = datacode->ttsknbr[rank];
212 tasktab = datacode->ttsktab[rank];
213 computeQueue = datacode->computeQueue[rank];
215 cblknbr = (mode == PastixSolvModeSchur) ? datacode->
cblknbr : datacode->
cblkschur;
217 for (ii=0; ii<tasknbr; ii++) {
219 t = datacode->tasktab + i;
229 isched_barrier_wait( &(ctx->global_ctx->barrier) );
232 while( arg->taskcnt > 0 ){
236 if ( local_taskcnt ) {
237 pastix_atomic_sub_32b( &(arg->taskcnt), local_taskcnt );
241 ctx->global_ctx->world_size );
244 cblk = datacode->
cblktab + cblknum;
246 nrhs, b + cblk->
lcolidx, ldb, NULL );
251 isched_barrier_wait( &(ctx->global_ctx->barrier) );
253 memFree_null( computeQueue );
281 sopalin_data_t *sopalin_data,
288 sopalin_data->solvmtx->cblknbr : sopalin_data->solvmtx->cblkschur;
289 struct args_ddiag_t args_ddiag = { pastix_data, sopalin_data, nrhs, b, ldb, tasknbr };
291 MALLOC_INTERN( sopalin_data->solvmtx->computeQueue,
295 memFree_null( sopalin_data->solvmtx->computeQueue );
298 #ifndef DOXYGEN_SHOULD_SKIP_THIS
299 static void (*ddiag_table[5])(
pastix_data_t *, sopalin_data_t *,
300 int,
double *, int) = {
303 #if defined(PASTIX_WITH_PARSEC)
308 #if defined(PASTIX_WITH_STARPU)
342 sopalin_data_t *sopalin_data,
348 void (*ddiag)(
pastix_data_t *, sopalin_data_t *, int,
double *, int) = ddiag_table[ sched ];
353 ddiag( pastix_data, sopalin_data, nrhs, b, ldb );
BEGIN_C_DECLS typedef int pastix_int_t
static void pqueuePush1(pastix_queue_t *q, pastix_int_t elt, double key1)
Push an element with a single key.
void pqueueExit(pastix_queue_t *)
Free the structure associated to the queue.
static pastix_int_t pqueuePop(pastix_queue_t *q)
Pop the head of the queue whithout returning the keys.
int pqueueInit(pastix_queue_t *, pastix_int_t)
Initialize the queue structure with an initial space to store the elements.
void solve_cblk_ddiag(const SolverCblk *cblk, const void *dataA, int nrhs, double *b, int ldb, double *work)
Apply the diagonal solve related to one cblk to all the right hand side.
enum pastix_solv_mode_e pastix_solv_mode_t
Solve Schur modes.
Main PaStiX data structure.
void starpu_ddiag(pastix_data_t *pastix_data, sopalin_data_t *sopalin_data, int nrhs, double *b, int ldb)
Apply the diagonal solve (StarPU version)
void static_ddiag(pastix_data_t *pastix_data, sopalin_data_t *sopalin_data, int nrhs, double *b, int ldb)
TODO.
void sopalin_ddiag(pastix_data_t *pastix_data, sopalin_data_t *sopalin_data, int nrhs, double *b, int ldb)
TODO.
void dynamic_ddiag(pastix_data_t *pastix_data, sopalin_data_t *sopalin_data, int nrhs, double *b, int ldb)
TODO.
void sequential_ddiag(pastix_data_t *pastix_data, sopalin_data_t *sopalin_data, int nrhs, double *b, int ldb)
TODO.
void thread_ddiag_dynamic(isched_thread_t *ctx, void *args)
TODO.
void thread_ddiag_static(isched_thread_t *ctx, void *args)
TODO.
static pastix_int_t stealQueue(SolverMatrix *solvmtx, int rank, int nbthreads)
Task stealing method.
static void * cblk_getdataL(const SolverCblk *cblk)
Get the pointer to the data associated to the lower part of the cblk.
SolverCblk *restrict cblktab
Solver column block structure.
Solver column block structure.
The task structure for the numerical factorization.