diff --git a/control/descriptor.h b/control/descriptor.h index 549762e184fed9ef4523dbd046264c9fed1f9898..e1f26ca71888ec1723c837a2621faa87818947d8 100644 --- a/control/descriptor.h +++ b/control/descriptor.h @@ -62,7 +62,7 @@ int morse_desc_check (const MORSE_desc_t *desc); int morse_desc_mat_alloc(MORSE_desc_t *desc); int morse_desc_mat_free (MORSE_desc_t *desc); -#define BLKLDD(A, k) A->get_blkldd( A,k ) +#define BLKLDD(A, k) A->get_blkldd( A, k ) /** * Internal function to return address of block (m,n) with m,n = block indices @@ -176,7 +176,9 @@ inline static int morse_getblkldd_cm(const MORSE_desc_t *A, int m) { */ inline static int morse_getrankof_2d(const MORSE_desc_t *desc, int m, int n) { - return (m % desc->p) * desc->q + (n % desc->q); + int mm = m + A->i / A->mb; + int nn = n + A->j / A->nb; + return (mm % desc->p) * desc->q + (nn % desc->q); } /** @@ -184,8 +186,9 @@ inline static int morse_getrankof_2d(const MORSE_desc_t *desc, int m, int n) */ inline static int morse_getrankof_2d_diag(const MORSE_desc_t *desc, int m, int n) { + int mm = m + A->i / A->mb; assert( n == 0 ); - return (m % desc->p) * desc->q + (m % desc->q); + return (mm % desc->p) * desc->q + (mm % desc->q); } diff --git a/runtime/parsec/control/runtime_descriptor.c b/runtime/parsec/control/runtime_descriptor.c index 14804e77f4dfc0c12682971dac7da8c59a7343d9..e696248a40b0e8e6a4b45c56b82c9c827b32e0ae 100644 --- a/runtime/parsec/control/runtime_descriptor.c +++ b/runtime/parsec/control/runtime_descriptor.c @@ -262,7 +262,8 @@ void RUNTIME_desc_create( MORSE_desc_t *mdesc ) default: morse_fatal_error("MORSE_Element_Size", "undefined type"); break; } - parsec_matrix_add2arena_tile( parsec_dtd_arenas[pdesc->arena_index], datatype, mdesc->mb*mdesc->nb*MORSE_Element_Size(mdesc->dtyp) ); + parsec_matrix_add2arena_tile( parsec_dtd_arenas[pdesc->arena_index], datatype, + mdesc->mb * mdesc->nb * MORSE_Element_Size(mdesc->dtyp) ); #endif /* /\* Overwrite the leading dimensions to store the padding *\/ */ /* mdesc->llm = mdesc->mb * mdesc->lmt; */ @@ -287,7 +288,9 @@ void RUNTIME_desc_destroy( MORSE_desc_t *mdesc ) for(i=0; i<nb_local_tiles; i++, data++) { - parsec_data_destroy( *data ); + if (*data) { + parsec_data_destroy( *data ); + } } free( pdesc->data_map ); diff --git a/runtime/starpu/control/runtime_descriptor.c b/runtime/starpu/control/runtime_descriptor.c index 8196fe70a6359b26f60234796fa94edfdfcd6e3c..9664261918da4f72a26c15c25f5d1857810969bf 100644 --- a/runtime/starpu/control/runtime_descriptor.c +++ b/runtime/starpu/control/runtime_descriptor.c @@ -368,10 +368,13 @@ void RUNTIME_desc_flush( const MORSE_desc_t *desc, } void RUNTIME_data_flush( const MORSE_sequence_t *sequence, - const MORSE_desc_t *A, int Am, int An ) + const MORSE_desc_t *A, int m, int n ) { - starpu_data_handle_t *handle = (starpu_data_handle_t*)(A->schedopt); - handle += ((int64_t)(A->lmt) * (int64_t)An + (int64_t)Am); + int64_t mm = m + (desc->i / desc->mb); + int64_t nn = n + (desc->j / desc->nb); + + starpu_data_handle_t *ptrtile = desc->schedopt; + ptrtile += ((int64_t)desc->lmt) * nn + mm; if (*handle == NULL) { return; @@ -381,7 +384,7 @@ void RUNTIME_data_flush( const MORSE_sequence_t *sequence, starpu_mpi_cache_flush( MPI_COMM_WORLD, *handle ); #endif - if ( morse_desc_islocal( A, Am, An ) ) { + if ( morse_desc_islocal( A, m, n ) ) { chameleon_starpu_data_wont_use( *handle ); } @@ -418,11 +421,11 @@ void RUNTIME_data_migrate( const MORSE_sequence_t *sequence, void *RUNTIME_data_getaddr( const MORSE_desc_t *desc, int m, int n ) { - int64_t im = m + (desc->i / desc->mb); - int64_t jn = n + (desc->j / desc->nb); + int64_t mm = m + (desc->i / desc->mb); + int64_t nn = n + (desc->j / desc->nb); starpu_data_handle_t *ptrtile = desc->schedopt; - ptrtile += ((int64_t)desc->lmt) * jn + im; + ptrtile += ((int64_t)desc->lmt) * nn + mm; if (*ptrtile == NULL) { int home_node = -1; @@ -430,8 +433,8 @@ void *RUNTIME_data_getaddr( const MORSE_desc_t *desc, int m, int n ) int myrank = desc->myrank; int owner = desc->get_rankof( desc, m, n ); int64_t eltsze = MORSE_Element_Size(desc->dtyp); - int tempmm = (im == desc->lmt-1) ? (desc->lm - im * desc->mb) : desc->mb; - int tempnn = (jn == desc->lnt-1) ? (desc->ln - jn * desc->nb) : desc->nb; + int tempmm = (mm == desc->lmt-1) ? (desc->lm - mm * desc->mb) : desc->mb; + int tempnn = (nn == desc->lnt-1) ? (desc->ln - nn * desc->nb) : desc->nb; if ( myrank == owner ) { user_ptr = desc->get_blkaddr(desc, m, n); @@ -441,7 +444,7 @@ void *RUNTIME_data_getaddr( const MORSE_desc_t *desc, int m, int n ) } starpu_matrix_data_register( ptrtile, home_node, (uintptr_t) user_ptr, - BLKLDD(desc, im), + BLKLDD(desc, m), tempmm, tempnn, eltsze ); #ifdef HAVE_STARPU_DATA_SET_COORDINATES @@ -450,7 +453,7 @@ void *RUNTIME_data_getaddr( const MORSE_desc_t *desc, int m, int n ) #if defined(CHAMELEON_USE_MPI) { - int64_t block_ind = desc->lmt * jn + im; + int64_t block_ind = desc->lmt * nn + mm; starpu_mpi_data_register(*ptrtile, (desc->id << tag_sep) | (block_ind), owner); } #endif /* defined(CHAMELEON_USE_MPI) */