X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b05a0ed4f5fb7b81f96777af37b8f7fc5a4bf160..59de91764a5c2867799e198b89c7d7cf1c9665d6:/src/surf/workstation.c diff --git a/src/surf/workstation.c b/src/surf/workstation.c index 30d3365fe9..13798ec37c 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -10,10 +10,10 @@ #include "surf_private.h" #include "storage_private.h" #include "surf/surf_resource.h" +#include "simgrid/sg_config.h" typedef struct workstation_CLM03 { s_surf_resource_t generic_resource; /* Must remain first to add this to a trace */ - void *cpu; void *net_elm; xbt_dynar_t storage; } s_workstation_CLM03_t, *workstation_CLM03_t; @@ -29,7 +29,6 @@ static void workstation_new(sg_platf_host_cbarg_t host) workstation->generic_resource.model = surf_workstation_model; workstation->generic_resource.name = xbt_strdup(host->id); - workstation->cpu = xbt_lib_get_or_null(host_lib, host->id, SURF_CPU_LEVEL); workstation->storage = xbt_lib_get_or_null(storage_lib,host->id,ROUTING_STORAGE_HOST_LEVEL); workstation->net_elm = xbt_lib_get_or_null(host_lib,host->id,ROUTING_HOST_LEVEL); XBT_DEBUG("Create workstation %s with %ld mounted disks",host->id,xbt_dynar_length(workstation->storage)); @@ -112,14 +111,14 @@ static void ws_update_resource_state(void *id, static surf_action_t ws_execute(void *workstation, double size) { - void *cpu = ((workstation_CLM03_t) workstation)->cpu; - return ((surf_resource_t) cpu)->model->extension.cpu.execute(cpu, size); + surf_resource_t cpu = ((surf_resource_t) surf_cpu_resource_priv(workstation)); + return cpu->model->extension.cpu.execute(workstation, size); } static surf_action_t ws_action_sleep(void *workstation, double duration) { return surf_cpu_model->extension.cpu. - sleep(((workstation_CLM03_t) workstation)->cpu, duration); + sleep(workstation, duration); } static void ws_action_suspend(surf_action_t action) @@ -209,8 +208,8 @@ static surf_action_t ws_communicate(void *workstation_src, void *workstation_dst, double size, double rate) { - workstation_CLM03_t src = (workstation_CLM03_t) workstation_src; - workstation_CLM03_t dst = (workstation_CLM03_t) workstation_dst; + workstation_CLM03_t src = surf_workstation_resource_priv(workstation_src); + workstation_CLM03_t dst = surf_workstation_resource_priv(workstation_dst); return surf_network_model->extension.network. communicate(src->net_elm, dst->net_elm, size, rate); @@ -219,20 +218,19 @@ static surf_action_t ws_communicate(void *workstation_src, static e_surf_resource_state_t ws_get_state(void *workstation) { return surf_cpu_model->extension.cpu. - get_state(((workstation_CLM03_t) workstation)->cpu); + get_state(workstation); } static double ws_get_speed(void *workstation, double load) { return surf_cpu_model->extension.cpu. - get_speed(((workstation_CLM03_t) workstation)->cpu, load); + get_speed(workstation, load); } static double ws_get_available_speed(void *workstation) { return surf_cpu_model->extension.cpu. - get_available_speed(((workstation_CLM03_t) - workstation)->cpu); + get_available_speed(workstation); } static surf_action_t ws_execute_parallel_task(int workstation_nb, @@ -241,6 +239,30 @@ static surf_action_t ws_execute_parallel_task(int workstation_nb, double *communication_amount, double rate) { +#define cost_or_zero(array,pos) ((array)?(array)[pos]:0.0) + if ((workstation_nb == 1) + && (cost_or_zero(communication_amount, 0) == 0.0)) + return ws_execute(workstation_list[0], computation_amount[0]); + else if ((workstation_nb == 1) + && (cost_or_zero(computation_amount, 0) == 0.0)) + return ws_communicate(workstation_list[0], workstation_list[0],communication_amount[0], rate); + else if ((workstation_nb == 2) + && (cost_or_zero(computation_amount, 0) == 0.0) + && (cost_or_zero(computation_amount, 1) == 0.0)) { + int i,nb = 0; + double value = 0.0; + + for (i = 0; i < workstation_nb * workstation_nb; i++) { + if (cost_or_zero(communication_amount, i) > 0.0) { + nb++; + value = cost_or_zero(communication_amount, i); + } + } + if (nb == 1) + return ws_communicate(workstation_list[0], workstation_list[1],value, rate); + } +#undef cost_or_zero + THROW_UNIMPLEMENTED; /* This model does not implement parallel tasks */ return NULL; } @@ -250,8 +272,8 @@ static surf_action_t ws_execute_parallel_task(int workstation_nb, static xbt_dynar_t ws_get_route(void *workstation_src, void *workstation_dst) { XBT_DEBUG("ws_get_route"); - workstation_CLM03_t src = (workstation_CLM03_t) workstation_src; - workstation_CLM03_t dst = (workstation_CLM03_t) workstation_dst; + workstation_CLM03_t src = surf_workstation_resource_priv(workstation_src); + workstation_CLM03_t dst = surf_workstation_resource_priv(workstation_dst); return surf_network_model->extension. network.get_route(src->net_elm, dst->net_elm); @@ -280,7 +302,7 @@ static void ws_finalize(void) static xbt_dict_t ws_get_properties(const void *ws) { - return surf_resource_properties(((workstation_CLM03_t) ws)->cpu); + return surf_resource_properties(surf_cpu_resource_priv(ws)); } static storage_t find_storage_on_mount_list(void *workstation,const char* storage) @@ -288,9 +310,10 @@ static storage_t find_storage_on_mount_list(void *workstation,const char* storag storage_t st = NULL; s_mount_t mnt; unsigned int cursor; - xbt_dynar_t storage_list = ((workstation_CLM03_t) workstation)->storage; + workstation_CLM03_t ws = (workstation_CLM03_t) surf_workstation_resource_priv(workstation); + xbt_dynar_t storage_list = ws->storage; - XBT_DEBUG("Search for storage name '%s' on '%s'",storage,((workstation_CLM03_t) workstation)->generic_resource.name); + XBT_DEBUG("Search for storage name '%s' on '%s'",storage,ws->generic_resource.name); xbt_dynar_foreach(storage_list,cursor,mnt) { XBT_DEBUG("See '%s'",mnt.name); @@ -299,7 +322,7 @@ static storage_t find_storage_on_mount_list(void *workstation,const char* storag break; } } - if(!st) xbt_die("Can't find mount '%s' for '%s'",storage,((workstation_CLM03_t) workstation)->generic_resource.name); + if(!st) xbt_die("Can't find mount '%s' for '%s'",storage,ws->generic_resource.name); return st; } @@ -423,7 +446,7 @@ static void surf_workstation_model_init_internal(void) void surf_workstation_model_init_current_default(void) { surf_workstation_model_init_internal(); - xbt_cfg_setdefault_int(_surf_cfg_set, "network/crosstraffic", 1); + xbt_cfg_setdefault_int(_sg_cfg_set, "network/crosstraffic", 1); surf_cpu_model_init_Cas01(); surf_network_model_init_LegrandVelho();