Write .pcf and .row files for the breakdown

This commit is contained in:
Rodrigo Arias 2023-03-08 18:11:56 +01:00 committed by Rodrigo Arias Mallo
parent e838d687f0
commit 0134ceee9d
4 changed files with 63 additions and 1 deletions

View File

@ -38,7 +38,8 @@ model_nanos6_breakdown_create(struct emu *emu)
/* Count phy cpus */ /* Count phy cpus */
struct system *sys = &emu->system; struct system *sys = &emu->system;
int nphycpus = sys->ncpus - sys->nlooms; int64_t nphycpus = sys->ncpus - sys->nlooms;
bemu->nphycpus = nphycpus;
/* Create a new Paraver trace */ /* Create a new Paraver trace */
struct recorder *rec = &emu->recorder; struct recorder *rec = &emu->recorder;
@ -211,3 +212,55 @@ model_nanos6_breakdown_connect(struct emu *emu)
return 0; return 0;
} }
int
model_nanos6_breakdown_finish(struct emu *emu,
const struct pcf_value_label (**labels)[])
{
if (emu->args.breakdown == 0)
return 0;
struct nanos6_emu *memu = EXT(emu, '6');
struct breakdown_emu *bemu = &memu->brk;
struct pcf *pcf = pvt_get_pcf(bemu->pvt);
long typeid = PRV_NANOS6_BREAKDOWN;
char label[] = "CPU: Nanos6 Runtime/Idle/Task breakdown";
struct pcf_type *pcftype = pcf_add_type(pcf, typeid, label);
const struct pcf_value_label *v = NULL;
/* Emit subsystem values */
for (v = *labels[CH_SUBSYSTEM]; v->label; v++)
pcf_add_value(pcftype, v->value, v->label);
/* Emit idle values */
for (v = *labels[CH_IDLE]; v->label; v++)
pcf_add_value(pcftype, v->value, v->label);
/* Emit task_type values */
struct system *sys = &emu->system;
for (struct proc *p = sys->procs; p; p = p->gnext) {
struct nanos6_proc *proc = EXT(p, '6');
struct task_info *info = &proc->task_info;
if (task_create_pcf_types(pcftype, info->types) != 0) {
err("task_create_pcf_types failed");
return -1;
}
}
/* Also populate the row labels */
struct prf *prf = pvt_get_prf(bemu->pvt);
for (int64_t row = 0; row < bemu->nphycpus; row++) {
char name[128];
if (snprintf(name, 128, "~CPU %3ld", bemu->nphycpus - row) >= 128) {
err("label too long");
return -1;
}
if (prf_add(prf, row, name) != 0) {
err("prf_add failed for %s", name);
return -1;
}
}
return 0;
}

View File

@ -45,6 +45,7 @@ struct breakdown_cpu {
}; };
struct breakdown_emu { struct breakdown_emu {
int64_t nphycpus;
struct sort sort; struct sort sort;
struct pvt *pvt; struct pvt *pvt;
}; };

View File

@ -10,6 +10,7 @@
#include "model_cpu.h" #include "model_cpu.h"
#include "model_thread.h" #include "model_thread.h"
#include "breakdown.h" #include "breakdown.h"
#include "pv/pcf.h"
/* Private enums */ /* Private enums */
@ -96,5 +97,7 @@ int model_nanos6_finish(struct emu *emu);
int model_nanos6_breakdown_create(struct emu *emu); int model_nanos6_breakdown_create(struct emu *emu);
int model_nanos6_breakdown_connect(struct emu *emu); int model_nanos6_breakdown_connect(struct emu *emu);
int model_nanos6_breakdown_finish(struct emu *emu,
const struct pcf_value_label (**labels)[]);
#endif /* NANOS6_PRIV_H */ #endif /* NANOS6_PRIV_H */

View File

@ -393,6 +393,11 @@ model_nanos6_finish(struct emu *emu)
return -1; return -1;
} }
if (model_nanos6_breakdown_finish(emu, pcf_labels) != 0) {
err("model_nanos6_breakdown_finish failed");
return -1;
}
/* When running in linter mode perform additional checks */ /* When running in linter mode perform additional checks */
if (emu->args.linter_mode && end_lint(emu) != 0) { if (emu->args.linter_mode && end_lint(emu) != 0) {
err("end_lint failed"); err("end_lint failed");