From 660f9807d0a906180dc31227b4c1ed744b2b2478 Mon Sep 17 00:00:00 2001 From: sahu Date: Wed, 9 Feb 2011 11:40:11 +0000 Subject: [PATCH] jedule binding to SD started git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9594 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- include/instr/jedule/jedule_events.h | 41 ++++ include/instr/jedule/jedule_output.h | 25 ++ include/instr/jedule/jedule_platform.h | 90 +++++++ include/instr/jedule/jedule_sd_binding.h | 15 ++ src/instr/jedule/jedule_events.c | 82 +++++++ src/instr/jedule/jedule_output.c | 231 ++++++++++++++++++ src/instr/jedule/jedule_platform.c | 283 +++++++++++++++++++++++ src/instr/jedule/jedule_sd_binding.c | 42 ++++ src/simdag/sd_global.c | 20 ++ src/simdag/sd_task.c | 4 + 10 files changed, 833 insertions(+) create mode 100644 include/instr/jedule/jedule_events.h create mode 100644 include/instr/jedule/jedule_output.h create mode 100644 include/instr/jedule/jedule_platform.h create mode 100644 include/instr/jedule/jedule_sd_binding.h create mode 100644 src/instr/jedule/jedule_events.c create mode 100644 src/instr/jedule/jedule_output.c create mode 100644 src/instr/jedule/jedule_platform.c create mode 100644 src/instr/jedule/jedule_sd_binding.c diff --git a/include/instr/jedule/jedule_events.h b/include/instr/jedule/jedule_events.h new file mode 100644 index 0000000000..4d5b295780 --- /dev/null +++ b/include/instr/jedule/jedule_events.h @@ -0,0 +1,41 @@ +/* + * jedule_events.h + * + * Created on: Nov 30, 2010 + * Author: sascha + */ + +#ifndef JEDULE_EVENTS_H_ +#define JEDULE_EVENTS_H_ + +#include "jedule_platform.h" + +#include "xbt/dynar.h" +#include "xbt/dict.h" + +struct jed_event { + int event_id; + char *name; + double start_time; + double end_time; + char *type; + xbt_dynar_t resource_subsets; + xbt_dynar_t characteristics_list; /* just a list of names (strings) */ + xbt_dict_t info_hash; /* key/value pairs */ +}; + +typedef struct jed_event s_jed_event_t, *jed_event_t; + +/************************************************************/ + +void create_jed_event(jed_event_t *event, char *name, double start_time, double end_time, char *type); + +void jed_event_free(jed_event_t event); + +void jed_event_add_resources(jed_event_t event, xbt_dynar_t host_selection); + +void jed_event_add_characteristic(jed_event_t event, char *characteristic); + +void jed_event_add_info(jed_event_t event, char *key, char *value); + +#endif /* JEDULE_EVENTS_H_ */ diff --git a/include/instr/jedule/jedule_output.h b/include/instr/jedule/jedule_output.h new file mode 100644 index 0000000000..fea8a47162 --- /dev/null +++ b/include/instr/jedule/jedule_output.h @@ -0,0 +1,25 @@ +/* + * jedule_output.h + * + * Created on: Nov 30, 2010 + * Author: sascha + */ + +#ifndef JEDULE_OUTPUT_H_ +#define JEDULE_OUTPUT_H_ + +#include "jedule_events.h" +#include "jedule_platform.h" + +xbt_dynar_t jedule_event_list; + +void init_jedule_output(); + +void cleanup_jedule(); + +void jedule_store_event(jed_event_t event); + +void write_jedule_output(char *filename, jedule_t jedule, + xbt_dynar_t event_list, xbt_dict_t meta_info_dict); + +#endif /* JEDULE_OUTPUT_H_ */ diff --git a/include/instr/jedule/jedule_platform.h b/include/instr/jedule/jedule_platform.h new file mode 100644 index 0000000000..f700c63263 --- /dev/null +++ b/include/instr/jedule/jedule_platform.h @@ -0,0 +1,90 @@ +/* + * jed_simgrid_platform.h + * + * Created on: Nov 30, 2010 + * Author: sascha + */ + +#ifndef JED_SIMGRID_PLATFORM_H_ +#define JED_SIMGRID_PLATFORM_H_ + +#include "xbt/dynar.h" +#include "xbt/hash.h" + +typedef struct jed_simgrid_container s_jed_simgrid_container_t, + *jed_simgrid_container_t; + + +struct jed_simgrid_container { + char *name; + xbt_dynar_t container_children; + jed_simgrid_container_t parent; + xbt_dynar_t resource_list; + xbt_dict_t name2id; + int last_id; + int is_lowest; +}; + + +/** + * selection of a subset of resources from the original set + * + */ +struct jed_res_subset { + jed_simgrid_container_t parent; + int start_idx; // start idx in resource_list of container + int nres; // number of resources spanning starting at start_idx +}; + +typedef struct jed_res_subset s_jed_res_subset_t, *jed_res_subset_t; + +struct jedule_struct { + jed_simgrid_container_t root_container; + xbt_dict_t jedule_meta_info; +}; + +typedef struct jedule_struct s_jedule_t, *jedule_t; + + +/*********************************************************/ + +void jed_create_jedule(jedule_t *jedule); + +void jed_free_jedule(jedule_t jedule); + +void jedule_add_meta_info(jedule_t jedule, char *key, char *value); + +void jed_simgrid_create_container(jed_simgrid_container_t *container, char *name); + +void jed_simgrid_add_container(jed_simgrid_container_t parent, + jed_simgrid_container_t child); + +void jed_simgrid_add_resources(jed_simgrid_container_t parent, + xbt_dynar_t host_names); + +/** + * + * it is assumed that the host_names in the entire system are unique + * that means that we don't need parent references + * + * subset_list must be allocated + * host_names is the list of host_names associated with an event + */ +void jed_simgrid_get_resource_selection_by_hosts(xbt_dynar_t subset_list, + xbt_dynar_t host_names); + +/* + global: + hash host_id -> container + + container: + hash host_id -> jed_host_id + + list <- [ jed_host_ids ] + list <- sort( list ) + list_chunks <- chunk( list ) -> [ 1, 3-5, 7-9 ] + +*/ + + +#endif /* JED_SIMGRID_PLATFORM_H_ */ diff --git a/include/instr/jedule/jedule_sd_binding.h b/include/instr/jedule/jedule_sd_binding.h new file mode 100644 index 0000000000..60f473a7a4 --- /dev/null +++ b/include/instr/jedule/jedule_sd_binding.h @@ -0,0 +1,15 @@ +/* + * jedule_sd_binding.h + * + * Created on: Dec 2, 2010 + * Author: sascha + */ + +#ifndef JEDULE_SD_BINDING_H_ +#define JEDULE_SD_BINDING_H_ + +void jedule_log_sd_event(SD_task_t task); + +void jedule_setup_platform(); + +#endif /* JEDULE_SD_BINDING_H_ */ diff --git a/src/instr/jedule/jedule_events.c b/src/instr/jedule/jedule_events.c new file mode 100644 index 0000000000..d781b38ee7 --- /dev/null +++ b/src/instr/jedule/jedule_events.c @@ -0,0 +1,82 @@ +/* + * jedule_events.c + * + * Created on: Nov 30, 2010 + * Author: sascha + */ + +#include +#include +#include + +#include "jedule_events.h" +#include "jedule_platform.h" + +#include "xbt/dict.h" +#include "xbt/dynar.h" +#include "xbt/asserts.h" + +void jed_event_add_resources(jed_event_t event, xbt_dynar_t host_selection) { + xbt_dynar_t resource_subset_list; + jed_res_subset_t res_set; + int i; + + resource_subset_list = xbt_dynar_new(sizeof(jed_res_subset_t), NULL); + + jed_simgrid_get_resource_selection_by_hosts(resource_subset_list, host_selection); + xbt_dynar_foreach(resource_subset_list, i, res_set) { + xbt_dynar_push(event->resource_subsets, &res_set); + } + + xbt_dynar_free(&resource_subset_list); +} + +void jed_event_add_characteristic(jed_event_t event, char *characteristic) { + xbt_assert( characteristic != NULL ); + xbt_dynar_push(event->characteristics_list, &characteristic); +} + + +void jed_event_add_info(jed_event_t event, char *key, char *value) { + char *val_cp; + + xbt_assert(key != NULL); + xbt_assert(value != NULL); + + val_cp = strdup(value); + xbt_dict_set(event->info_hash, key, val_cp, NULL); +} + + +void create_jed_event(jed_event_t *event, char *name, double start_time, + double end_time, char *type) { + + *event = (jed_event_t) calloc(1, sizeof(s_jed_event_t)); + (*event)->name = (char*) calloc(strlen(name) + 1, sizeof(char)); + strcpy((*event)->name, name); + + (*event)->start_time = start_time; + (*event)->end_time = end_time; + + (*event)->type = (char*) calloc(strlen(type) + 1, sizeof(char)); + strcpy((*event)->type, type); + + (*event)->resource_subsets = xbt_dynar_new(sizeof(jed_res_subset_t), NULL); + (*event)->characteristics_list = xbt_dynar_new(sizeof(char*), NULL); + (*event)->info_hash = xbt_dict_new(); + +} + + +void jed_event_free(jed_event_t event) { + + free(event->name); + free(event->type); + + xbt_dynar_free(&event->resource_subsets); + + xbt_dynar_free(&event->characteristics_list); + xbt_dict_free(&event->info_hash); + + free(event); +} diff --git a/src/instr/jedule/jedule_output.c b/src/instr/jedule/jedule_output.c new file mode 100644 index 0000000000..cf24c820ad --- /dev/null +++ b/src/instr/jedule/jedule_output.c @@ -0,0 +1,231 @@ +/* + * jedule_output.c + * + * Created on: Dec 1, 2010 + * Author: sascha + */ + + +#include +#include +#include + +#include "jedule_output.h" + +#include "xbt/dynar.h" +#include "xbt/asserts.h" + +/*********************************************************/ + +static FILE *jed_file; + +static void print_platform(jed_simgrid_container_t root_container); +static void print_container(jed_simgrid_container_t container); +static void print_resources(jed_simgrid_container_t resource_parent); +static void print_key_value_dict(xbt_dict_t meta_info_dict); +static void print_events(xbt_dynar_t event_list); +static void get_hierarchy_list(xbt_dynar_t hier_list, jed_simgrid_container_t container); + +/*********************************************************/ + + +static void get_hierarchy_list(xbt_dynar_t hier_list, jed_simgrid_container_t container) { + + xbt_assert( container != NULL ); + + if( container->parent != NULL ) { + + if( container->parent->container_children == NULL ) { + // we are in the last level + get_hierarchy_list(hier_list, container->parent); + + } else { + unsigned int i; + int child_nb = -1; + jed_simgrid_container_t child_container; + + xbt_dynar_foreach(container->parent->container_children, i, child_container) { + if( child_container == container ) { + child_nb = i; + break; + } + } + + xbt_assert( child_nb > - 1); + + xbt_dynar_insert_at(hier_list, 0, &child_nb); + + get_hierarchy_list(hier_list, container->parent); + } + } else { + int top_level = 0; + xbt_dynar_insert_at(hier_list, 0, &top_level); + } + +} + +static void print_key_value_dict(xbt_dict_t key_value_dict) { + xbt_dict_cursor_t cursor=NULL; + char *key,*data; + + xbt_dict_foreach(key_value_dict,cursor,key,data) { + fprintf(jed_file, "\n",key,data); + } +} + +static void print_container(jed_simgrid_container_t container) { + unsigned int i; + jed_simgrid_container_t child_container; + + xbt_assert( container != NULL ); + + fprintf(jed_file, "\n", container->name); + if( container->container_children != NULL ) { + xbt_dynar_foreach(container->container_children, i, child_container) { + print_container(child_container); + } + } else { + print_resources(container); + } + fprintf(jed_file, "\n"); +} + +static void print_resources(jed_simgrid_container_t resource_parent) { + int res_nb; + unsigned int i; + char *res_name; + xbt_assert( resource_parent->resource_list != NULL ); + + res_nb = xbt_dynar_length(resource_parent->resource_list); + + fprintf(jed_file, "resource_list, i, res_name) { + fprintf(jed_file, "%s", res_name); + if( i != res_nb-1 ) { + fprintf(jed_file, "|"); + } + } + fprintf(jed_file, "\" />\n"); +} + + +static void print_platform(jed_simgrid_container_t root_container) { + + fprintf(jed_file, "\n"); + print_container(root_container); + fprintf(jed_file, "\n"); +} + +static void print_event(jed_event_t event) { + unsigned int i; + jed_res_subset_t subset; + + + xbt_assert( event != NULL ); + xbt_assert( event->resource_subsets != NULL ); + + fprintf(jed_file, "\n"); + + + fprintf(jed_file, "\n", event->name); + fprintf(jed_file, "\n", event->start_time); + fprintf(jed_file, "\n", event->end_time); + fprintf(jed_file, "\n", event->type); + + fprintf(jed_file, "\n"); + + xbt_dynar_foreach(event->resource_subsets, i, subset) { + + int start = subset->start_idx; + int end = subset->start_idx + subset->nres - 1; + xbt_dynar_t hier_list; + unsigned int iter; + int number; + + hier_list = xbt_dynar_new(sizeof(int), NULL); + + //printf("subset start %d nres %d\n", subset->start_idx, subset->nres); + + //printf("parent %s\n", event->resource_selection[i]->parent->name); + get_hierarchy_list(hier_list, subset->parent); + + fprintf(jed_file, "