static void _get_all_task_series(FILE *fp, bool hd, hid_t jgid_step, int stepx) { hid_t jgid_tasks, jgid_task = 0, jgid_nodes, jgid_node; H5G_info_t group_info; int ntasks,itx, tid; uint64_t *task_id; char **task_node_name; /* Node Name for each task */ char **tod = NULL; /* Date time at each sample */ char **series_name; /* Node Names */ double **all_series; /* Pointers to all sampled for each node */ double *et = NULL; /* Elapsed time at each sample */ uint64_t *series_smp; /* Number of samples in this series */ int nnodes, ndx, len, nsmp = 0, nitem = -1; char jgrp_node_name[MAX_GROUP_NAME+1]; char jgrp_task_name[MAX_GROUP_NAME+1]; char buf[MAX_GROUP_NAME+1]; void* series_data = NULL; hdf5_api_ops_t* ops; jgid_nodes = get_group(jgid_step, GRP_NODES); if (jgid_nodes < 0) fatal("Failed to open group %s", GRP_NODES); jgid_tasks = get_group(jgid_step, GRP_TASKS); if (jgid_tasks < 0) fatal("No tasks in step %d", stepx); H5Gget_info(jgid_tasks, &group_info); ntasks = (int) group_info.nlinks; if (ntasks <= 0) fatal("No tasks in step %d", stepx); task_id = xmalloc(ntasks*sizeof(uint64_t)); if (task_id == NULL) fatal("Failed to get memory for task_ids"); task_node_name = xmalloc(ntasks*sizeof(char*)); if (task_node_name == NULL) fatal("Failed to get memory for task_node_names"); for (itx = 0; itx<ntasks; itx++) { // Get the name of the group. len = H5Lget_name_by_idx(jgid_tasks, ".", H5_INDEX_NAME, H5_ITER_INC, itx, buf, MAX_GROUP_NAME, H5P_DEFAULT); if ((len > 0) && (len < MAX_GROUP_NAME)) { jgid_task = H5Gopen(jgid_tasks, buf, H5P_DEFAULT); if (jgid_task < 0) fatal("Failed to open %s", buf); } else fatal("Illegal task name %s",buf); task_id[itx] = get_int_attribute(jgid_task, ATTR_TASKID); task_node_name[itx] = get_string_attribute(jgid_task, ATTR_NODENAME); H5Gclose(jgid_task); } H5Gclose(jgid_tasks); nnodes = get_int_attribute(jgid_step, ATTR_NNODES); // allocate node arrays series_smp = (uint64_t*) xmalloc(ntasks*(sizeof(uint64_t))); if (series_smp == NULL) { fatal("Failed to get memory for node_samples"); return; /* Fix for CLANG false positive */ } series_name = (char**) xmalloc(ntasks*(sizeof(char*))); if (series_name == NULL) { fatal("Failed to get memory for series_name"); return; /* Fix for CLANG false positive */ } all_series = (double**) xmalloc(ntasks*(sizeof(double*))); if (all_series == NULL) { fatal("Failed to get memory for all_series"); return; /* Fix for CLANG false positive */ } for (ndx=0; ndx<nnodes; ndx++) { len = H5Lget_name_by_idx(jgid_nodes, ".", H5_INDEX_NAME, H5_ITER_INC, ndx, jgrp_node_name, MAX_GROUP_NAME, H5P_DEFAULT); if ((len < 0) || (len > MAX_GROUP_NAME)) fatal("Invalid node name=%s", jgrp_node_name); jgid_node = get_group(jgid_nodes, jgrp_node_name); if (jgid_node < 0) fatal("Failed to open group %s", jgrp_node_name); for (itx = 0; itx<ntasks; itx++) { if (strcmp(jgrp_node_name, task_node_name[itx]) != 0) continue; tid = task_id[itx]; series_name[itx] = xstrdup_printf("%s_%d %s", GRP_TASK,tid,jgrp_node_name); sprintf(jgrp_task_name,"%s_%d",GRP_TASK, tid); ops = NULL; nitem = 0; series_data = _get_series_data(jgid_node, jgrp_task_name, &ops, &nitem); if (series_data==NULL || nitem==0 || ops==NULL) { if (ops != NULL) xfree(ops); continue; } all_series[itx] = ops->get_series_values( params.data_item, series_data, nitem); if (!all_series[ndx]) fatal("No data item %s",params.data_item); series_smp[itx] = nitem; if (nsmp == 0) { nsmp = nitem; tod = ops->get_series_tod(series_data, nitem); et = ops->get_series_values("time", series_data, nitem); } else { if (nitem > nsmp) { // new largest number of samples _delete_string_list(tod, nsmp); xfree(et); nsmp = nitem; tod = ops->get_series_tod(series_data, nitem); et = ops->get_series_values("time", series_data, nitem); } } xfree(ops); xfree(series_data); } H5Gclose(jgid_node); } if (nsmp == 0) { // May be bad series name info("No values %s for series %s found in step %d", params.data_item,params.series, stepx); } else { _series_analysis(fp, hd, stepx, ntasks, nsmp, series_name, tod, et, all_series, series_smp); } for (itx=0; itx<ntasks; itx++) { xfree(all_series[itx]); } xfree(series_name); xfree(all_series); xfree(series_smp); _delete_string_list(tod, nsmp); xfree(et); _delete_string_list(task_node_name, ntasks); xfree(task_id); H5Gclose(jgid_nodes); }
static void _extract_data() { hid_t fid_job, jgid_root, jgid_step, jgid_nodes, jgid_node, jgid_level; int nsteps, nnodes, stepx, isx, len; char jgrp_step_name[MAX_GROUP_NAME+1]; char jgrp_node_name[MAX_GROUP_NAME+1]; bool header; FILE* fp = fopen(params.output, "w"); if (fp == NULL) { error("Failed to create output file %s -- %m", params.output); } fid_job = H5Fopen(params.input, H5F_ACC_RDONLY, H5P_DEFAULT); if (fid_job < 0) { error("Failed to open %s", params.input); return; } jgid_root = H5Gopen(fid_job, "/", H5P_DEFAULT); if (jgid_root < 0) { H5Fclose(fid_job); error("Failed to open root"); return; } nsteps = get_int_attribute(jgid_root, ATTR_NSTEPS); for (stepx=0; stepx<nsteps; stepx++) { if ((params.step_id != -1) && (stepx != params.step_id)) continue; sprintf(jgrp_step_name, "%s_%d", GRP_STEP, stepx); jgid_step = get_group(jgid_root, jgrp_step_name); if (jgid_step < 0) { error("Failed to open group %s", jgrp_step_name); continue; } if (params.level && !strncasecmp(params.level, "Node:", 5)) { nnodes = get_int_attribute(jgid_step, ATTR_NNODES); jgid_nodes = get_group(jgid_step, GRP_NODES); if (jgid_nodes < 0) { H5Gclose(jgid_step); error("Failed to open group %s", GRP_NODES); continue; } len = H5Lget_name_by_idx(jgid_nodes, ".", H5_INDEX_NAME, H5_ITER_INC, 0, jgrp_node_name, MAX_GROUP_NAME, H5P_DEFAULT); if ((len < 0) || (len > MAX_GROUP_NAME)) { H5Gclose(jgid_nodes); H5Gclose(jgid_step); error("Invalid node name %s", jgrp_node_name); continue; } jgid_node = get_group(jgid_nodes, jgrp_node_name); if (jgid_node < 0) { H5Gclose(jgid_nodes); H5Gclose(jgid_step); info("Failed to open group %s", jgrp_node_name); continue; } jgid_level = _get_series_parent(jgid_node); if (jgid_level == -1) { H5Gclose(jgid_node); H5Gclose(jgid_nodes); H5Gclose(jgid_step); continue; } _get_series_names(jgid_level); H5Gclose(jgid_level); H5Gclose(jgid_node); if (!params.series || !strcmp(params.series, "*")) { for (isx=0; isx<num_series; isx++) { _extract_node_level( fp, stepx, jgid_nodes, nnodes, true, series_names[isx]); } } else if (!strcmp(params.series, GRP_TASKS)) { header = true; for (isx=0; isx<num_series; isx++) { if (strstr(series_names[isx], GRP_TASK)) { _extract_node_level( fp, stepx, jgid_nodes, nnodes, header, series_names[isx]); header = false; } } } else { _extract_node_level(fp, stepx, jgid_nodes, nnodes, true, params.series); } _delete_string_list(series_names, num_series); series_names = NULL; num_series = 0; H5Gclose(jgid_nodes); } else { error("%s is an illegal level", params.level); } H5Gclose(jgid_step); } H5Gclose(jgid_root); H5Fclose(fid_job); fclose(fp); }
static void _get_all_node_series(FILE *fp, bool hd, hid_t jgid_step, int stepx) { char **tod = NULL; // Date time at each sample char **node_name; // Node Names double **all_series; // Pointers to all sampled for each node double *et = NULL; // Elapsed time at each sample uint64_t *series_smp; // Number of samples in this series hid_t jgid_nodes, jgid_node; int nnodes, ndx, len, nsmp = 0, nitem = -1; char jgrp_node_name[MAX_GROUP_NAME+1]; void* series_data = NULL; hdf5_api_ops_t* ops; nnodes = get_int_attribute(jgid_step, ATTR_NNODES); // allocate node arrays series_smp = xmalloc(nnodes * (sizeof(uint64_t))); if (series_smp == NULL) { fatal("Failed to get memory for node_samples"); return; /* fix for CLANG false positive */ } node_name = xmalloc(nnodes * (sizeof(char*))); if (node_name == NULL) { fatal("Failed to get memory for node_name"); return; /* fix for CLANG false positive */ } all_series = xmalloc(nnodes * (sizeof(double*))); if (all_series == NULL) { fatal("Failed to get memory for all_series"); return; /* fix for CLANG false positive */ } jgid_nodes = get_group(jgid_step, GRP_NODES); if (jgid_nodes < 0) fatal("Failed to open group %s", GRP_NODES); for (ndx=0; ndx<nnodes; ndx++) { len = H5Lget_name_by_idx(jgid_nodes, ".", H5_INDEX_NAME, H5_ITER_INC, ndx, jgrp_node_name, MAX_GROUP_NAME, H5P_DEFAULT); if ((len < 0) || (len > MAX_GROUP_NAME)) { debug("Invalid node name=%s", jgrp_node_name); continue; } node_name[ndx] = xstrdup(jgrp_node_name); jgid_node = get_group(jgid_nodes, jgrp_node_name); if (jgid_node < 0) { debug("Failed to open group %s", jgrp_node_name); continue; } ops = NULL; nitem = 0; series_data = _get_series_data(jgid_node, params.series, &ops, &nitem); if (series_data==NULL || nitem==0 || ops==NULL) { if (ops != NULL) xfree(ops); continue; } all_series[ndx] = ops->get_series_values( params.data_item, series_data, nitem); if (!all_series[ndx]) fatal("No data item %s",params.data_item); series_smp[ndx] = nitem; if (ndx == 0) { nsmp = nitem; tod = ops->get_series_tod(series_data, nitem); et = ops->get_series_values("time", series_data, nitem); } else { if (nitem > nsmp) { // new largest number of samples _delete_string_list(tod, nsmp); xfree(et); nsmp = nitem; tod = ops->get_series_tod(series_data, nitem); et = ops->get_series_values("time", series_data, nitem); } } xfree(ops); xfree(series_data); H5Gclose(jgid_node); } if (nsmp == 0) { // May be bad series name info("No values %s for series %s found in step %d", params.data_item,params.series, stepx); } else { _series_analysis(fp, hd, stepx, nnodes, nsmp, node_name, tod, et, all_series, series_smp); } for (ndx=0; ndx<nnodes; ndx++) { xfree(node_name[ndx]); xfree(all_series[ndx]); } xfree(node_name); xfree(all_series); xfree(series_smp); _delete_string_list(tod, nsmp); xfree(et); H5Gclose(jgid_nodes); }