diff --git a/src/rapl.c b/src/rapl.c index 3d13367a47fb009b7f0a0f1567a9169daf9a08a4..a93147a5ff752311b57c28dd5549b5a487731588 100644 --- a/src/rapl.c +++ b/src/rapl.c @@ -60,21 +60,25 @@ struct IntelRapl { int *fids; uint64_t *values; uint64_t *tmp_values; + uint64_t *modulo; }; typedef struct IntelRapl IntelRapl; -void add_rapl_source(IntelRapl *rapl, char *name, char *energy_uj) +void add_rapl_source(IntelRapl *rapl, char *name, uint64_t modulo, char *energy_uj) { rapl->nb += 1; rapl->names = realloc(rapl->names, sizeof(char **)*rapl->nb); rapl->fids = realloc(rapl->fids, sizeof(int *)*rapl->nb); - + rapl->modulo = realloc(rapl->modulo, sizeof(uint64_t)*rapl->nb); + rapl->names[rapl->nb - 1] = malloc(strlen(name) + 1); strcpy(rapl->names[rapl->nb - 1], name); //printf("%s\n", energy_uj); + rapl->modulo[rapl->nb - 1] = modulo; + int fd = open(energy_uj, O_RDONLY); if (fd < 0) { @@ -102,6 +106,28 @@ void _get_rapl(uint64_t *values, IntelRapl *rapl) } } +int add_rapl_source_from_str(IntelRapl *rapl, const char*name_base, const int i) { + + char buffer[BUFFER_SIZE]; + + snprintf(buffer, BUFFER_SIZE, name_base, i); + strcat(buffer, "name"); + char *tmp = get_rapl_string(buffer); + if (tmp == NULL) + return 0; + append(tmp, i, MAX_HEADER); // tmp contains the name with its index. ex: dram0 + + snprintf(buffer, BUFFER_SIZE, name_base, i); + strcat(buffer, "name"); + uint64_t modulo = strtoull(get_rapl_string(buffer), NULL, 10); + + snprintf(buffer, BUFFER_SIZE, name_base, i); + strcat(buffer, "energy_uj"); + + add_rapl_source(rapl, tmp, modulo, buffer); + free(tmp); + return 1; +} unsigned int init_rapl(char *none, void **ptr) { @@ -110,38 +136,25 @@ unsigned int init_rapl(char *none, void **ptr) rapl->nb = 0; rapl->names = NULL; rapl->fids = NULL; - + rapl->modulo = NULL; + char buffer[BUFFER_SIZE]; - char *name_base = "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:%d/%s"; - char *name_sub = "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:%d/intel-rapl:%d:%d/%s"; + char *name_base = "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:%d/"; + char *name_sub = "/sys/devices/virtual/powercap/intel-rapl/intel-rapl:%d/intel-rapl:%d:%s/"; for (unsigned int i = 0;; i++) { - snprintf(buffer, BUFFER_SIZE, name_base, i, "name"); - char *tmp = get_rapl_string(buffer); - - if (tmp == NULL) { - break; - } - append(tmp, i, MAX_HEADER); - snprintf(buffer, BUFFER_SIZE, name_base, i, "energy_uj"); - add_rapl_source(rapl, tmp, buffer); - free(tmp); - for (unsigned int j = 0;; j++) { - snprintf(buffer, BUFFER_SIZE, name_sub, i, i, j, "name"); - char *tmp_sub = get_rapl_string(buffer); + if(!add_rapl_source_from_str(rapl, name_base, i)) + break; - if (tmp_sub == NULL) { - break; - } + for (unsigned int j = 0;; j++) { + snprintf(buffer, BUFFER_SIZE, name_sub, i, i, "%d"); - append(tmp_sub, i, MAX_HEADER); - snprintf(buffer, BUFFER_SIZE, name_sub, i, i, j, "energy_uj"); - add_rapl_source(rapl, tmp_sub, buffer); + if(!add_rapl_source_from_str(rapl, buffer, j)) + break; - free(tmp_sub); - } + } } rapl->values = calloc(sizeof(uint64_t), rapl->nb); @@ -159,6 +172,13 @@ unsigned int get_rapl(uint64_t *results, void *ptr) IntelRapl *state = (IntelRapl *) ptr; _get_rapl(state->tmp_values, state); + fprintf(stderr, "RAPL\t"); + for (unsigned int i = 0; i < state->nb; i++) { + fprintf(stderr, "%" PRIu64 "\t", state->values[i]); + } + fprintf(stderr, "\n"); + + for (unsigned int i = 0; i < state->nb; i++) { results[i] = modulo_substraction(state->tmp_values[i], state->values[i]); }