22 #ifndef DOXYGEN_SHOULD_SKIP_THIS
27 #include "sopalin/sopalin_data.h"
33 #if defined( PASTIX_STARPU_PROFILING )
37 starpu_profile_t solve_blok_dgemm_profile = {
39 .name =
"solve_blok_dgemm"
45 void solve_blok_dgemm_profile_register(
void ) __attribute__( ( constructor ) );
47 solve_blok_dgemm_profile_register(
void )
49 profiling_register_cl( &solve_blok_dgemm_profile );
53 #ifndef DOXYGEN_SHOULD_SKIP_THIS
54 struct cl_solve_blok_dgemm_args_s {
63 static struct starpu_perfmodel starpu_solve_blok_dgemm_model = {
64 .type = STARPU_HISTORY_BASED,
65 .symbol =
"solve_blok_dgemm",
68 #if !defined(PASTIX_STARPU_SIMULATION)
70 fct_solve_blok_dgemm_cpu(
void *descr[],
void *cl_arg )
72 const void *dataA = NULL;
77 struct cl_solve_blok_dgemm_args_s *args = (
struct cl_solve_blok_dgemm_args_s *)cl_arg;
79 dataA = pastix_starpu_cblk_get_ptr( descr[0] );
80 B = (
double *)STARPU_MATRIX_GET_PTR( descr[1] );
83 C = (
double *)STARPU_MATRIX_GET_PTR( descr[2] );
89 if ( (args->side ==
PastixLeft) && (args->cblk->cblktype & CBLK_COMPRESSED) ) {
91 lrA += (args->blok - args->cblk->fblokptr);
94 else if ( (args->side ==
PastixRight) && (args->fcbk->cblktype & CBLK_COMPRESSED) ) {
96 lrA += (args->blok - args->fcbk->fblokptr);
101 A += args->blok->coefind;
106 args->cblk, args->blok, args->fcbk, dataA, B, ldb, C, ldc );
160 struct cl_solve_blok_dgemm_args_s *cl_arg;
164 starpu_data_handle_t handle;
165 #if defined(PASTIX_DEBUG_STARPU)
172 #if defined(PASTIX_WITH_MPI)
175 if ( cblk->
ownerid == sopalin_data->solvmtx->clustnum ) {
178 if ( fcbk->
ownerid == sopalin_data->solvmtx->clustnum ) {
181 if ( starpu_mpi_cached_receive( solvmtx->starpu_desc_rhs->handletab[fcbknum] ) ) {
184 if ( !need_submit ) {
193 cl_arg = malloc(
sizeof(
struct cl_solve_blok_dgemm_args_s) );
194 #if defined(PASTIX_STARPU_PROFILING)
195 cl_arg->profile_data.measures = solve_blok_dgemm_profile.measures;
196 cl_arg->profile_data.flops = NAN;
199 cl_arg->trans = trans;
204 #if defined(PASTIX_DEBUG_STARPU)
205 asprintf( &task_name,
"%s( %ld, %ld, %ld )",
206 cl_solve_blok_dgemm_cpu.name,
207 (
long)( ( side ==
PastixRight ) ? fcbknum : cblknum ),
219 pastix_starpu_insert_task(
220 &cl_solve_blok_dgemm_cpu,
221 STARPU_CL_ARGS, cl_arg,
sizeof(
struct cl_solve_blok_dgemm_args_s ),
222 #
if defined(PASTIX_STARPU_PROFILING)
223 STARPU_CALLBACK_WITH_ARG_NFREE, cl_profiling_callback, cl_arg,
226 STARPU_R, solvmtx->starpu_desc_rhs->handletab[cblknum],
227 STARPU_RW, solvmtx->starpu_desc_rhs->handletab[fcbknum],
228 #
if defined(PASTIX_DEBUG_STARPU)
229 STARPU_NAME, task_name,
231 #
if defined(PASTIX_STARPU_HETEROPRIO)
232 STARPU_PRIORITY, BucketSolveGEMM,
BEGIN_C_DECLS typedef int pastix_int_t
The block low-rank structure to hold a matrix in low-rank form.
void solve_blok_dgemm(pastix_side_t side, pastix_trans_t trans, pastix_int_t nrhs, const SolverCblk *cblk, const SolverBlok *blok, SolverCblk *fcbk, const void *dataA, const double *B, pastix_int_t ldb, double *C, pastix_int_t ldc)
Apply a solve gemm update related to a single block of the matrix A.
enum pastix_side_e pastix_side_t
Side of the operation.
enum pastix_trans_e pastix_trans_t
Transpostion.
enum pastix_coefside_e pastix_coefside_t
Data blocks used in the kernel.
void starpu_stask_blok_dgemm(sopalin_data_t *sopalin_data, pastix_coefside_t coef, pastix_side_t side, pastix_trans_t trans, const SolverCblk *cblk, const SolverBlok *blok, SolverCblk *fcbk, pastix_int_t prio)
Submit a task to perform a gemm.
Base structure to all codelet arguments that include the profiling data.
SolverCblk *restrict cblktab
Solver column block structure.
Solver column block structure.