Store loom CPUs in thread metadata

This commit is contained in:
Rodrigo Arias 2024-09-10 10:56:19 +02:00
parent 1b95fa813b
commit 8e9cc34e5e
2 changed files with 58 additions and 49 deletions

View File

@ -35,9 +35,9 @@ check_version(JSON_Object *meta)
static int static int
has_cpus(JSON_Object *meta) has_cpus(JSON_Object *meta)
{ {
/* Only check for the "cpus" key, if it has zero elements is an error /* Only check for the "ovni.loom_cpus" key, if it has zero
* that will be reported later */ * elements is an error that will be reported later */
if (json_object_get_array(meta, "cpus") != NULL) if (json_object_dotget_array(meta, "ovni.loom_cpus") != NULL)
return 1; return 1;
return 0; return 0;
@ -46,7 +46,7 @@ has_cpus(JSON_Object *meta)
static int static int
load_cpus(struct loom *loom, JSON_Object *meta) load_cpus(struct loom *loom, JSON_Object *meta)
{ {
JSON_Array *cpuarray = json_object_get_array(meta, "cpus"); JSON_Array *cpuarray = json_object_dotget_array(meta, "ovni.loom_cpus");
if (cpuarray == NULL) { if (cpuarray == NULL) {
err("cannot find 'cpus' array"); err("cannot find 'cpus' array");
return -1; return -1;

View File

@ -17,6 +17,14 @@
#include "ovni.h" #include "ovni.h"
#include "parson.h" #include "parson.h"
#include "version.h" #include "version.h"
#include "utlist.h"
struct ovni_rcpu {
int index;
int phyid;
struct ovni_rcpu *next;
struct ovni_rcpu *prev;
};
/* State of each thread on runtime */ /* State of each thread on runtime */
struct ovni_rthread { struct ovni_rthread {
@ -35,6 +43,8 @@ struct ovni_rthread {
/* Buffer to write events */ /* Buffer to write events */
uint8_t *evbuf; uint8_t *evbuf;
struct ovni_rcpu *cpus;
JSON_Value *meta; JSON_Value *meta;
}; };
@ -54,7 +64,6 @@ struct ovni_rproc {
int app; int app;
int pid; int pid;
char loom[OVNI_MAX_HOSTNAME]; char loom[OVNI_MAX_HOSTNAME];
int ncpus;
clockid_t clockid; clockid_t clockid;
int rank_set; int rank_set;
int rank; int rank;
@ -182,53 +191,14 @@ ovni_add_cpu(int index, int phyid)
if (rproc.meta == NULL) if (rproc.meta == NULL)
die("metadata not initialized"); die("metadata not initialized");
JSON_Object *meta = json_value_get_object(rproc.meta); struct ovni_rcpu *cpu = malloc(sizeof(*cpu));
if (meta == NULL)
die("json_value_get_object() failed");
int first_time = 0;
/* Find the CPU array and create it if needed */
JSON_Array *cpuarray = json_object_dotget_array(meta, "cpus");
if (cpuarray == NULL) {
JSON_Value *value = json_value_init_array();
if (value == NULL)
die("json_value_init_array() failed");
cpuarray = json_array(value);
if (cpuarray == NULL)
die("json_array() failed");
first_time = 1;
}
JSON_Value *valcpu = json_value_init_object();
if (valcpu == NULL)
die("json_value_init_object() failed");
JSON_Object *cpu = json_object(valcpu);
if (cpu == NULL) if (cpu == NULL)
die("json_object() failed"); die("malloc failed:");
if (json_object_set_number(cpu, "index", index) != 0) cpu->index = index;
die("json_object_set_number() failed"); cpu->phyid = phyid;
if (json_object_set_number(cpu, "phyid", phyid) != 0) DL_APPEND(rthread.cpus, cpu);
die("json_object_set_number() failed");
if (json_array_append_value(cpuarray, valcpu) != 0)
die("json_array_append_value() failed");
if (first_time) {
JSON_Value *value = json_array_get_wrapping_value(cpuarray);
if (value == NULL)
die("json_array_get_wrapping_value() failed");
if (json_object_set_value(meta, "cpus", value) != 0)
die("json_object_set_value failed");
}
} }
static void static void
@ -619,6 +589,40 @@ set_thread_rank(JSON_Object *meta)
die("json_object_set_number for nranks failed"); die("json_object_set_number for nranks failed");
} }
static void
set_thread_cpus(JSON_Object *meta)
{
JSON_Value *value = json_value_init_array();
if (value == NULL)
die("json_value_init_array() failed");
JSON_Array *cpuarray = json_array(value);
if (cpuarray == NULL)
die("json_array() failed");
for (struct ovni_rcpu *c = rthread.cpus; c; c = c->next) {
JSON_Value *valcpu = json_value_init_object();
if (valcpu == NULL)
die("json_value_init_object() failed");
JSON_Object *cpu = json_object(valcpu);
if (cpu == NULL)
die("json_object() failed");
if (json_object_set_number(cpu, "index", c->index) != 0)
die("json_object_set_number() failed");
if (json_object_set_number(cpu, "phyid", c->phyid) != 0)
die("json_object_set_number() failed");
if (json_array_append_value(cpuarray, valcpu) != 0)
die("json_array_append_value() failed");
}
if (json_object_dotset_value(meta, "ovni.loom_cpus", value) != 0)
die("json_object_dotset_value failed");
}
void void
ovni_thread_free(void) ovni_thread_free(void)
{ {
@ -636,6 +640,11 @@ ovni_thread_free(void)
if (rproc.rank_set) if (rproc.rank_set)
set_thread_rank(meta); set_thread_rank(meta);
/* It can happen there are no CPUs defined if there is another
* process in the loom that defines them. */
if (rthread.cpus)
set_thread_cpus(meta);
/* Mark it finished so we can detect partial streams */ /* Mark it finished so we can detect partial streams */
if (json_object_dotset_number(meta, "ovni.finished", 1) != 0) if (json_object_dotset_number(meta, "ovni.finished", 1) != 0)
die("json_object_dotset_string failed"); die("json_object_dotset_string failed");