From b4d811dda90f20f8f06390e0ae2cab3eaf2fe38d Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Mon, 5 Feb 2018 17:48:52 +0100
Subject: [PATCH] Try to fix issue43

---
 control/descriptor.h                        |  9 +++++---
 runtime/parsec/control/runtime_descriptor.c |  7 ++++--
 runtime/starpu/control/runtime_descriptor.c | 25 ++++++++++++---------
 3 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/control/descriptor.h b/control/descriptor.h
index 549762e18..e1f26ca71 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 14804e77f..e696248a4 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 8196fe70a..966426191 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) */
-- 
GitLab