Commit 492df0fa authored by PRUVOST Florent's avatar PRUVOST Florent

check the size of data to decide where to execute the task for those involved in POTRS and GEQRS

parent 2466e15d
......@@ -218,7 +218,7 @@ int MORSE_zgetrs_nopiv_Tile(MORSE_desc_t *A, MORSE_desc_t *B)
RUNTIME_barrier(morse);
RUNTIME_desc_getoncpu(A);
RUNTIME_desc_getoncpu(B);
status = sequence->status;
morse_sequence_destroy(morse, sequence);
return status;
......
......@@ -47,9 +47,9 @@ void MORSE_TASK_zgemm(MORSE_option_t *options,
(void)nb;
struct starpu_codelet *codelet = &cl_zgemm;
void (*callback)(void*) = options->profiling ? cl_zgemm_callback : NULL;
int sizeA = m*k;
int sizeB = k*n;
int sizeC = m*n;
int sizeA = lda*k;
int sizeB = ldb*n;
int sizeC = ldc*n;
int execution_rank = C->get_rankof( C, Cm, Cn );
int rank_changed=0;
......
......@@ -46,8 +46,8 @@ void MORSE_TASK_ztrsm(MORSE_option_t *options,
(void)nb;
struct starpu_codelet *codelet = &cl_ztrsm;
void (*callback)(void*) = options->profiling ? cl_ztrsm_callback : NULL;
int sizeA = m*m;
int sizeB = m*n;
int sizeA = lda*m;
int sizeB = ldb*n;
int execution_rank = B->get_rankof( B, Bm, Bn );
int rank_changed=0;
......
......@@ -144,11 +144,36 @@ void MORSE_TASK_ztsmqr(MORSE_option_t *options,
struct starpu_codelet *codelet = &cl_ztsmqr;
void (*callback)(void*) = options->profiling ? cl_ztsmqr_callback : NULL;
int ldwork = side == MorseLeft ? ib : nb;
int sizeA1 = lda1*n1;
int sizeA2 = lda2*n2;
int sizeV = ldv*k;
int sizeT = ldt*n1;
int execution_rank = A2->get_rankof( A2, A2m, A2n );
int rank_changed=0;
// force execution on the rank owning the largest data (tile)
int threshold;
char* env = getenv("MORSE_COMM_FACTOR_THRESHOLD");
if (env != NULL)
threshold = (unsigned)atoi(env);
else
threshold = 10;
if ( sizeA1 > threshold*sizeA2 ){
execution_rank = A1->get_rankof( A1, A1m, A1n );
rank_changed = 1;
}else if( sizeV > threshold*sizeA2 ){
execution_rank = V->get_rankof( V, Vm, Vn );
rank_changed = 1;
}else if( sizeT > threshold*sizeA2 ){
execution_rank = T->get_rankof( T, Tm, Tn );
rank_changed = 1;
}
if ( morse_desc_islocal( A1, A1m, A1n ) ||
morse_desc_islocal( A2, A2m, A2n ) ||
morse_desc_islocal( V, Vm, Vn ) ||
morse_desc_islocal( T, Tm, Tn ) )
morse_desc_islocal( T, Tm, Tn ) ||
rank_changed )
{
starpu_insert_task(
codelet,
......@@ -173,7 +198,9 @@ void MORSE_TASK_ztsmqr(MORSE_option_t *options,
STARPU_VALUE, &ldwork, sizeof(int),
STARPU_PRIORITY, options->priority,
STARPU_CALLBACK, callback,
STARPU_EXECUTE_ON_NODE, A2->get_rankof(A2, A2m, A2n),
#if defined(CHAMELEON_USE_MPI)
STARPU_EXECUTE_ON_NODE, execution_rank,
#endif
0);
}
}
......
......@@ -137,11 +137,36 @@ void MORSE_TASK_zttmqr(MORSE_option_t *options,
struct starpu_codelet *codelet = &cl_zttmqr;
void (*callback)(void*) = options->profiling ? cl_zttmqr_callback : NULL;
int ldwork = side == MorseLeft ? ib : nb;
int sizeA1 = lda1*n1;
int sizeA2 = lda2*n2;
int sizeV = ldv*k;
int sizeT = ldt*n1;
int execution_rank = A2->get_rankof( A2, A2m, A2n );
int rank_changed=0;
// force execution on the rank owning the largest data (tile)
int threshold;
char* env = getenv("MORSE_COMM_FACTOR_THRESHOLD");
if (env != NULL)
threshold = (unsigned)atoi(env);
else
threshold = 10;
if ( sizeA1 > threshold*sizeA2 ){
execution_rank = A1->get_rankof( A1, A1m, A1n );
rank_changed = 1;
}else if( sizeV > threshold*sizeA2 ){
execution_rank = V->get_rankof( V, Vm, Vn );
rank_changed = 1;
}else if( sizeT > threshold*sizeA2 ){
execution_rank = T->get_rankof( T, Tm, Tn );
rank_changed = 1;
}
if ( morse_desc_islocal( A1, A1m, A1n ) ||
morse_desc_islocal( A2, A2m, A2n ) ||
morse_desc_islocal( V, Vm, Vn ) ||
morse_desc_islocal( T, Tm, Tn ) )
morse_desc_islocal( T, Tm, Tn ) ||
rank_changed )
{
starpu_insert_task(
codelet,
......@@ -166,6 +191,9 @@ void MORSE_TASK_zttmqr(MORSE_option_t *options,
STARPU_VALUE, &ldwork, sizeof(int),
STARPU_PRIORITY, options->priority,
STARPU_CALLBACK, callback,
#if defined(CHAMELEON_USE_MPI)
STARPU_EXECUTE_ON_NODE, execution_rank,
#endif
0);
}
}
......
......@@ -126,10 +126,31 @@ void MORSE_TASK_zunmqr(MORSE_option_t *options,
{
struct starpu_codelet *codelet = &cl_zunmqr;
void (*callback)(void*) = options->profiling ? cl_zunmqr_callback : NULL;
int sizeA = lda*k;
int sizeT = ldt*n;
int sizeC = ldc*n;
int execution_rank = C->get_rankof( C, Cm, Cn );
int rank_changed=0;
// force execution on the rank owning the largest data (tile)
int threshold;
char* env = getenv("MORSE_COMM_FACTOR_THRESHOLD");
if (env != NULL)
threshold = (unsigned)atoi(env);
else
threshold = 10;
if ( sizeA > threshold*sizeC ){
execution_rank = A->get_rankof( A, Am, An );
rank_changed = 1;
}else if( sizeT > threshold*sizeC ){
execution_rank = T->get_rankof( T, Tm, Tn );
rank_changed = 1;
}
if ( morse_desc_islocal( A, Am, An ) ||
morse_desc_islocal( T, Tm, Tn ) ||
morse_desc_islocal( C, Cm, Cn ) )
morse_desc_islocal( C, Cm, Cn ) ||
rank_changed )
{
starpu_insert_task(
codelet,
......@@ -150,6 +171,9 @@ void MORSE_TASK_zunmqr(MORSE_option_t *options,
STARPU_VALUE, &nb, sizeof(int),
STARPU_PRIORITY, options->priority,
STARPU_CALLBACK, callback,
#if defined(CHAMELEON_USE_MPI)
STARPU_EXECUTE_ON_NODE, execution_rank,
#endif
0);
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment