From 75268cb70d656b96af03df1002b63a8b7abf5246 Mon Sep 17 00:00:00 2001 From: Tre' Jeter Date: Mon, 24 Jun 2024 14:20:57 -0700 Subject: [PATCH 1/4] Updated Variorum service with energy API --- src/services/variorum/Variorum.cpp | 80 +++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 24 deletions(-) diff --git a/src/services/variorum/Variorum.cpp b/src/services/variorum/Variorum.cpp index 05106cd79..d4d48f7db 100644 --- a/src/services/variorum/Variorum.cpp +++ b/src/services/variorum/Variorum.cpp @@ -30,41 +30,73 @@ using namespace cali; namespace { -// Power measurement function +// Energy measurement function std::tuple measure(const std::string& name) { - double power_watts; - json_t *power_obj = NULL; - char *s = NULL; + double energy_joules; + json_t *energy_obj = NULL; + char *s = NULL; - s = (char *) malloc(800 * sizeof(char)); + s = (char *) malloc(800 * sizeof(char)); - int ret = variorum_get_node_power_json(&s); - if (ret != 0) - { - std::cout << "Variorum JSON API failed" << std::endl; - uint64_t val; - return std::make_tuple(false, val); - } - - // TODO: Add error if name is an invalid JSON field - // TODO: Assume 1 rank/node for aggregation + int ret = variorum_get_energy_json(&s); + if (ret != 0) + { + std::cout << "Variorum Energy JSON API failed!" << std::endl; + uint64_t val; + return std::make_tuple(false, val); + } - // Extract and print values from JSON object - power_obj = json_loads(s, JSON_DECODE_ANY, NULL); - power_watts = json_real_value(json_object_get(power_obj, name.c_str())); + //Extract and print values from JSON object + energy_obj = json_loads(s, JSON_DECODE_ANY, NULL); + energy_joules = json_real_value(json_object_get(energy_obj, name.c_str())); - uint64_t val = (uint64_t)power_watts; + uint64_t val = (uint64_t)energy_joules; - // Deallocate the string - free(s); + //Deallocate the string + free(s); - // Deallocate JSON object - json_decref(power_obj); + //Deallocate JSON object + json_decref(energy_obj); - return std::make_tuple(true, val); + return std::make_tuple(true, val); } +//// Power measurement function +//std::tuple measure(const std::string& name) +//{ +// double power_watts; +// json_t *power_obj = NULL; +// char *s = NULL; +// +// s = (char *) malloc(800 * sizeof(char)); +// +// int ret = variorum_get_node_power_json(&s); +// if (ret != 0) +// { +// std::cout << "Variorum JSON API failed" << std::endl; +// uint64_t val; +// return std::make_tuple(false, val); +// } +// +// // TODO: Add error if name is an invalid JSON field +// // TODO: Assume 1 rank/node for aggregation +// +// // Extract and print values from JSON object +// power_obj = json_loads(s, JSON_DECODE_ANY, NULL); +// power_watts = json_real_value(json_object_get(power_obj, name.c_str())); +// +// uint64_t val = (uint64_t)power_watts; +// +// // Deallocate the string +// free(s); +// +// // Deallocate JSON object +// json_decref(power_obj); +// +// return std::make_tuple(true, val); +//} + // The VariorumService class reads a list of domains from the // CALI_VARIORUM_DOMAINS config variable. For each domain, it appends a // "measurement.val." entry (absolute value for a performance From a24de03d9f11e7c320ab312b511157c6973d348e Mon Sep 17 00:00:00 2001 From: Tre' Jeter Date: Wed, 26 Jun 2024 11:46:20 -0700 Subject: [PATCH 2/4] Updated "gotcha" files. Loaded proper compiler. --- ext/gotcha/src/gotcha.c | 6 ++++-- ext/gotcha/src/gotcha_dl.c | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/gotcha/src/gotcha.c b/ext/gotcha/src/gotcha.c index 480c1819f..da1c74783 100644 --- a/ext/gotcha/src/gotcha.c +++ b/ext/gotcha/src/gotcha.c @@ -239,7 +239,8 @@ struct Boundary { int find_relro_boundary(struct dl_phdr_info *info, size_t size, void *data) { struct Boundary *boundary = data; int found = 0; - for (int i = 0; i < info->dlpi_phnum; ++i) { + int i = 0; + for (i = 0; i < info->dlpi_phnum; ++i) { if (info->dlpi_phdr[i].p_type == PT_LOAD) { if (strcmp(boundary->l_name, info->dlpi_name) == 0 && boundary->load_addr == info->dlpi_addr) { @@ -249,7 +250,8 @@ int find_relro_boundary(struct dl_phdr_info *info, size_t size, void *data) { } } if (found) { - for (int i = 0; i < info->dlpi_phnum; ++i) { + int i = 0; + for (i = 0; i < info->dlpi_phnum; ++i) { if (info->dlpi_phdr[i].p_type == PT_GNU_RELRO) { boundary->start_addr = boundary->load_addr + info->dlpi_phdr[i].p_vaddr; boundary->end_addr = boundary->start_addr + info->dlpi_phdr[i].p_memsz; diff --git a/ext/gotcha/src/gotcha_dl.c b/ext/gotcha/src/gotcha_dl.c index 16e55b579..7f873b186 100644 --- a/ext/gotcha/src/gotcha_dl.c +++ b/ext/gotcha/src/gotcha_dl.c @@ -30,7 +30,8 @@ int lib_header_callback(struct dl_phdr_info *info, size_t size, void *data) { struct Addrs *addrs = data; const char *name = NULL; ElfW(Addr) load_address; - for (int i = 0; i < info->dlpi_phnum; ++i) { + int i = 0; + for (i = 0; i < info->dlpi_phnum; ++i) { if (info->dlpi_phdr[i].p_type == PT_LOAD) { ElfW(Addr) base_addr = info->dlpi_addr; ElfW(Addr) start_addr = base_addr + info->dlpi_phdr[i].p_vaddr; From 943b587040a613ab70516306be435563c266d48b Mon Sep 17 00:00:00 2001 From: Tre' Jeter Date: Wed, 26 Jun 2024 20:34:24 -0700 Subject: [PATCH 3/4] Removed original power measurement code --- src/services/variorum/Variorum.cpp | 35 ------------------------------ 1 file changed, 35 deletions(-) diff --git a/src/services/variorum/Variorum.cpp b/src/services/variorum/Variorum.cpp index d4d48f7db..cbbc0fd3e 100644 --- a/src/services/variorum/Variorum.cpp +++ b/src/services/variorum/Variorum.cpp @@ -62,41 +62,6 @@ std::tuple measure(const std::string& name) return std::make_tuple(true, val); } -//// Power measurement function -//std::tuple measure(const std::string& name) -//{ -// double power_watts; -// json_t *power_obj = NULL; -// char *s = NULL; -// -// s = (char *) malloc(800 * sizeof(char)); -// -// int ret = variorum_get_node_power_json(&s); -// if (ret != 0) -// { -// std::cout << "Variorum JSON API failed" << std::endl; -// uint64_t val; -// return std::make_tuple(false, val); -// } -// -// // TODO: Add error if name is an invalid JSON field -// // TODO: Assume 1 rank/node for aggregation -// -// // Extract and print values from JSON object -// power_obj = json_loads(s, JSON_DECODE_ANY, NULL); -// power_watts = json_real_value(json_object_get(power_obj, name.c_str())); -// -// uint64_t val = (uint64_t)power_watts; -// -// // Deallocate the string -// free(s); -// -// // Deallocate JSON object -// json_decref(power_obj); -// -// return std::make_tuple(true, val); -//} - // The VariorumService class reads a list of domains from the // CALI_VARIORUM_DOMAINS config variable. For each domain, it appends a // "measurement.val." entry (absolute value for a performance From 10e0873f279b3e4839b10544dcad46e63b08993c Mon Sep 17 00:00:00 2001 From: Tre' Jeter Date: Mon, 29 Jul 2024 11:09:02 -0700 Subject: [PATCH 4/4] Aiming to reproduce errors --- src/services/variorum/Variorum.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/services/variorum/Variorum.cpp b/src/services/variorum/Variorum.cpp index cbbc0fd3e..8a0ee12d4 100644 --- a/src/services/variorum/Variorum.cpp +++ b/src/services/variorum/Variorum.cpp @@ -34,6 +34,7 @@ namespace std::tuple measure(const std::string& name) { double energy_joules; + json_t *node_obj = NULL; json_t *energy_obj = NULL; char *s = NULL; @@ -49,7 +50,20 @@ std::tuple measure(const std::string& name) //Extract and print values from JSON object energy_obj = json_loads(s, JSON_DECODE_ANY, NULL); - energy_joules = json_real_value(json_object_get(energy_obj, name.c_str())); + void *iter = json_object_iter(energy_obj); + while (iter) + { + //hostname = json_object_iter_key(iter); + node_obj = json_object_iter_value(iter); + if (node_obj == NULL) + { + printf("JSON object not found"); + exit(0); + } + /* The following should return NULL after the first call per our object. */ + iter = json_object_iter_next(energy_obj, iter); + } + energy_joules = json_real_value(json_object_get(node_obj, name.c_str())); uint64_t val = (uint64_t)energy_joules; @@ -318,7 +332,7 @@ const ConfigSet::Entry VariorumService::s_configdata[] = { "List of domains to record", // short description // long description "List of domains to record (separated by ',')\n" - "Example: power_node_watts, power_socket_watts, power_gpu_watts, power_mem_watts" + "Example: energy_node_joules" }, ConfigSet::Terminator };