From 31cf7fbed8768dc0c0c86c84bbf579a72bc0bcb3 Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Mon, 21 Sep 2020 11:22:01 +0200
Subject: [PATCH] Add a functionnality to dump the memory ration tile by tile
 after generation

---
 include/main.h       |  1 +
 src/hchameleon.c     | 53 ++++++++++++++++++++++++++++++++++++++++++++
 src/testHCHAMELEON.c |  3 +++
 3 files changed, 57 insertions(+)

diff --git a/include/main.h b/include/main.h
index dfc04f7..a78e860 100644
--- a/include/main.h
+++ b/include/main.h
@@ -456,6 +456,7 @@ int         HCHAMELEON_generate_matrix( cham_flttype_t flttype, int NB, int PQ[2
 					hmat_interface_t *hi );
 int          HCHAMELEON_destroy_matrix( HCHAM_desc_t *hdescA );
 hmat_info_t  HCHAMELEON_getinfo( HCHAM_desc_t *hdesc );
+void         HCHAMELEON_getrank( HCHAM_desc_t *hdesc, char *name );
 CHAM_desc_t *HCHAMELEON_uncompress_matrix( HCHAM_desc_t *hdesc );
 void         HCHAMELEON_lapmr( char forward, char trans, int nrhs,
 			       HCHAM_desc_t *hdesc,
diff --git a/src/hchameleon.c b/src/hchameleon.c
index 7d70163..f21dc4f 100644
--- a/src/hchameleon.c
+++ b/src/hchameleon.c
@@ -10,6 +10,8 @@
 #include <coreblas.h>
 #include <pthread.h>
 
+static FILE *rankfile = NULL;
+
 /**
  * Detect if the tile is local or not
  */
@@ -414,6 +416,57 @@ hmat_info_t HCHAMELEON_getinfo( HCHAM_desc_t *hdesc )
   return ginfo;
 }
 
+static int
+HCHAMELEON_map_getrank( const CHAM_desc_t *desc,
+			cham_uplo_t uplo, int m, int n,
+			CHAM_tile_t *tile, void *op_args )
+{
+    size_t lr_size = -1;
+
+    switch( desc->dtyp ) {
+    case ChamComplexDouble:
+	lr_size = hmat_zcoefsize( tile->mat );
+	break;
+    case ChamComplexFloat:
+	lr_size = hmat_ccoefsize( tile->mat );
+	break;
+    case ChamRealDouble:
+	lr_size = hmat_dcoefsize( tile->mat );
+	break;
+    case ChamRealFloat:
+	lr_size = hmat_scoefsize( tile->mat );
+	break;
+    default:
+	fprintf( stderr, "ERROR: unknown data type to get compressed size\n" );
+    }
+
+    fprintf( rankfile, "%p;%p;%ld;%ld;%ld;%ld\n",
+	     op_args, tile, (long)m, (long)n,
+	     lr_size, (long)tile->m * (long)tile->n );
+
+    return 0;
+}
+
+void HCHAMELEON_getrank( HCHAM_desc_t *hdesc, char *name )
+{
+    cham_uplo_t uplo = symMatSolver ? ChamLower : ChamUpperLower;
+    char *rankfilename;
+
+    asprintf( &rankfilename, "initial_size_%s.csv", name );
+    rankfile = fopen( rankfilename, "w" );
+    free(rankfilename);
+
+    fprintf( rankfile, "matrix_ptr;tile_ptr;tile_m;tile_n;tile_lrsze;tile_frsze\n" );
+
+    CHAMELEON_map_Tile( uplo, hdesc->super,
+			HCHAMELEON_map_getrank, hdesc->hi );
+
+    fclose( rankfile );
+    rankfile = NULL;
+	
+    return;
+}
+
 void HCHAMELEON_lapmr( char forward, char trans, int nrhs,
                        HCHAM_desc_t *hdesc,
                        char *Bptr )
diff --git a/src/testHCHAMELEON.c b/src/testHCHAMELEON.c
index cfc81db..a351bf5 100644
--- a/src/testHCHAMELEON.c
+++ b/src/testHCHAMELEON.c
@@ -79,6 +79,7 @@ int testHCHAMELEON(void) {
   // Assembly driven by chameleon
   HCHAM_desc_t hdescA;
   HCHAMELEON_generate_matrix( chameleonType, NB, dims, &hdescA, hi );
+  HCHAMELEON_getrank( &hdescA, "A" );
   temps_final = getTime ();
   temps_cpu = temps_final - temps_initial ;
 
@@ -124,8 +125,10 @@ int testHCHAMELEON(void) {
 	{
 	    HCHAM_desc_t hdescB;
 	    HCHAMELEON_generate_matrix( chameleonType, NB, dims, &hdescB, hi );
+	    HCHAMELEON_getrank( &hdescB, "B" );
 	    HCHAM_desc_t hdescC;
 	    HCHAMELEON_generate_matrix( chameleonType, NB, dims, &hdescC, hi );
+	    HCHAMELEON_getrank( &hdescC, "C" );
 
 	    /* ===================================================================================== */
 	    /* Appelle le produit mat.vec : A.rhs -> solHMAT */
-- 
GitLab