From: sahu Date: Wed, 9 Feb 2011 11:40:14 +0000 (+0000) Subject: added jedule output to SimDAG X-Git-Tag: v3.6_beta2~334 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/0de7df8a3bc351fdff4c4a3e106608b15c842143 added jedule output to SimDAG git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9595 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/buildtools/Cmake/CompleteInFiles.cmake b/buildtools/Cmake/CompleteInFiles.cmake index 1d7637622e..48577c5edc 100644 --- a/buildtools/Cmake/CompleteInFiles.cmake +++ b/buildtools/Cmake/CompleteInFiles.cmake @@ -94,6 +94,10 @@ if(enable_tracing) SET(HAVE_TRACING 1) endif(enable_tracing) +if(enable_jedule) + SET(HAVE_JEDULE 1) +endif(enable_jedule) + if(enable_latency_bound_tracking) SET(HAVE_LATENCY_BOUND_TRACKING 1) else(enable_latency_bound_tracking) diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 321c436452..a32ed9d356 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -316,6 +316,18 @@ set(TRACING_SRC src/instr/instr_private.h ) + +set(JEDULE_SRC + include/instr/jedule/jedule_events.h + include/instr/jedule/jedule_output.h + include/instr/jedule/jedule_platform.h + include/instr/jedule/jedule_sd_binding.h + src/instr/jedule/jedule_events.c + src/instr/jedule/jedule_output.c + src/instr/jedule/jedule_platform.c + src/instr/jedule/jedule_sd_binding.c +) + set(RUBY_SRC src/simix/smx_context_ruby.c src/bindings/ruby/rb_msg_process.c @@ -480,6 +492,7 @@ set(simgrid_sources ${GRAS_COMMON_SRC} ${GRAS_SG_SRC} ${AMOK_SRC} + ${JEDULE_SRC} ) if(HAVE_MC) diff --git a/buildtools/Cmake/Option.cmake b/buildtools/Cmake/Option.cmake index 1e27d008e2..c7d2db7428 100644 --- a/buildtools/Cmake/Option.cmake +++ b/buildtools/Cmake/Option.cmake @@ -39,6 +39,7 @@ option(enable_memcheck "Enable memcheck." off) option(enable_print_message "Enable print message during config." off) option(enable_model-checking "" off) option(enable_lib_static "" off) +option(enable_jedule "Jedule output of SimDAG." off) if(enable_supernovae AND enable_model-checking) set(enable_model-checking false CACHE TYPE INTERNAL FORCE) diff --git a/buildtools/Cmake/PrintArgs.cmake b/buildtools/Cmake/PrintArgs.cmake index a3b6001e4e..be1d029dc4 100644 --- a/buildtools/Cmake/PrintArgs.cmake +++ b/buildtools/Cmake/PrintArgs.cmake @@ -120,6 +120,7 @@ message(" Maintainer mode: ${enable_maintainer_mode}") message(" Supernovae mode: ${enable_supernovae}") message(" Model checking : ${enable_model-checking}") message(" Tracing mode : ${enable_tracing}") +message(" Jedule mode : ${enable_jedule}") message(" Latency bound : ${enable_latency_bound_tracking}") message(" Graphviz mode : ${HAVE_GRAPHVIZ}") message("") diff --git a/include/instr/jedule/jedule_events.h b/include/instr/jedule/jedule_events.h index 4d5b295780..d2d6a976f8 100644 --- a/include/instr/jedule/jedule_events.h +++ b/include/instr/jedule/jedule_events.h @@ -8,11 +8,16 @@ #ifndef JEDULE_EVENTS_H_ #define JEDULE_EVENTS_H_ -#include "jedule_platform.h" +#include "simgrid_config.h" #include "xbt/dynar.h" #include "xbt/dict.h" +#include "instr/jedule/jedule_platform.h" + + +#ifdef HAVE_JEDULE + struct jed_event { int event_id; char *name; @@ -38,4 +43,6 @@ 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 + #endif /* JEDULE_EVENTS_H_ */ diff --git a/include/instr/jedule/jedule_output.h b/include/instr/jedule/jedule_output.h index fea8a47162..f75d699979 100644 --- a/include/instr/jedule/jedule_output.h +++ b/include/instr/jedule/jedule_output.h @@ -8,18 +8,26 @@ #ifndef JEDULE_OUTPUT_H_ #define JEDULE_OUTPUT_H_ +#include "simgrid_config.h" + +#include + #include "jedule_events.h" #include "jedule_platform.h" -xbt_dynar_t jedule_event_list; +#ifdef HAVE_JEDULE -void init_jedule_output(); +extern xbt_dynar_t jedule_event_list; -void cleanup_jedule(); +void jedule_init_output(); + +void jedule_cleanup_output(); void jedule_store_event(jed_event_t event); -void write_jedule_output(char *filename, jedule_t jedule, +void write_jedule_output(FILE *file, jedule_t jedule, xbt_dynar_t event_list, xbt_dict_t meta_info_dict); +#endif + #endif /* JEDULE_OUTPUT_H_ */ diff --git a/include/instr/jedule/jedule_platform.h b/include/instr/jedule/jedule_platform.h index f700c63263..8999e03d7b 100644 --- a/include/instr/jedule/jedule_platform.h +++ b/include/instr/jedule/jedule_platform.h @@ -8,9 +8,13 @@ #ifndef JED_SIMGRID_PLATFORM_H_ #define JED_SIMGRID_PLATFORM_H_ +#include "simgrid_config.h" + #include "xbt/dynar.h" #include "xbt/hash.h" +#ifdef HAVE_JEDULE + typedef struct jed_simgrid_container s_jed_simgrid_container_t, *jed_simgrid_container_t; @@ -86,5 +90,7 @@ void jed_simgrid_get_resource_selection_by_hosts(xbt_dynar_t subset_list, */ +#endif + #endif /* JED_SIMGRID_PLATFORM_H_ */ diff --git a/include/instr/jedule/jedule_sd_binding.h b/include/instr/jedule/jedule_sd_binding.h index 60f473a7a4..4a8b700823 100644 --- a/include/instr/jedule/jedule_sd_binding.h +++ b/include/instr/jedule/jedule_sd_binding.h @@ -8,8 +8,25 @@ #ifndef JEDULE_SD_BINDING_H_ #define JEDULE_SD_BINDING_H_ +#include "simgrid_config.h" + +#include "simdag/private.h" +#include "simdag/datatypes.h" +#include "simdag/simdag.h" + +#ifdef HAVE_JEDULE + void jedule_log_sd_event(SD_task_t task); void jedule_setup_platform(); +void jedule_sd_init(); + +void jedule_sd_cleanup(); + +void jedule_sd_dump(); + #endif /* JEDULE_SD_BINDING_H_ */ + + +#endif diff --git a/include/simgrid_config.h.in b/include/simgrid_config.h.in index 3db21172c0..eea543b794 100644 --- a/include/simgrid_config.h.in +++ b/include/simgrid_config.h.in @@ -101,6 +101,9 @@ XBT_PUBLIC(char *) bprintf(const char *fmt, ...) _XBT_GNUC_PRINTF(1, 2); /* Tracing SimGrid */ #cmakedefine HAVE_TRACING @HAVE_TRACING@ +/* Jedule output */ +#cmakedefine HAVE_JEDULE @HAVE_JEDULE@ + /* Tracking of latency bound */ #cmakedefine HAVE_LATENCY_BOUND_TRACKING @HAVE_LATENCY_BOUND_TRACKING@ diff --git a/src/instr/jedule/jedule_events.c b/src/instr/jedule/jedule_events.c index d781b38ee7..7f770004c8 100644 --- a/src/instr/jedule/jedule_events.c +++ b/src/instr/jedule/jedule_events.c @@ -9,13 +9,15 @@ #include #include -#include "jedule_events.h" -#include "jedule_platform.h" - #include "xbt/dict.h" #include "xbt/dynar.h" #include "xbt/asserts.h" +#include "instr/jedule/jedule_events.h" +#include "instr/jedule/jedule_platform.h" + +#ifdef HAVE_JEDULE + 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; @@ -80,3 +82,5 @@ void jed_event_free(jed_event_t event) { free(event); } + +#endif diff --git a/src/instr/jedule/jedule_output.c b/src/instr/jedule/jedule_output.c index cf24c820ad..52a2cdda48 100644 --- a/src/instr/jedule/jedule_output.c +++ b/src/instr/jedule/jedule_output.c @@ -10,13 +10,17 @@ #include #include -#include "jedule_output.h" +#include "instr/jedule/jedule_output.h" #include "xbt/dynar.h" #include "xbt/asserts.h" +#ifdef HAVE_JEDULE + /*********************************************************/ +xbt_dynar_t jedule_event_list; + static FILE *jed_file; static void print_platform(jed_simgrid_container_t root_container); @@ -68,8 +72,10 @@ 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); + if( key_value_dict != NULL ) { + xbt_dict_foreach(key_value_dict,cursor,key,data) { + fprintf(jed_file, "\n",key,data); + } } } @@ -191,13 +197,12 @@ static void print_events(xbt_dynar_t event_list) { } -void write_jedule_output(char *filename, jedule_t jedule, +void write_jedule_output(FILE *file, jedule_t jedule, xbt_dynar_t event_list, xbt_dict_t meta_info_dict) { - xbt_assert( filename != NULL ); +// xbt_assert( jed_file != NULL ); - jed_file = fopen(filename, "w"); - xbt_assert( jed_file != NULL ); + jed_file = file; fprintf(jed_file, "\n"); @@ -211,15 +216,13 @@ void write_jedule_output(char *filename, jedule_t jedule, fprintf(jed_file, "\n"); - fclose(jed_file); - } -void init_jedule_output() { +void jedule_init_output() { jedule_event_list = xbt_dynar_new(sizeof(jed_event_t), NULL); } -void cleanup_jedule() { +void jedule_cleanup_output() { xbt_dynar_free(&jedule_event_list); } @@ -228,4 +231,4 @@ void jedule_store_event(jed_event_t event) { xbt_dynar_push(jedule_event_list, &event); } - +#endif diff --git a/src/instr/jedule/jedule_platform.c b/src/instr/jedule/jedule_platform.c index 9b21d5cf7e..04d31b1277 100644 --- a/src/instr/jedule/jedule_platform.c +++ b/src/instr/jedule/jedule_platform.c @@ -10,7 +10,9 @@ #include "xbt/asserts.h" #include "xbt/dynar.h" -#include "jedule_platform.h" +#include "instr/jedule/jedule_platform.h" + +#ifdef HAVE_JEDULE /********************************************************************/ @@ -30,7 +32,9 @@ static void jed_free_container(jed_simgrid_container_t container); /********************************************************************/ static int compare_hostnames(const void *host1, const void *host2) { - return strcmp ((char*)host1, (char*)host2); + const char *hp1 = *((const char**) host1); + const char *hp2 = *((const char**) host2); + return strcmp (hp1, hp2); } static int compare_ids(const void *num1, const void *num2) { @@ -95,7 +99,6 @@ void jed_simgrid_add_resources(jed_simgrid_container_t parent, parent->last_id = 0; parent->resource_list = xbt_dynar_new(sizeof(char *), NULL); - xbt_dynar_sort (host_names, &compare_hostnames); xbt_dynar_foreach(host_names, iter, host_name) { @@ -280,4 +283,4 @@ void jed_free_jedule(jedule_t jedule) { xbt_dict_free(&container_name2container); } - +#endif diff --git a/src/instr/jedule/jedule_sd_binding.c b/src/instr/jedule/jedule_sd_binding.c index a1b4e56042..957989ff17 100644 --- a/src/instr/jedule/jedule_sd_binding.c +++ b/src/instr/jedule/jedule_sd_binding.c @@ -6,9 +6,23 @@ */ +#include + #include "xbt/asserts.h" #include "xbt/dynar.h" +#include "surf/surf_private.h" +#include "surf/surf.h" + +#include "instr/jedule/jedule_sd_binding.h" +#include "instr/jedule/jedule_events.h" +#include "instr/jedule/jedule_platform.h" +#include "instr/jedule/jedule_output.h" + +#ifdef HAVE_JEDULE + +jedule_t jedule; + void jedule_log_sd_event(SD_task_t task) { xbt_dynar_t host_list; jed_event_t event; @@ -23,20 +37,90 @@ void jedule_log_sd_event(SD_task_t task) { xbt_dynar_push(host_list, &hostname); } - create_jed_event(&event, SD_task_get_name(task), task->start_time, - task->finish_time, "SD"); + create_jed_event(&event, + SD_task_get_name(task), + task->start_time, + task->finish_time, + "SD"); jed_event_add_resources(event, host_list); - jedule_store_event(event); xbt_dynar_free(&host_list); } +static void create_hierarchy(routing_component_t current_comp, + jed_simgrid_container_t current_container) { + xbt_dict_cursor_t cursor = NULL; + char *key; + routing_component_t elem; + network_element_t network_elem; + + if( xbt_dict_length(current_comp->routing_sons) == 0 ) { + // I am no AS + // add hosts to jedule platform + xbt_dynar_t hosts; + + hosts = xbt_dynar_new(sizeof(char*), NULL); + + xbt_dict_foreach(current_comp->to_index, cursor, key, network_elem) { + char *hostname; + printf("key %s value %d\n", key, network_elem); + //xbt_dynar_push_as(hosts, char*, key); + hostname = strdup(key); + xbt_dynar_push(hosts, &hostname); + } + + jed_simgrid_add_resources(current_container, hosts); + + } else { + xbt_dict_foreach(current_comp->routing_sons, cursor, key, elem) { + jed_simgrid_container_t child_container; + jed_simgrid_create_container(&child_container, elem->name); + jed_simgrid_add_container(current_container, child_container); + printf("name : %s\n", elem->name); + create_hierarchy(elem, child_container); + } + } +} void jedule_setup_platform() { + routing_component_t root_comp; + e_surf_network_element_type_t type; + + jed_simgrid_container_t root_container; + + + jed_create_jedule(&jedule); + + root_comp = global_routing->root; + printf("root name %s\n", root_comp->name); + // that doesn't work + type = root_comp->get_network_element_type(root_comp->name); + jed_simgrid_create_container(&root_container, root_comp->name); + jedule->root_container = root_container; + create_hierarchy(root_comp, root_container); + +} + + +void jedule_sd_cleanup() { + + jedule_cleanup_output(); +} + +void jedule_sd_init() { + + jedule_init_output(); +} + +void jedule_sd_dump() { + + write_jedule_output(stdout, jedule, jedule_event_list, NULL); } + +#endif diff --git a/src/simdag/sd_global.c b/src/simdag/sd_global.c index 06849ea80e..a73ce53abd 100644 --- a/src/simdag/sd_global.c +++ b/src/simdag/sd_global.c @@ -21,7 +21,7 @@ #endif #ifdef HAVE_JEDULE -#include "instr/jedule/jedule_output.h" +#include "instr/jedule/jedule_sd_binding.h" #endif XBT_LOG_NEW_CATEGORY(sd, "Logging specific to SimDag"); @@ -98,7 +98,7 @@ void SD_init(int *argc, char **argv) #endif #ifdef HAVE_JEDULE - init_jedule_output(); + jedule_sd_init(); #endif } @@ -149,8 +149,8 @@ void SD_application_reinit(void) sd_global->task_number = 0; #ifdef HAVE_JEDULE - cleanup_jedule(); - init_jedule_output(); + jedule_sd_cleanup(); + jedule_sd_init(); #endif } else { @@ -430,7 +430,8 @@ void SD_exit(void) TRACE_end(); #endif #ifdef HAVE_JEDULE - cleanup_jedule(); + jedule_sd_dump(); + jedule_sd_cleanup(); #endif DEBUG0("Exiting Surf..."); diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index 255fe58524..6ef31d43df 100644 --- a/src/simdag/sd_task.c +++ b/src/simdag/sd_task.c @@ -150,6 +150,9 @@ void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) task->finish_time = surf_workstation_model->action_get_finish_time(task->surf_action); task->remains = 0; +#ifdef HAVE_JEDULE + jedule_log_sd_event(task); +#endif break; case SD_FAILED: task->state_set = sd_global->failed_task_set; @@ -961,10 +964,6 @@ void __SD_task_really_run(SD_task_t task) TRACE_surf_action(task->surf_action, task->category); #endif -#ifdef HAVE_JEDULE - jedule_log_sd_event(task); -#endif - __SD_task_destroy_scheduling_data(task); /* now the scheduling data are not useful anymore */ __SD_task_set_state(task, SD_RUNNING); xbt_assert2(__SD_task_is_running(task), "Bad state of task '%s': %d", diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index f9c921ab14..b0f6d7ed45 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -1282,6 +1282,7 @@ static void *model_full_create(void) new_component->generic_routing.finalize = full_finalize; new_component->generic_routing.to_index = xbt_dict_new(); new_component->generic_routing.bypassRoutes = xbt_dict_new(); + new_component->generic_routing.get_network_element_type = get_network_element_type; return new_component; } @@ -1604,6 +1605,7 @@ static void *model_floyd_create(void) new_component->generic_routing.finalize = floyd_finalize; new_component->generic_routing.to_index = xbt_dict_new(); new_component->generic_routing.bypassRoutes = xbt_dict_new(); + new_component->generic_routing.get_network_element_type = get_network_element_type; return new_component; } @@ -2226,6 +2228,7 @@ static void *model_dijkstra_both_create(int cached) new_component->cached = cached; new_component->generic_routing.to_index = xbt_dict_new(); new_component->generic_routing.bypassRoutes = xbt_dict_new(); + new_component->generic_routing.get_network_element_type = get_network_element_type; return new_component; } @@ -2713,6 +2716,7 @@ static void *model_rulebased_create(void) new_component->generic_routing.get_latency = generic_get_link_latency; new_component->generic_routing.get_bypass_route = rulebased_get_bypass_route; new_component->generic_routing.finalize = rulebased_finalize; + new_component->generic_routing.get_network_element_type = get_network_element_type; /* initialization of internal structures */ new_component->dict_processing_units = xbt_dict_new(); new_component->dict_autonomous_systems = xbt_dict_new();