diff --git a/mojitos.c b/mojitos.c index 3c34a0f35afa6ccb5f97c08de0f6a1a3b654a6e6..0e9d065138cc8119ae03b2ea6825dd7a17f53b1b 100644 --- a/mojitos.c +++ b/mojitos.c @@ -217,7 +217,7 @@ int main(int argc, char **argv) { if(rapl_mode==0) { rapl = init_rapl(nbzones, rapl_zones); // prepare rapl data stores - rapl_size = rapl->nbpackages*rapl->nbzones * sizeof(uint64_t); + rapl_size = rapl->nb * sizeof(uint64_t); //rapl_values = malloc(rapl_size); rapl_values = calloc(sizeof(char), rapl_size); //tmp_rapl_values = malloc(rapl_size); @@ -250,8 +250,8 @@ int main(int argc, char **argv) { fprintf(output, "irxp irxb itxp itxb "); if(rapl_mode==0) - for (int r=0; r<rapl->nbpackages*rapl->nbzones; r++) - fprintf(output, "%s%u ", rapl->names[r], (unsigned int)r/rapl->nbzones); + for (int r=0; r<rapl->nb; r++) + fprintf(output, "%s ", rapl->names[r]); if(load_mode==0) fprintf(output, "user nice system idle iowait irq softirq steal guest guest_nice "); @@ -322,7 +322,7 @@ int main(int argc, char **argv) { for(int i=0; i<4; i++) fprintf(output, "%lld ", tmp_infiniband_values[i]-infiniband_values[i]); if(rapl_mode==0) - for (int r=0; r<rapl->nbpackages*rapl->nbzones; r++) + for (int r=0; r<rapl->nb; r++) fprintf(output, "%ld ", tmp_rapl_values[r]-rapl_values[r]); if(load_mode==0) for(int i=0; i<10; i++) @@ -359,6 +359,9 @@ int main(int argc, char **argv) { if(perf_mode==0){ clean_counters(fd); free(counter_values); + free(perf_type); + free(perf_key); + free(perf_indexes); } } diff --git a/rapl.c b/rapl.c index da171da9d1b1e9a2e99d28f53c2120d3dbc14335..f24808bc67f78cc6d6257bb4aad9db297f5cf3d1 100644 --- a/rapl.c +++ b/rapl.c @@ -28,30 +28,47 @@ _rapl_t* init_rapl(const uint32_t nb_zones, const int *rapl_zones) { // get number of processor sockets _rapl_t* rapl = malloc(sizeof(struct _rapl_t)); - rapl->nbzones = nb_zones; - rapl->zones = rapl_zones; + rapl->nb = 0; + rapl->packages = NULL; + rapl->zones = NULL; - rapl->nbpackages = powercap_rapl_get_num_packages(); - if (rapl->nbpackages == 0) { + rapl->nb_pkgs = powercap_rapl_get_num_packages(); + if (rapl->nb_pkgs == 0) { perror("no packages found (maybe the kernel module isn't loaded?)"); exit(-1); } - rapl->pkgs = malloc(rapl->nbpackages * sizeof(powercap_rapl_pkg)); - for (int package = 0; package < rapl->nbpackages; package++) + rapl->pkgs = malloc(rapl->nb_pkgs * sizeof(powercap_rapl_pkg)); + for (int package = 0; package < rapl->nb_pkgs; package++) if (powercap_rapl_init(package, &rapl->pkgs[package], 0)) { perror("powercap_rapl_init, check access (root needed ?)"); exit(-1); } - rapl->names = malloc(sizeof(char*) * (rapl->nbzones) * (rapl->nbpackages) ); + printf("%d %d\n\n", nb_zones, rapl->nb_pkgs); + rapl->names = NULL; + char _name[MAX_LEN_NAME+1]; + char _name2[MAX_LEN_NAME+10]; - for (int package = 0; package < rapl->nbpackages; package++) { - for(int zone=0; zone<rapl->nbzones; zone++) { - powercap_rapl_get_name(&rapl->pkgs[package], rapl_zones[zone], + for (unsigned int package = 0; package < rapl->nb_pkgs; package++) { + for(unsigned int zone=0; zone < nb_zones; zone++) { + int a=powercap_rapl_get_name(&rapl->pkgs[package], rapl_zones[zone], _name, MAX_LEN_NAME); - rapl->names[package*rapl->nbzones+zone] = malloc(sizeof(char) * (strlen(_name)+1)); - strcpy(rapl->names[package*rapl->nbzones+zone], _name); + if (a>0) { + + sprintf(_name2, "%s%u ", _name, package); + + rapl->nb++; + rapl->names = realloc(rapl->names, sizeof(char*)*rapl->nb); + rapl->names[rapl->nb-1] = malloc(sizeof(char) * (strlen(_name2)+1)); + rapl->zones = realloc(rapl->zones, sizeof(uint32_t)*rapl->nb); + rapl->packages = realloc(rapl->packages, sizeof(uint32_t)*rapl->nb); + + strcpy(rapl->names[rapl->nb-1], _name2); + rapl->zones[rapl->nb-1] = zone; + rapl->packages[rapl->nb-1] = package; + } + printf("%d %d %d %s\n\n", a, package, zone, _name2); } } return rapl; @@ -61,21 +78,23 @@ _rapl_t* init_rapl(const uint32_t nb_zones, const int *rapl_zones) { // values [zone + package *nbzones] microjoules void get_rapl(uint64_t *values, _rapl_t* rapl) { - for (int package = 0; package < rapl->nbpackages; package++) { - for(int zone=0; zone<rapl->nbzones; zone++) { - powercap_rapl_get_energy_uj(&rapl->pkgs[package], rapl->zones[zone], &values[package*rapl->nbzones+zone]); - } + for (int i = 0; i < rapl->nb; i++) { + powercap_rapl_get_energy_uj(&rapl->pkgs[rapl->packages[i]], + rapl->zones[i], + &values[i]); } } void clean_rapl(_rapl_t* rapl) { - for (int package = 0; package < rapl->nbpackages; package++) { + for (int package = 0; package < rapl->nb_pkgs; package++) if (powercap_rapl_destroy(&rapl->pkgs[package])) perror("powercap_rapl_destroy"); - for (int zone=0; zone<rapl->nbzones; zone++) - free(rapl->names[package*rapl->nbzones+zone]); - } + for (int elem=0; elem<rapl->nb; elem++) + free(rapl->names[elem]); + free(rapl->names); free(rapl->pkgs); + free(rapl->zones); + free(rapl->packages); free(rapl); } diff --git a/rapl.h b/rapl.h index 1af8cf408f25c92d65538f26c423a10da6367c1d..48abcb0a3490956ac703f36e1b239fd18fbc83bd 100644 --- a/rapl.h +++ b/rapl.h @@ -22,14 +22,15 @@ struct _rapl_t { powercap_rapl_pkg* pkgs; - uint32_t nbpackages; - uint32_t nbzones; + uint32_t nb_pkgs; + + uint32_t nb; + char **names; - const int* zones; + uint32_t* zones; + uint32_t* packages; }; -typedef struct _rapl_t* rapl_t; - typedef struct _rapl_t _rapl_t; _rapl_t* init_rapl(const uint32_t nb_zones, const int *rapl_zones);