diff --git a/include/main.h b/include/main.h index dfc04f7991a7c2f9241c10dca576c3648f53d43b..a78e860894ed1154a7dc302db5b3c24cba3ae1f0 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 7d701637f71798a4cad5766a65bae51cd0427089..f21dc4fbbc12d022321c2ebfbfdbd0161006e3e9 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 cfc81db79394ff25edf47490574e233ab9fc2cb6..a351bf59d851397b4b721e071dbed87bb9203ec8 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 */