From f5d754e303bade51260fbcee19f9bb987eb7cb13 Mon Sep 17 00:00:00 2001 From: thiery Date: Mon, 19 Jun 2006 07:26:02 +0000 Subject: [PATCH] Add a function get_available_speed in Surf workstation and cpu models in order to implement function SD_get_available_power in SimDag git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2391 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/include/surf/surf.h | 2 ++ src/simdag/sd_global.c | 7 +++++-- src/simdag/sd_workstation.c | 4 +--- src/surf/cpu.c | 7 +++++++ src/surf/workstation.c | 7 +++++++ src/surf/workstation_KCCFLN05.c | 6 ++++++ 6 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 92e295b25a..48e8bde5d6 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -114,6 +114,7 @@ typedef struct surf_cpu_resource_extension_public { surf_action_t(*sleep) (void *cpu, double duration); e_surf_cpu_state_t(*get_state) (void *cpu); double (*get_speed) (void *cpu, double load); + double (*get_available_speed) (void *cpu); } s_surf_cpu_resource_extension_public_t, *surf_cpu_resource_extension_public_t; @@ -147,6 +148,7 @@ typedef struct surf_workstation_resource_extension_public { surf_action_t(*sleep) (void *workstation, double duration); e_surf_cpu_state_t(*get_state) (void *workstation); double (*get_speed) (void *workstation, double load); + double (*get_available_speed) (void *workstation); surf_action_t(*communicate) (void *workstation_src, void *workstation_dst, double size, double max_rate); diff --git a/src/simdag/sd_global.c b/src/simdag/sd_global.c index afc5da5e38..8ce1104122 100644 --- a/src/simdag/sd_global.c +++ b/src/simdag/sd_global.c @@ -45,11 +45,14 @@ SD_task_t* SD_simulate(double how_long) xbt_dict_cursor_t cursor = NULL; char *name = NULL; SD_workstation_t workstation = NULL; - double power; + double power, available_power; + surf_solve(); + xbt_dict_foreach(sd_global->workstations, cursor, name, workstation) { power = SD_workstation_get_power(workstation); - printf("Workstation name: %s, power: %f Mflop/s\n", name, power); + available_power = SD_workstation_get_available_power(workstation); + printf("Workstation name: %s, power: %f Mflop/s, available power: %f%%\n", name, power, (available_power*100)); } /* TODO: remove name from SD workstation structure */ diff --git a/src/simdag/sd_workstation.c b/src/simdag/sd_workstation.c index 5fec50326b..4ae419a10e 100644 --- a/src/simdag/sd_workstation.c +++ b/src/simdag/sd_workstation.c @@ -109,9 +109,7 @@ double SD_workstation_get_power(SD_workstation_t workstation) { double SD_workstation_get_available_power(SD_workstation_t workstation) { CHECK_INIT_DONE(); xbt_assert0(workstation != NULL, "Invalid parameter"); - /* TODO */ - return 0; - /*return workstation->available_power;*/ + return surf_workstation_resource->extension_public->get_available_speed(workstation->sd_data->surf_workstation); } /* Destroys a workstation. The user data (if any) should have been destroyed first. diff --git a/src/surf/cpu.c b/src/surf/cpu.c index 491847e567..57ceb535b5 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -311,6 +311,12 @@ static double get_speed(void *cpu, double load) return load*(((cpu_Cas01_t) cpu)->power_scale); } +static double get_available_speed(void *cpu) +{ + /* number between 0 and 1 */ + return ((cpu_Cas01_t) cpu)->power_current; +} + static void finalize(void) { xbt_dict_free(&cpu_set); @@ -381,6 +387,7 @@ static void surf_cpu_resource_init_internal(void) surf_cpu_resource->extension_public->get_state = get_state; surf_cpu_resource->extension_public->get_speed = get_speed; + surf_cpu_resource->extension_public->get_available_speed = get_available_speed; cpu_set = xbt_dict_new(); diff --git a/src/surf/workstation.c b/src/surf/workstation.c index 757e10e1b9..c21104dbc8 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -290,6 +290,12 @@ static double get_speed(void *workstation, double load) get_speed(((workstation_CLM03_t) workstation)->cpu, load); } +static double get_available_speed(void *workstation) +{ + return surf_cpu_resource->extension_public-> + get_available_speed(((workstation_CLM03_t) workstation)->cpu); +} + static surf_action_t execute_parallel_task (int workstation_nb, void **workstation_list, double *computation_amount, @@ -456,6 +462,7 @@ static void surf_workstation_resource_init_internal(void) surf_workstation_resource->extension_public->sleep = action_sleep; surf_workstation_resource->extension_public->get_state = get_state; surf_workstation_resource->extension_public->get_speed = get_speed; + surf_workstation_resource->extension_public->get_available_speed = get_available_speed; surf_workstation_resource->extension_public->communicate = communicate; surf_workstation_resource->extension_public->execute_parallel_task = execute_parallel_task; diff --git a/src/surf/workstation_KCCFLN05.c b/src/surf/workstation_KCCFLN05.c index 056ef5c5db..9f97c6daec 100644 --- a/src/surf/workstation_KCCFLN05.c +++ b/src/surf/workstation_KCCFLN05.c @@ -466,6 +466,11 @@ static double get_speed(void *cpu, double load) return load*(((cpu_KCCFLN05_t) cpu)->power_scale); } +static double get_available_speed(void *cpu) +{ + return ((cpu_KCCFLN05_t) cpu)->power_current; +} + static surf_action_t communicate(void *src, void *dst, double size, double rate) { surf_action_workstation_KCCFLN05_t action = NULL; @@ -902,6 +907,7 @@ static void resource_init_internal(void) surf_workstation_resource->extension_public->sleep = action_sleep; surf_workstation_resource->extension_public->get_state = resource_get_state; surf_workstation_resource->extension_public->get_speed = get_speed; + surf_workstation_resource->extension_public->get_available_speed = get_available_speed; surf_workstation_resource->extension_public->communicate = communicate; surf_workstation_resource->extension_public->execute_parallel_task = execute_parallel_task; -- 2.20.1