From: Paul Bédaride Date: Fri, 18 Oct 2013 12:47:27 +0000 (+0200) Subject: Fix tests X-Git-Tag: v3_11_beta~297^2~9 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/c978b9fe22c4e00793169fbe9d5f22825b96f894 Fix tests --- diff --git a/.cproject b/.cproject index 1db36121e6..49ed4f4059 100644 --- a/.cproject +++ b/.cproject @@ -18,7 +18,7 @@ - + diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index d67c9f96b3..423b84a81a 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -305,7 +305,8 @@ static inline void *surf_storage_resource_by_name(const char *name){ extern "C" { #endif char *surf_routing_edge_name(sg_routing_edge_t edge); - +void *surf_as_cluster_get_backbone(AS_t as); +void surf_as_cluster_set_backbone(AS_t as, void* backbone); const char *surf_model_name(surf_model_t model); xbt_swag_t surf_model_done_action_set(surf_model_t model); xbt_swag_t surf_model_failed_action_set(surf_model_t model); diff --git a/src/include/surf/surf_resource_lmm.h b/src/include/surf/surf_resource_lmm.h index 992f70db07..1e2ecb17ef 100644 --- a/src/include/surf/surf_resource_lmm.h +++ b/src/include/surf/surf_resource_lmm.h @@ -11,7 +11,7 @@ #include "surf/trace_mgr.h" #include "surf/surf_resource.h" - +#ifdef TOMATO static XBT_INLINE surf_resource_lmm_t surf_resource_lmm_new(size_t childsize, /* for superclass */ @@ -43,7 +43,7 @@ static XBT_INLINE tmgr_history_add_trace(history, metric_trace, 0.0, 0, res); return res; } - +#endif static XBT_INLINE e_surf_resource_state_t surf_resource_lmm_get_state(void *r) diff --git a/src/surf/cpu.cpp b/src/surf/cpu.cpp index 5d870ef1c5..7364db1907 100644 --- a/src/surf/cpu.cpp +++ b/src/surf/cpu.cpp @@ -68,7 +68,7 @@ void CpuModel::updateActionsStateFull(double now, double delta) xbt_swag_t running_actions = p_runningActionSet; xbt_swag_foreach_safe(_action, _next_action, running_actions) { - action = (ActionLmmPtr) _action; + action = dynamic_cast(static_cast(_action)); #ifdef HAVE_TRACING if (TRACE_is_enabled()) { CpuPtr x = (CpuPtr) lmm_constraint_id(lmm_get_cnst_from_var diff --git a/src/surf/cpu.hpp b/src/surf/cpu.hpp index cebc48c3b9..15e0cec309 100644 --- a/src/surf/cpu.hpp +++ b/src/surf/cpu.hpp @@ -43,9 +43,9 @@ public: Cpu(CpuModelPtr model, const char* name, xbt_dict_t properties) : Resource(model, name, properties) {}; virtual ActionPtr execute(double size)=0; virtual ActionPtr sleep(double duration)=0; - int getCore(); - double getSpeed(double load); - double getAvailableSpeed(); + virtual int getCore(); + virtual double getSpeed(double load); + virtual double getAvailableSpeed(); void addTraces(void); double m_powerPeak; /*< CPU power peak */ double m_powerScale; /*< Percentage of CPU disponible */ diff --git a/src/surf/cpu_cas01.c b/src/surf/cpu_cas01.c index f704612a5c..27e759b4ca 100644 --- a/src/surf/cpu_cas01.c +++ b/src/surf/cpu_cas01.c @@ -66,7 +66,7 @@ static void *cpu_create_resource(const char *name, double power_peak, if (power_trace) cpu->power_event = - tmgr_history_add_trace(history, power_trace, 0.0, 0, cpu); + tmgr_history_add_trace(history, power_trace, 0.0, 0, static_cast(cpu)); cpu->state_current = state_initial; if (state_trace) diff --git a/src/surf/cpu_cas01.cpp b/src/surf/cpu_cas01.cpp index f1e3be1f23..6b5f1b8fd9 100644 --- a/src/surf/cpu_cas01.cpp +++ b/src/surf/cpu_cas01.cpp @@ -47,7 +47,7 @@ void surf_cpu_model_init_Cas01() return; if (!strcmp(optim, "TI")) { - surf_cpu_model = new CpuTiModel(); + surf_cpu_model_init_ti(); return; } @@ -131,6 +131,7 @@ void CpuCas01Model::parseInit(sg_platf_host_cbarg_t host) host->state_trace, host->properties); } + CpuCas01LmmPtr CpuCas01Model::createResource(const char *name, double power_peak, double power_scale, tmgr_trace_t power_trace, int core, e_surf_resource_state_t state_initial, @@ -152,11 +153,8 @@ CpuCas01LmmPtr CpuCas01Model::createResource(const char *name, double power_peak double CpuCas01Model::shareResourcesFull(double now) { - CpuCas01ActionLmm action; - Model::shareResourcesMaxMin(p_runningActionSet, - xbt_swag_offset(action, p_variable), + return Model::shareResourcesMaxMin(p_runningActionSet, p_maxminSystem, lmm_solve); - return 0; } void CpuCas01Model::addTraces() @@ -171,24 +169,24 @@ void CpuCas01Model::addTraces() /* connect all traces relative to hosts */ xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) { tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name); - CpuCas01LmmPtr host = (CpuCas01LmmPtr) surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)); + CpuCas01LmmPtr host = static_cast(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm))); xbt_assert(host, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); host->p_stateEvent = - tmgr_history_add_trace(history, trace, 0.0, 0, (ResourcePtr) host); + tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(host)); } xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) { tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name); - CpuCas01LmmPtr host = (CpuCas01LmmPtr) surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)); + CpuCas01LmmPtr host = dynamic_cast(static_cast(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)))); xbt_assert(host, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); host->p_powerEvent = - tmgr_history_add_trace(history, trace, 0.0, 0, (ResourcePtr) host); + tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(host)); } } diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp index e312e6e657..e512106220 100644 --- a/src/surf/cpu_ti.cpp +++ b/src/surf/cpu_ti.cpp @@ -312,6 +312,7 @@ CpuTiTgmr::CpuTiTgmr(tmgr_trace_t power_trace, double value) double total_time = 0.0; s_tmgr_event_t val; unsigned int cpt; + p_trace = 0; /* no availability file, fixed trace */ if (!power_trace) { @@ -374,19 +375,45 @@ int CpuTiTrace::binarySearch(double *array, double a, int low, int high) return low; } +/************* + * CallBacks * + *************/ + +static void parse_cpu_ti_init(sg_platf_host_cbarg_t host){ + ((CpuTiModelPtr)surf_cpu_model)->parseInit(host); +} + +static void add_traces_cpu_ti(){ + surf_cpu_model->addTraces(); +} + +static void cpu_ti_define_callbacks() +{ + sg_platf_host_add_cb(parse_cpu_ti_init); + sg_platf_postparse_add_cb(add_traces_cpu_ti); +} + /********* * Model * *********/ +void surf_cpu_model_init_ti() +{ + xbt_assert(!surf_cpu_model,"CPU model already initialized. This should not happen."); + surf_cpu_model = new CpuTiModel(); + cpu_ti_define_callbacks(); + ModelPtr model = static_cast(surf_cpu_model); + xbt_dynar_push(model_list, &model); +} + CpuTiModel::CpuTiModel() : CpuModel("cpu_ti") { xbt_assert(!surf_cpu_model,"CPU model already initialized. This should not happen."); - surf_cpu_model = this; - CpuTiAction action; + ActionPtr action; CpuTi cpu; cpu_ti_running_action_set_that_does_not_need_being_checked = - xbt_swag_new(xbt_swag_offset(action, p_stateHookup)); + xbt_swag_new(xbt_swag_offset(*action, p_stateHookup)); cpu_ti_modified_cpu = xbt_swag_new(xbt_swag_offset(cpu, p_modifiedCpuHookup)); @@ -394,11 +421,6 @@ CpuTiModel::CpuTiModel() : CpuModel("cpu_ti") cpu_ti_action_heap = xbt_heap_new(8, NULL); xbt_heap_set_update_callback(cpu_ti_action_heap, cpu_ti_action_update_index_heap); - /* Define callbacks */ - //TODO sg_platf_host_add_cb(parse_cpu_ti_init); - //TODO sg_platf_postparse_add_cb(add_traces_cpu_ti); - - xbt_dynar_push(model_list, &surf_cpu_model); } CpuTiModel::~CpuTiModel() @@ -416,7 +438,6 @@ CpuTiModel::~CpuTiModel() } } - delete surf_cpu_model; surf_cpu_model = NULL; xbt_swag_free @@ -472,7 +493,7 @@ double CpuTiModel::shareResources(double now) /* iterates over modified cpus to update share resources */ xbt_swag_foreach_safe(_cpu, _cpu_next, cpu_ti_modified_cpu) { - ((CpuTiPtr)_cpu)->updateActionFinishDate(now); + static_cast(_cpu)->updateActionFinishDate(now); } /* get the min next event if heap not empty */ if (xbt_heap_size(cpu_ti_action_heap) > 0) @@ -512,7 +533,7 @@ void CpuTiModel::addTraces() /* connect all traces relative to hosts */ xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) { tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name); - CpuTiPtr cpu = (CpuTiPtr) surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)); + CpuTiPtr cpu = static_cast(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm))); xbt_assert(cpu, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); @@ -523,12 +544,12 @@ void CpuTiModel::addTraces() continue; } XBT_DEBUG("Add state trace: %s to CPU(%s)", trace_name, elm); - cpu->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, cpu); + cpu->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(cpu)); } xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) { tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name); - CpuTiPtr cpu = (CpuTiPtr) surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)); + CpuTiPtr cpu = dynamic_cast(static_cast(surf_cpu_resource_priv(surf_cpu_resource_by_name(elm)))); xbt_assert(cpu, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); @@ -549,7 +570,7 @@ void CpuTiModel::addTraces() empty_trace = tmgr_empty_trace_new(); cpu->p_powerEvent = tmgr_history_add_trace(history, empty_trace, - cpu->p_availTrace->m_lastTime, 0, cpu); + cpu->p_availTrace->m_lastTime, 0, static_cast(cpu)); } } } @@ -562,7 +583,8 @@ CpuTi::CpuTi(CpuTiModelPtr model, const char *name, double powerPeak, double powerScale, tmgr_trace_t powerTrace, int core, e_surf_resource_state_t stateInitial, tmgr_trace_t stateTrace, xbt_dict_t properties) : - Cpu(model, name, properties), p_stateCurrent(stateInitial) { + Resource(model, name, properties), Cpu(model, name, properties) { + p_stateCurrent = stateInitial; m_powerPeak = powerPeak; m_powerScale = powerScale; m_core = core; @@ -571,8 +593,15 @@ CpuTi::CpuTi(CpuTiModelPtr model, const char *name, double powerPeak, xbt_assert(core==1,"Multi-core not handled with this model yet"); XBT_DEBUG("power scale %lf", powerScale); p_availTrace = new CpuTiTgmr(powerTrace, powerScale); + + CpuTiActionPtr action; + p_actionSet = xbt_swag_new(xbt_swag_offset(*action, p_cpuListHookup)); + + p_modifiedCpuHookup.prev = 0; + p_modifiedCpuHookup.next = 0; + if (stateTrace) - p_stateEvent = tmgr_history_add_trace(history, stateTrace, 0.0, 0, this); + p_stateEvent = tmgr_history_add_trace(history, stateTrace, 0.0, 0, static_cast(this)); if (powerTrace && xbt_dynar_length(powerTrace->s_list.event_list) > 1) { // add a fake trace event if periodicity == 0 xbt_dynar_get_cpy(powerTrace->s_list.event_list, @@ -581,7 +610,7 @@ CpuTi::CpuTi(CpuTiModelPtr model, const char *name, double powerPeak, empty_trace = tmgr_empty_trace_new(); p_powerEvent = tmgr_history_add_trace(history, empty_trace, - p_availTrace->m_lastTime, 0, this); + p_availTrace->m_lastTime, 0, static_cast(this)); } } }; @@ -628,7 +657,7 @@ void CpuTi::updateState(tmgr_trace_event_t event_type, /* put all action running on cpu to failed */ xbt_swag_foreach(_action, p_actionSet) { - action = (CpuTiActionPtr) _action; + action = static_cast(_action); if (action->getState() == SURF_ACTION_RUNNING || action->getState() == SURF_ACTION_READY || action->getState() == SURF_ACTION_NOT_IN_THE_SYSTEM) { @@ -663,7 +692,7 @@ void CpuTi::updateActionFinishDate(double now) updateRemainingAmount(now); xbt_swag_foreach(_action, p_actionSet) { - action = (CpuTiActionPtr) _action; + action = static_cast(_action); /* action not running, skip it */ if (action->p_stateSet != surf_cpu_model->p_runningActionSet) @@ -682,7 +711,7 @@ updateRemainingAmount(now); m_sumPriority = sum_priority; xbt_swag_foreach(_action, p_actionSet) { - action = (CpuTiActionPtr) _action; + action = static_cast(_action); min_finish = -1; /* action not running, skip it */ if (action->p_stateSet != @@ -731,11 +760,6 @@ updateRemainingAmount(now); xbt_swag_remove(this, cpu_ti_modified_cpu); } -CpuTiModelPtr CpuTi::getModel() -{ - return static_cast(p_model); -}; - bool CpuTi::isUsed() { return xbt_swag_size(p_actionSet); @@ -770,7 +794,7 @@ void CpuTi::updateRemainingAmount(double now) m_lastUpdate); xbt_swag_foreach(_action, p_actionSet) { - action = (CpuTiActionPtr) _action; + action = static_cast(_action); /* action not running, skip it */ if (action->p_stateSet != getModel()->p_runningActionSet) @@ -805,13 +829,13 @@ void CpuTi::updateRemainingAmount(double now) CpuActionPtr CpuTi::execute(double size) { - return execute(size); + return _execute(size); } CpuTiActionPtr CpuTi::_execute(double size) { XBT_IN("(%s,%g)", m_name, size); - CpuTiActionPtr action = new CpuTiAction((CpuTiModelPtr) p_model, size, p_stateCurrent != SURF_RESOURCE_ON); + CpuTiActionPtr action = new CpuTiAction(static_cast(p_model), size, p_stateCurrent != SURF_RESOURCE_ON); action->p_cpu = this; action->m_indexHeap = -1; @@ -821,7 +845,7 @@ CpuTiActionPtr CpuTi::_execute(double size) xbt_swag_insert(action, p_actionSet); action->m_suspended = 0; /* Should be useless because of the - calloc but it seems to help valgrind... */ + » calloc but it seems to help valgrind... */ XBT_OUT(); return action; @@ -868,7 +892,7 @@ void CpuTiAction::updateIndexHeap(int i) void CpuTiAction::setState(e_surf_action_state_t state) { Action::setState(state); - xbt_swag_insert(surf_cpu_resource_priv(p_cpu), cpu_ti_modified_cpu); + xbt_swag_insert(p_cpu, cpu_ti_modified_cpu); } int CpuTiAction::unref() @@ -877,10 +901,10 @@ int CpuTiAction::unref() if (!m_refcount) { xbt_swag_remove(static_cast(this), p_stateSet); /* remove from action_set */ - xbt_swag_remove(this, ((CpuTiPtr)surf_cpu_resource_priv(p_cpu))->p_actionSet); + xbt_swag_remove(this, p_cpu->p_actionSet); /* remove from heap */ xbt_heap_remove(cpu_ti_action_heap, this->m_indexHeap); - xbt_swag_insert(surf_cpu_resource_priv(p_cpu), cpu_ti_modified_cpu); + xbt_swag_insert(p_cpu, cpu_ti_modified_cpu); delete this; return 1; } @@ -891,7 +915,7 @@ void CpuTiAction::cancel() { this->setState(SURF_ACTION_FAILED); xbt_heap_remove(cpu_ti_action_heap, this->m_indexHeap); - xbt_swag_insert(surf_cpu_resource_priv(p_cpu), cpu_ti_modified_cpu); + xbt_swag_insert(p_cpu, cpu_ti_modified_cpu); return; } @@ -906,7 +930,7 @@ void CpuTiAction::suspend() if (m_suspended != 2) { m_suspended = 1; xbt_heap_remove(cpu_ti_action_heap, m_indexHeap); - xbt_swag_insert(surf_cpu_resource_priv(p_cpu), cpu_ti_modified_cpu); + xbt_swag_insert(p_cpu, cpu_ti_modified_cpu); } XBT_OUT(); } @@ -916,7 +940,7 @@ void CpuTiAction::resume() XBT_IN("(%p)", this); if (m_suspended != 2) { m_suspended = 0; - xbt_swag_insert(surf_cpu_resource_priv(p_cpu), cpu_ti_modified_cpu); + xbt_swag_insert(p_cpu, cpu_ti_modified_cpu); } XBT_OUT(); } @@ -956,14 +980,14 @@ void CpuTiAction::setPriority(double priority) { XBT_IN("(%p,%g)", this, priority); m_priority = priority; - xbt_swag_insert(surf_cpu_resource_priv(p_cpu), cpu_ti_modified_cpu); + xbt_swag_insert(p_cpu, cpu_ti_modified_cpu); XBT_OUT(); } double CpuTiAction::getRemains() { XBT_IN("(%p)", this); - ((CpuTiPtr)p_cpu)->updateRemainingAmount(surf_get_clock()); + p_cpu->updateRemainingAmount(surf_get_clock()); XBT_OUT(); return m_remains; } diff --git a/src/surf/cpu_ti.hpp b/src/surf/cpu_ti.hpp index 01f66eb072..6d52dd9f67 100644 --- a/src/surf/cpu_ti.hpp +++ b/src/surf/cpu_ti.hpp @@ -116,14 +116,12 @@ public: void updateActionFinishDate(double now); bool isUsed(); void printCpuTiModel(); - CpuTiModelPtr getModel(); CpuActionPtr execute(double size); CpuTiActionPtr _execute(double size); CpuActionPtr sleep(double duration); double getAvailableSpeed(); CpuTiTgmrPtr p_availTrace; /*< Structure with data needed to integrate trace file */ - e_surf_resource_state_t p_stateCurrent; /*< CPU current state (ON or OFF) */ tmgr_trace_event_t p_stateEvent; /*< trace file with states events (ON or OFF) */ tmgr_trace_event_t p_powerEvent; /*< trace file with availabitly events */ xbt_swag_t p_actionSet; /*< set with all actions running on cpu */ @@ -136,10 +134,15 @@ public: /********** * Action * **********/ + class CpuTiAction: public CpuAction { public: CpuTiAction() {}; - CpuTiAction(CpuTiModelPtr model, double cost, bool failed): CpuAction(model, cost, failed) {}; + CpuTiAction(CpuTiModelPtr model, double cost, bool failed) + : Action(model, cost, failed), CpuAction(model, cost, failed) { + p_cpuListHookup.next = 0; + p_cpuListHookup.prev = 0; + }; void setState(e_surf_action_state_t state); int unref(); @@ -154,6 +157,7 @@ public: double getRemains(); CpuTiPtr p_cpu; int m_indexHeap; + s_xbt_swag_hookup_t p_cpuListHookup; int m_suspended; private: }; diff --git a/src/surf/network.cpp b/src/surf/network.cpp index 4065da6500..e9930f21c6 100644 --- a/src/surf/network.cpp +++ b/src/surf/network.cpp @@ -75,7 +75,7 @@ static void net_add_traces(void){ "Cannot connect trace %s to link %s: trace undefined", trace_name, elm); - link->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, link); + link->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(link)); } xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) { @@ -90,7 +90,7 @@ static void net_add_traces(void){ "Cannot connect trace %s to link %s: trace undefined", trace_name, elm); - link->p_power.event = tmgr_history_add_trace(history, trace, 0.0, 0, link); + link->p_power.event = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(link)); } xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) { @@ -105,7 +105,7 @@ static void net_add_traces(void){ "Cannot connect trace %s to link %s: trace undefined", trace_name, elm); - link->p_latEvent = tmgr_history_add_trace(history, trace, 0.0, 0, link); + link->p_latEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(link)); } } @@ -276,10 +276,10 @@ NetworkCm02Model::NetworkCm02Model(string name) : Model(name){ if (!p_maxminSystem) p_maxminSystem = lmm_system_new(m_selectiveUpdate); - routing_model_create(createResource("__loopback__", + routing_model_create(static_cast(createResource("__loopback__", 498000000, NULL, 0.000015, NULL, SURF_RESOURCE_ON, NULL, - SURF_LINK_FATPIPE, NULL)); + SURF_LINK_FATPIPE, NULL))); if (p_updateMechanism == UM_LAZY) { p_actionHeap = xbt_heap_new(8, NULL); @@ -532,7 +532,7 @@ NetworkCm02LinkLmm::NetworkCm02LinkLmm(NetworkCm02ModelPtr model, const char *na { m_latCurrent = lat_initial; if (lat_trace) - p_latEvent = tmgr_history_add_trace(history, lat_trace, 0.0, 0, this); + p_latEvent = tmgr_history_add_trace(history, lat_trace, 0.0, 0, static_cast(this)); if (policy == SURF_LINK_FATPIPE) lmm_constraint_shared(p_constraint); diff --git a/src/surf/network.hpp b/src/surf/network.hpp index f5e196d691..6b4ab46fe6 100644 --- a/src/surf/network.hpp +++ b/src/surf/network.hpp @@ -36,6 +36,7 @@ extern NetworkCm02ModelPtr surf_network_model; *********/ class NetworkCm02Model : public Model { public: + NetworkCm02Model(int i) : Model("network") {};//FIXME: add network clean interface NetworkCm02Model(string name); NetworkCm02Model(); //FIXME:NetworkCm02LinkPtr createResource(string name); @@ -70,7 +71,7 @@ public: NetworkCm02Link(){}; NetworkCm02Link(NetworkCm02ModelPtr model, const char* name, xbt_dict_t properties) : Resource(model, name, properties) {}; virtual double getBandwidth()=0; - double getLatency(); + virtual double getLatency(); virtual bool isShared()=0; /* Using this object with the public part of model does not make sense */ @@ -80,6 +81,8 @@ public: class NetworkCm02LinkLmm : public ResourceLmm, public NetworkCm02Link { public: + NetworkCm02LinkLmm(NetworkCm02ModelPtr model, const char* name, xbt_dict_t properties) + : ResourceLmm(), NetworkCm02Link(model, name, properties) {}; NetworkCm02LinkLmm(NetworkCm02ModelPtr model, const char *name, xbt_dict_t props, lmm_system_t system, double constraint_value, diff --git a/src/surf/storage.cpp b/src/surf/storage.cpp index 1824c92994..d4f35412fa 100644 --- a/src/surf/storage.cpp +++ b/src/surf/storage.cpp @@ -310,13 +310,11 @@ StoragePtr StorageModel::createResource(const char* id, const char* model, const double StorageModel::shareResources(double now) { XBT_DEBUG("storage_share_resources %f", now); - StorageActionLmm action; unsigned int i, j; StoragePtr storage; StorageActionLmmPtr write_action; double min_completion = shareResourcesMaxMin(p_runningActionSet, - xbt_swag_offset(action, p_variable), storage_maxmin_system, lmm_solve); double rate; diff --git a/src/surf/surf.cpp b/src/surf/surf.cpp index fdfc7935e9..88d7ad17e8 100644 --- a/src/surf/surf.cpp +++ b/src/surf/surf.cpp @@ -435,7 +435,9 @@ void surf_exit(void) *********/ Model::Model(string name) - : m_name(name), m_resOnCB(0), m_resOffCB(0), m_actSuspendCB(0), m_actCancelCB(0), m_actResumeCB(0) + : m_name(name), m_resOnCB(0), m_resOffCB(0), + m_actSuspendCB(0), m_actCancelCB(0), m_actResumeCB(0), + p_maxminSystem(0) { ActionPtr action; p_readyActionSet = xbt_swag_new(xbt_swag_offset(*action, p_stateHookup)); @@ -545,26 +547,24 @@ double Model::shareResourcesFull(double now) { double Model::shareResourcesMaxMin(xbt_swag_t running_actions, - size_t offset, lmm_system_t sys, void (*solve) (lmm_system_t)) { void *_action = NULL; - ActionPtr action = NULL; + ActionLmmPtr action = NULL; double min = -1; double value = -1; -#define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + (offset)))) solve(sys); xbt_swag_foreach(_action, running_actions) { - action = (ActionPtr)_action; - value = lmm_variable_getvalue(VARIABLE(action)); + action = dynamic_cast(static_cast(_action)); + value = lmm_variable_getvalue(action->p_variable); if ((value > 0) || (action->m_maxDuration >= 0)) break; } - if (!action) + if (!_action) return -1.0; if (value > 0) { @@ -578,10 +578,11 @@ double Model::shareResourcesMaxMin(xbt_swag_t running_actions, min = action->m_maxDuration; - for (action = (ActionPtr) xbt_swag_getNext(action, running_actions->offset); - action; - action = (ActionPtr) xbt_swag_getNext(action, running_actions->offset)) { - value = lmm_variable_getvalue(VARIABLE(action)); + for (_action = xbt_swag_getNext(static_cast(action), running_actions->offset); + _action; + _action = xbt_swag_getNext(static_cast(action), running_actions->offset)) { + action = dynamic_cast(static_cast(_action)); + value = lmm_variable_getvalue(action->p_variable); if (value > 0) { if (action->m_remains > 0) value = action->m_remains / value; @@ -599,7 +600,6 @@ double Model::shareResourcesMaxMin(xbt_swag_t running_actions, } XBT_DEBUG("min value : %f", min); -#undef VARIABLE return min; } @@ -737,11 +737,11 @@ ResourceLmm::ResourceLmm(surf_model_t model, const char *name, xbt_dict_t props, p_constraint = lmm_constraint_new(system, this, constraint_value); p_stateCurrent = state_init; if (state_trace) - p_stateEvent = tmgr_history_add_trace(history, state_trace, 0.0, 0, this); + p_stateEvent = tmgr_history_add_trace(history, state_trace, 0.0, 0, static_cast(this)); p_power.scale = 1.0; p_power.peak = metric_peak; if (metric_trace) - p_power.event = tmgr_history_add_trace(history, metric_trace, 0.0, 0, this); + p_power.event = tmgr_history_add_trace(history, metric_trace, 0.0, 0, static_cast(this)); } /********** diff --git a/src/surf/surf.hpp b/src/surf/surf.hpp index 89ed8efe55..358546a870 100644 --- a/src/surf/surf.hpp +++ b/src/surf/surf.hpp @@ -112,7 +112,6 @@ public: virtual double shareResourcesLazy(double now); virtual double shareResourcesFull(double now); double shareResourcesMaxMin(xbt_swag_t running_actions, - size_t offset, lmm_system_t sys, void (*solve) (lmm_system_t)); virtual void updateActionsState(double now, double delta); @@ -232,7 +231,7 @@ public: s_xbt_swag_hookup_t p_stateHookup; e_surf_action_state_t getState(); /**< get the state*/ - void setState(e_surf_action_state_t state); /**< Change state*/ + virtual void setState(e_surf_action_state_t state); /**< Change state*/ double getStartTime(); /**< Return the start time of an action */ double getFinishTime(); /**< Return the finish time of an action */ void setData(void* data); diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index 96da59fe66..de9093fefb 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -1,6 +1,7 @@ #include "surf.hpp" #include "workstation.hpp" #include "network.hpp" +#include "surf_routing_cluster.hpp" #include "instr/instr_private.h" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_kernel); @@ -199,6 +200,14 @@ void routing_get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst, * MODEL * *********/ +void *surf_as_cluster_get_backbone(AS_t as){ + return static_cast(as)->p_backbone; +} + +void surf_as_cluster_set_backbone(AS_t as, void* backbone){ + static_cast(as)->p_backbone = static_cast(backbone); +} + const char *surf_model_name(surf_model_t model){ return model->m_name.c_str(); } @@ -246,7 +255,7 @@ const char *surf_resource_name(surf_cpp_resource_t resource){ } xbt_dict_t surf_resource_get_properties(surf_cpp_resource_t resource){ - return resource->m_properties; + return resource->getProperties(); } e_surf_resource_state_t surf_resource_get_state(surf_cpp_resource_t resource){ @@ -342,7 +351,7 @@ void surf_action_suspend(surf_action_t action){ } void surf_action_resume(surf_action_t action){ - action->suspend(); + action->resume(); } void surf_action_cancel(surf_action_t action){ diff --git a/src/surf/surf_routing.cpp b/src/surf/surf_routing.cpp index 9e09a184f4..f4f22a82fe 100644 --- a/src/surf/surf_routing.cpp +++ b/src/surf/surf_routing.cpp @@ -526,7 +526,6 @@ static void _get_route_and_latency(RoutingEdgePtr src, RoutingEdgePtr dst, /* Check whether a direct bypass is defined */ sg_platf_route_cbarg_t e_route_bypass = NULL; //FIXME:REMOVE:if (common_father->get_bypass_route) - common_father->test(); e_route_bypass = common_father->getBypassRoute(src, dst, latency); @@ -611,7 +610,11 @@ void RoutingPlatf::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, "negative latency on route between \"%s\" and \"%s\"", src->p_name, dst->p_name); } -static xbt_dynar_t recursive_get_onelink_routes(AsPtr rc) +xbt_dynar_t RoutingPlatf::getOneLinkRoutes(){ + return recursiveGetOneLinkRoutes(p_root); +} + +xbt_dynar_t RoutingPlatf::recursiveGetOneLinkRoutes(AsPtr rc) { xbt_dynar_t ret = xbt_dynar_new(sizeof(OnelinkPtr), xbt_free); @@ -625,18 +628,13 @@ static xbt_dynar_t recursive_get_onelink_routes(AsPtr rc) xbt_dict_cursor_t cursor = NULL; AS_t rc_child; xbt_dict_foreach(rc->p_routingSons, cursor, key, rc_child) { - xbt_dynar_t onelink_child = recursive_get_onelink_routes(rc_child); + xbt_dynar_t onelink_child = recursiveGetOneLinkRoutes(rc_child); if (onelink_child) xbt_dynar_merge(&ret,&onelink_child); } return ret; } -static xbt_dynar_t get_onelink_routes(void) -{ - return recursive_get_onelink_routes(routing_platf->p_root); -} - e_surf_network_element_type_t routing_get_network_element_type(const char *name) { RoutingEdgePtr rc = sg_routing_edge_by_name_or_null(name); @@ -656,8 +654,7 @@ void routing_model_create( void *loopback) /* config the uniq global routing */ routing_platf = new RoutingPlatf(); routing_platf->p_root = NULL; - //FIXME:routing_platf->get_onelink_routes = get_onelink_routes; - //FIXME:routing_platf->loopback = loopback; + routing_platf->p_loopback = loopback; routing_platf->p_lastRoute = xbt_dynar_new(sizeof(sg_routing_link_t),NULL); /* no current routing at moment */ current_routing = NULL; @@ -713,9 +710,9 @@ void routing_model_create( void *loopback) void routing_cluster_add_backbone(void* bb) { xbt_assert(current_routing->p_modelDesc == &routing_models[SURF_MODEL_CLUSTER], "You have to be in model Cluster to use tag backbone!"); - /*FIXME:xbt_assert(!((as_cluster_t)current_routing)->p_backbone, "The backbone link is already defined!"); - ((as_cluster_t)current_routing)->p_backbone = bb;*/ - XBT_DEBUG("Add a backbone to AS '%s'",current_routing->p_name); + xbt_assert(!surf_as_cluster_get_backbone(current_routing), "The backbone link is already defined!"); + surf_as_cluster_set_backbone(current_routing, bb); + XBT_DEBUG("Add a backbone to AS '%s'", current_routing->p_name); } static void routing_parse_cabinet(sg_platf_cabinet_cbarg_t cabinet) diff --git a/src/surf/surf_routing.hpp b/src/surf/surf_routing.hpp index 60c47f21d3..2e5e36bbd9 100644 --- a/src/surf/surf_routing.hpp +++ b/src/surf/surf_routing.hpp @@ -45,7 +45,7 @@ public: As(){}; ~As(){}; - int test(){return 3;}; + virtual void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency)=0; virtual xbt_dynar_t getOneLinkRoutes()=0; virtual void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges)=0; @@ -86,6 +86,7 @@ public: void *p_loopback; xbt_dynar_t p_lastRoute; xbt_dynar_t getOneLinkRoutes(void); + xbt_dynar_t recursiveGetOneLinkRoutes(AsPtr rc); void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, xbt_dynar_t * links, double *latency); }; diff --git a/src/surf/surf_routing_none.cpp b/src/surf/surf_routing_none.cpp index 07c059aa9a..86dd2e5b69 100644 --- a/src/surf/surf_routing_none.cpp +++ b/src/surf/surf_routing_none.cpp @@ -12,7 +12,8 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_none, surf, "Routing part of surf"); } AS_t model_none_create(void) -{//FIXME: +{ + return new AsNone(); } xbt_dynar_t AsNone::getOneLinkRoutes() { diff --git a/src/surf/surf_routing_vivaldi.cpp b/src/surf/surf_routing_vivaldi.cpp index b36798f0d3..4fad8e3e35 100644 --- a/src/surf/surf_routing_vivaldi.cpp +++ b/src/surf/surf_routing_vivaldi.cpp @@ -1,10 +1,100 @@ #include "surf_routing_private.h" +#include "surf_routing_vivaldi.hpp" extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_vivaldi, surf, "Routing part of surf"); } +static XBT_INLINE double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) { + double src_coord, dst_coord; + + src_coord = xbt_dynar_get_as(src, index, double); + dst_coord = xbt_dynar_get_as(dst, index, double); + + return (src_coord-dst_coord)*(src_coord-dst_coord); +} AS_t model_vivaldi_create(void) -{//FIXME: +{ + return new AsVivaldi(); +} + +void AsVivaldi::getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t route, double *lat) +{ + s_surf_parsing_link_up_down_t info; + + XBT_DEBUG("vivaldi_get_route_and_latency from '%s'[%d] '%s'[%d]", + src->p_name, src->m_id, dst->p_name, dst->m_id); + + if(src->p_rcType == SURF_NETWORK_ELEMENT_AS) { + route->gw_src = (sg_routing_edge_t) xbt_lib_get_or_null(as_router_lib, ROUTER_PEER(src->p_name), ROUTING_ASR_LEVEL); + route->gw_dst = (sg_routing_edge_t) xbt_lib_get_or_null(as_router_lib, ROUTER_PEER(dst->p_name), ROUTING_ASR_LEVEL); + } + + double euclidean_dist; + xbt_dynar_t src_ctn, dst_ctn; + char *tmp_src_name, *tmp_dst_name; + + if(src->p_rcType == SURF_NETWORK_ELEMENT_HOST){ + tmp_src_name = HOST_PEER(src->p_name); + + if(p_linkUpDownList){ + info = xbt_dynar_get_as(p_linkUpDownList, src->m_id, s_surf_parsing_link_up_down_t); + if(info.link_up) { // link up + xbt_dynar_push_as(route->link_list, void*, info.link_up); + if (lat) + *lat += static_cast(info.link_up)->getLatency(); + } + } + src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, tmp_src_name, COORD_HOST_LEVEL); + if(!src_ctn ) src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, src->p_name, COORD_HOST_LEVEL); + } + else if(src->p_rcType == SURF_NETWORK_ELEMENT_ROUTER || src->p_rcType == SURF_NETWORK_ELEMENT_AS){ + tmp_src_name = ROUTER_PEER(src->p_name); + src_ctn = (xbt_dynar_t) xbt_lib_get_or_null(as_router_lib, tmp_src_name, COORD_ASR_LEVEL); + } + else{ + THROW_IMPOSSIBLE; + } + + if(dst->p_rcType == SURF_NETWORK_ELEMENT_HOST){ + tmp_dst_name = HOST_PEER(dst->p_name); + + if(p_linkUpDownList){ + info = xbt_dynar_get_as(p_linkUpDownList, dst->m_id, s_surf_parsing_link_up_down_t); + if(info.link_down) { // link down + xbt_dynar_push_as(route->link_list,void*,info.link_down); + if (lat) + *lat += static_cast(info.link_down)->getLatency(); + } + } + dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, tmp_dst_name, COORD_HOST_LEVEL); + if(!dst_ctn ) dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(host_lib, dst->p_name, COORD_HOST_LEVEL); + } + else if(dst->p_rcType == SURF_NETWORK_ELEMENT_ROUTER || dst->p_rcType == SURF_NETWORK_ELEMENT_AS){ + tmp_dst_name = ROUTER_PEER(dst->p_name); + dst_ctn = (xbt_dynar_t) xbt_lib_get_or_null(as_router_lib, tmp_dst_name, COORD_ASR_LEVEL); + } + else{ + THROW_IMPOSSIBLE; + } + + xbt_assert(src_ctn,"No coordinate found for element '%s'",tmp_src_name); + xbt_assert(dst_ctn,"No coordinate found for element '%s'",tmp_dst_name); + free(tmp_src_name); + free(tmp_dst_name); + + euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_dist_comp(1,src_ctn,dst_ctn)) + + fabs(xbt_dynar_get_as(src_ctn, 2, double))+fabs(xbt_dynar_get_as(dst_ctn, 2, double)); + + if (lat){ + XBT_DEBUG("Updating latency %f += %f",*lat,euclidean_dist); + *lat += euclidean_dist / 1000.0; //From .ms to .s + } +} + +int AsVivaldi::parsePU(RoutingEdgePtr elm) { + XBT_DEBUG("Load process unit \"%s\"", elm->p_name); + xbt_dynar_push_as(p_indexNetworkElm, sg_routing_edge_t, elm); + return xbt_dynar_length(p_indexNetworkElm)-1; } diff --git a/src/surf/surf_routing_vivaldi.hpp b/src/surf/surf_routing_vivaldi.hpp new file mode 100644 index 0000000000..dd066ff9d5 --- /dev/null +++ b/src/surf/surf_routing_vivaldi.hpp @@ -0,0 +1,35 @@ +#include "surf_routing_generic.hpp" +#include "network.hpp" + +#ifndef SURF_ROUTING_VIVALDI_HPP_ +#define SURF_ROUTING_VIVALDI_HPP_ + +/*********** + * Classes * + ***********/ +class AsVivaldi; +typedef AsVivaldi *AsVivaldiPtr; + +class AsVivaldi: public AsGeneric { +public: + sg_platf_route_cbarg_t *p_routingTable; + + AsVivaldi() : AsGeneric() {}; + ~AsVivaldi() {}; + + void getRouteAndLatency(RoutingEdgePtr src, RoutingEdgePtr dst, sg_platf_route_cbarg_t into, double *latency); + //void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges); + //sg_platf_route_cbarg_t getBypassRoute(RoutingEdgePtr src, RoutingEdgePtr dst, double *lat); + + /* The parser calls the following functions to inform the routing models + * that a new element is added to the AS currently built. + * + * Of course, only the routing model of this AS is informed, not every ones */ + int parsePU(RoutingEdgePtr elm); /* A host or a router, whatever */ + //virtual int parseAS( RoutingEdgePtr elm)=0; + + //virtual void parseBypassroute(sg_platf_route_cbarg_t e_route)=0; +}; + + +#endif /* SURF_ROUTING_VIVALDI_HPP_ */ diff --git a/src/surf/workstation.hpp b/src/surf/workstation.hpp index 3926fba4b6..675cfad5ea 100644 --- a/src/surf/workstation.hpp +++ b/src/surf/workstation.hpp @@ -38,18 +38,18 @@ public: WorkstationModel(string name): Model(name) {}; WorkstationModel(); ~WorkstationModel(); - void parseInit(sg_platf_host_cbarg_t host); + virtual void parseInit(sg_platf_host_cbarg_t host); WorkstationCLM03Ptr createResource(string name); double shareResources(double now); void updateActionsState(double now, double delta); - ActionPtr executeParallelTask(int workstation_nb, + virtual ActionPtr executeParallelTask(int workstation_nb, void **workstation_list, double *computation_amount, double *communication_amount, double rate); - xbt_dynar_t getRoute(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst); - ActionPtr communicate(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst, double size, double rate); + virtual xbt_dynar_t getRoute(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst); + virtual ActionPtr communicate(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst, double size, double rate); }; /************ @@ -62,13 +62,13 @@ public: void updateState(tmgr_trace_event_t event_type, double value, double date); - ActionPtr execute(double size); - ActionPtr sleep(double duration); + virtual ActionPtr execute(double size); + virtual ActionPtr sleep(double duration); e_surf_resource_state_t getState(); - int getCore(); - double getSpeed(double load); - double getAvailableSpeed(); + virtual int getCore(); + virtual double getSpeed(double load); + virtual double getAvailableSpeed(); xbt_dict_t getProperties(); @@ -90,7 +90,8 @@ public: class WorkstationCLM03Lmm : public WorkstationCLM03, public ResourceLmm { public: - WorkstationCLM03Lmm(WorkstationModelPtr model, const char* name, xbt_dict_t props): WorkstationCLM03(model, name, props, NULL, NULL, NULL){}; + WorkstationCLM03Lmm(WorkstationModelPtr model, const char* name, xbt_dict_t props, xbt_dynar_t storage, RoutingEdgePtr netElm, CpuPtr cpu): + WorkstationCLM03(model, name, props, storage, netElm, cpu){}; e_surf_resource_state_t getState(); }; diff --git a/src/surf/workstation_ptask_L07.cpp b/src/surf/workstation_ptask_L07.cpp index 4bf426f1ba..bfe7b5b5ec 100644 --- a/src/surf/workstation_ptask_L07.cpp +++ b/src/surf/workstation_ptask_L07.cpp @@ -17,13 +17,14 @@ lmm_system_t ptask_maxmin_system = NULL; WorkstationL07Model::WorkstationL07Model() : WorkstationModel("Workstation ptask_L07") { if (!ptask_maxmin_system) ptask_maxmin_system = lmm_system_new(1); - routing_model_create(createLinkResource("__loopback__", + routing_model_create(p_networkModel->createResource("__loopback__", 498000000, NULL, 0.000015, NULL, SURF_RESOURCE_ON, NULL, SURF_LINK_FATPIPE, NULL)); surf_network_model = new NetworkL07Model(); + surf_cpu_model = new CpuL07Model(); } double WorkstationL07Model::shareResources(double now) @@ -31,15 +32,13 @@ double WorkstationL07Model::shareResources(double now) void *_action; WorkstationL07ActionLmmPtr action; - xbt_swag_t running_actions = surf_workstation_model->p_runningActionSet; + xbt_swag_t running_actions = this->p_runningActionSet; double min = this->shareResourcesMaxMin(running_actions, - xbt_swag_offset((*action), - p_variable), ptask_maxmin_system, bottleneck_solve); xbt_swag_foreach(_action, running_actions) { - action = (WorkstationL07ActionLmmPtr) _action; + action = dynamic_cast(static_cast(_action)); if (action->m_latency > 0) { if (min < 0) { min = action->m_latency; @@ -63,11 +62,10 @@ void WorkstationL07Model::updateActionsState(double now, double delta) double deltap = 0.0; void *_action, *_next_action; WorkstationL07ActionLmmPtr action; - xbt_swag_t running_actions = - surf_workstation_model->p_runningActionSet; - xbt_swag_foreach_safe(_action, _next_action, running_actions) { - action = (WorkstationL07ActionLmmPtr) _action; + xbt_swag_foreach_safe(_action, _next_action, p_runningActionSet) { + action = dynamic_cast(static_cast(_action)); + deltap = delta; if (action->m_latency > 0) { if (action->m_latency > deltap) { @@ -109,7 +107,7 @@ void WorkstationL07Model::updateActionsState(double now, double delta) i++))) { constraint_id = lmm_constraint_id(cnst); - if (((WorkstationCLM03LmmPtr)constraint_id)->p_stateCurrent == SURF_RESOURCE_OFF) { + if (static_cast(constraint_id)->p_stateCurrent == SURF_RESOURCE_OFF) { XBT_DEBUG("Action (%p) Failed!!", action); action->m_finish = surf_get_clock(); action->setState(SURF_ACTION_FAILED); @@ -148,13 +146,22 @@ ActionPtr WorkstationL07Model::executeParallelTask(int workstation_nb, if (communication_amount[i * workstation_nb + j] > 0) { double lat=0.0; unsigned int cpt; + void *_link; LinkL07Ptr link; - routing_platf->getRouteAndLatency(((CpuL07Ptr)workstation_list[i])->p_info, ((CpuL07Ptr)workstation_list[j])->p_info, &route,&lat); + routing_platf->getRouteAndLatency(dynamic_cast( + static_cast( + surf_workstation_resource_priv(workstation_list[i])))->p_netElm, + dynamic_cast( + static_cast( + surf_workstation_resource_priv(workstation_list[j])))->p_netElm, + &route, + &lat); latency = MAX(latency, lat); - xbt_dynar_foreach(route, cpt, link) { - xbt_dict_set(ptask_parallel_task_link_set,link->m_name,link,NULL); + xbt_dynar_foreach(route, cpt, _link) { + link = dynamic_cast(static_cast(_link)); + xbt_dict_set(ptask_parallel_task_link_set, link->m_name, link, NULL); } } } @@ -187,19 +194,30 @@ ActionPtr WorkstationL07Model::executeParallelTask(int workstation_nb, lmm_update_variable_weight(ptask_maxmin_system, action->p_variable, 0.0); for (i = 0; i < workstation_nb; i++) - lmm_expand(ptask_maxmin_system, ((CpuL07Ptr)workstation_list[i])->p_constraint, + lmm_expand(ptask_maxmin_system, + static_cast(dynamic_cast( + static_cast( + surf_workstation_resource_priv(workstation_list[i])))->p_cpu)->p_constraint, action->p_variable, computation_amount[i]); for (i = 0; i < workstation_nb; i++) { for (j = 0; j < workstation_nb; j++) { + void *_link; LinkL07Ptr link; xbt_dynar_t route=NULL; if (communication_amount[i * workstation_nb + j] == 0.0) continue; - routing_platf->getRouteAndLatency(((CpuL07Ptr)workstation_list[i])->p_info, ((CpuL07Ptr)workstation_list[j])->p_info, &route,NULL); + routing_platf->getRouteAndLatency(dynamic_cast( + static_cast( + surf_workstation_resource_priv(workstation_list[i])))->p_netElm, + dynamic_cast( + static_cast( + surf_workstation_resource_priv(workstation_list[j])))->p_netElm, + &route, NULL); - xbt_dynar_foreach(route, cpt, link) { + xbt_dynar_foreach(route, cpt, _link) { + link = static_cast(static_cast(_link)); lmm_expand_add(ptask_maxmin_system, link->p_constraint, action->p_variable, communication_amount[i * workstation_nb + j]); @@ -212,7 +230,28 @@ ActionPtr WorkstationL07Model::executeParallelTask(int workstation_nb, action->m_remains = 0.0; } - return (surf_action_t) action; + return static_cast(action); +} + +ResourcePtr WorkstationL07Model::createResource(const char *name, double power_scale, + double power_initial, + tmgr_trace_t power_trace, + e_surf_resource_state_t state_initial, + tmgr_trace_t state_trace, + xbt_dict_t cpu_properties) +{ + WorkstationL07Ptr wk = NULL; + xbt_assert(!surf_workstation_resource_priv(surf_workstation_resource_by_name(name)), + "Host '%s' declared several times in the platform file.", + name); + + wk = new WorkstationL07(this, name, cpu_properties, + static_cast(xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL)), + dynamic_cast(static_cast(xbt_lib_get_or_null(host_lib, name, SURF_CPU_LEVEL)))); + + xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast(wk)); + + return wk;//FIXME:xbt_lib_get_elm_or_null(host_lib, name); } ActionPtr WorkstationL07Model::communicate(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst, @@ -223,8 +262,8 @@ ActionPtr WorkstationL07Model::communicate(WorkstationCLM03Ptr src, WorkstationC double *communication_amount = xbt_new0(double, 4); ActionPtr res = NULL; - workstation_list[0] = src; - workstation_list[1] = dst; + workstation_list[0] = static_cast(src); + workstation_list[1] = static_cast(dst); communication_amount[1] = size; res = executeParallelTask(2, workstation_list, @@ -237,11 +276,11 @@ ActionPtr WorkstationL07Model::communicate(WorkstationCLM03Ptr src, WorkstationC xbt_dynar_t WorkstationL07Model::getRoute(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst) { xbt_dynar_t route=NULL; - routing_platf->getRouteAndLatency(((CpuL07Ptr)src)->p_info, ((CpuL07Ptr)dst)->p_info, &route,NULL); + routing_platf->getRouteAndLatency(src->p_netElm, dst->p_netElm, &route, NULL); return route; } -WorkstationCLM03Ptr WorkstationL07Model::createCpuResource(const char *name, double power_scale, +ResourcePtr CpuL07Model::createResource(const char *name, double power_scale, double power_initial, tmgr_trace_t power_trace, e_surf_resource_state_t state_initial, @@ -255,32 +294,29 @@ WorkstationCLM03Ptr WorkstationL07Model::createCpuResource(const char *name, dou cpu = new CpuL07(this, name, cpu_properties); - cpu->p_info = (RoutingEdgePtr) xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL); - if(!(cpu->p_info)) xbt_die("Don't find ROUTING_HOST_LEVEL for '%s'",name); - cpu->p_power.scale = power_scale; xbt_assert(cpu->p_power.scale > 0, "Power has to be >0"); cpu->m_powerCurrent = power_initial; if (power_trace) cpu->p_power.event = - tmgr_history_add_trace(history, power_trace, 0.0, 0, cpu); + tmgr_history_add_trace(history, power_trace, 0.0, 0, static_cast(cpu)); cpu->p_stateCurrent = state_initial; if (state_trace) cpu->p_stateEvent = - tmgr_history_add_trace(history, state_trace, 0.0, 0, cpu); + tmgr_history_add_trace(history, state_trace, 0.0, 0, static_cast(cpu)); cpu->p_constraint = lmm_constraint_new(ptask_maxmin_system, cpu, cpu->m_powerCurrent * cpu->p_power.scale); - xbt_lib_set(host_lib, name, SURF_WKS_LEVEL, static_cast(cpu)); + xbt_lib_set(host_lib, name, SURF_CPU_LEVEL, static_cast(cpu)); return cpu;//FIXME:xbt_lib_get_elm_or_null(host_lib, name); } -WorkstationCLM03Ptr WorkstationL07Model::createLinkResource(const char *name, +ResourcePtr NetworkL07Model::createResource(const char *name, double bw_initial, tmgr_trace_t bw_trace, double lat_initial, @@ -299,15 +335,15 @@ WorkstationCLM03Ptr WorkstationL07Model::createLinkResource(const char *name, nw_link->m_bwCurrent = bw_initial; if (bw_trace) nw_link->p_bwEvent = - tmgr_history_add_trace(history, bw_trace, 0.0, 0, nw_link); + tmgr_history_add_trace(history, bw_trace, 0.0, 0, static_cast(nw_link)); nw_link->p_stateCurrent = state_initial; nw_link->m_latCurrent = lat_initial; if (lat_trace) nw_link->p_latEvent = - tmgr_history_add_trace(history, lat_trace, 0.0, 0, nw_link); + tmgr_history_add_trace(history, lat_trace, 0.0, 0, static_cast(nw_link)); if (state_trace) nw_link->p_stateEvent = - tmgr_history_add_trace(history, state_trace, 0.0, 0, nw_link); + tmgr_history_add_trace(history, state_trace, 0.0, 0, static_cast(nw_link)); nw_link->p_constraint = lmm_constraint_new(ptask_maxmin_system, nw_link, @@ -316,7 +352,7 @@ WorkstationCLM03Ptr WorkstationL07Model::createLinkResource(const char *name, if (policy == SURF_LINK_FATPIPE) lmm_constraint_shared(nw_link->p_constraint); - xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, nw_link); + xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, static_cast(nw_link)); return nw_link; } @@ -336,7 +372,7 @@ void WorkstationL07Model::addTraces() xbt_assert(host, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - host->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, host); + host->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(host)); } xbt_dict_foreach(trace_connect_list_power, cursor, trace_name, elm) { @@ -346,7 +382,7 @@ void WorkstationL07Model::addTraces() xbt_assert(host, "Host %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - host->p_power.event = tmgr_history_add_trace(history, trace, 0.0, 0, host); + host->p_power.event = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(host)); } /* Connect traces relative to network */ @@ -357,7 +393,7 @@ void WorkstationL07Model::addTraces() xbt_assert(link, "Link %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - link->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, link); + link->p_stateEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(link)); } xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) { @@ -367,7 +403,7 @@ void WorkstationL07Model::addTraces() xbt_assert(link, "Link %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - link->p_bwEvent = tmgr_history_add_trace(history, trace, 0.0, 0, link); + link->p_bwEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(link)); } xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) { @@ -377,7 +413,7 @@ void WorkstationL07Model::addTraces() xbt_assert(link, "Link %s undefined", elm); xbt_assert(trace, "Trace %s undefined", trace_name); - link->p_latEvent = tmgr_history_add_trace(history, trace, 0.0, 0, link); + link->p_latEvent = tmgr_history_add_trace(history, trace, 0.0, 0, static_cast(link)); } } @@ -385,19 +421,22 @@ void WorkstationL07Model::addTraces() * Resource * ************/ -CpuL07::CpuL07(WorkstationL07ModelPtr model, const char* name, xbt_dict_t props) : WorkstationCLM03Lmm(model, name, props) { - +WorkstationL07::WorkstationL07(WorkstationModelPtr model, const char* name, xbt_dict_t props, RoutingEdgePtr netElm, CpuPtr cpu) + : Resource(model, name, props), WorkstationCLM03Lmm(model, name, props, NULL, netElm, cpu) +{ } -LinkL07::LinkL07(WorkstationL07ModelPtr model, const char* name, xbt_dict_t props) : WorkstationCLM03Lmm(model, name, props) { +CpuL07::CpuL07(CpuL07ModelPtr model, const char* name, xbt_dict_t props) + : Resource(model, name, props), CpuLmm(model, name, props) { } -bool CpuL07::isUsed(){ - return lmm_constraint_used(ptask_maxmin_system, p_constraint); +LinkL07::LinkL07(NetworkL07ModelPtr model, const char* name, xbt_dict_t props) + : Resource(model, name, props), NetworkCm02LinkLmm(model, name, props) { + } -bool LinkL07::isUsed(){ +bool WorkstationL07::isUsed(){ return lmm_constraint_used(ptask_maxmin_system, p_constraint); } @@ -455,6 +494,10 @@ void LinkL07::updateState(tmgr_trace_event_t event_type, double value, double da return; } +e_surf_resource_state_t WorkstationL07::getState() +{ + return p_cpu->p_stateCurrent; +} e_surf_resource_state_t CpuL07::getState() { @@ -471,22 +514,22 @@ double CpuL07::getAvailableSpeed() return m_powerCurrent; } -ActionPtr CpuL07::execute(double size) +ActionPtr WorkstationL07::execute(double size) { void **workstation_list = xbt_new0(void *, 1); double *computation_amount = xbt_new0(double, 1); double *communication_amount = xbt_new0(double, 1); - workstation_list[0] = this; + workstation_list[0] = static_cast(this); communication_amount[0] = 0.0; computation_amount[0] = size; - return ((WorkstationL07ModelPtr)p_model)->executeParallelTask(1, workstation_list, + return static_cast(p_model)->executeParallelTask(1, workstation_list, computation_amount, communication_amount, -1); } -ActionPtr CpuL07::sleep(double duration) +ActionPtr WorkstationL07::sleep(double duration) { WorkstationL07ActionLmmPtr action = NULL; @@ -541,7 +584,13 @@ void WorkstationL07ActionLmm::updateBound() if (p_communicationAmount[i * m_workstationNb + j] > 0) { double lat = 0.0; - routing_platf->getRouteAndLatency(((CpuL07Ptr) p_workstationList[i])->p_info, ((CpuL07Ptr)p_workstationList[j])->p_info, &route, &lat); + routing_platf->getRouteAndLatency(dynamic_cast( + static_cast( + surf_workstation_resource_priv(p_workstationList[i])))->p_netElm, + dynamic_cast( + static_cast( + surf_workstation_resource_priv(p_workstationList[j])))->p_netElm, + &route, &lat); lat_current = MAX(lat_current, lat * p_communicationAmount[i * m_workstationNb + j]); } @@ -670,11 +719,21 @@ static void ptask_finalize(void) /*** Resource Creation & Destruction **/ /**************************************/ - +static void ptask_parse_workstation_init(sg_platf_host_cbarg_t host) +{ + static_cast(surf_workstation_model)->createResource( + host->id, + host->power_peak, + host->power_scale, + host->power_trace, + host->initial_state, + host->state_trace, + host->properties); +} static void ptask_parse_cpu_init(sg_platf_host_cbarg_t host) { - ((WorkstationL07ModelPtr)surf_workstation_model)->createCpuResource( + static_cast(surf_cpu_model)->createResource( host->id, host->power_peak, host->power_scale, @@ -691,7 +750,7 @@ static void ptask_parse_link_init(sg_platf_link_cbarg_t link) if (link->policy == SURF_LINK_FULLDUPLEX) { char *link_id; link_id = bprintf("%s_UP", link->id); - ((WorkstationL07ModelPtr)surf_workstation_model)->createLinkResource(link_id, + static_cast(surf_network_model)->createResource(link_id, link->bandwidth, link->bandwidth_trace, link->latency, @@ -702,7 +761,7 @@ static void ptask_parse_link_init(sg_platf_link_cbarg_t link) link->properties); xbt_free(link_id); link_id = bprintf("%s_DOWN", link->id); - ((WorkstationL07ModelPtr)surf_workstation_model)->createLinkResource(link_id, + static_cast(surf_network_model)->createResource(link_id, link->bandwidth, link->bandwidth_trace, link->latency, @@ -715,7 +774,7 @@ static void ptask_parse_link_init(sg_platf_link_cbarg_t link) * it */ xbt_free(link_id); } else { - ((WorkstationL07ModelPtr)surf_workstation_model)->createLinkResource(link->id, + static_cast(surf_network_model)->createResource(link->id, link->bandwidth, link->bandwidth_trace, link->latency, @@ -729,13 +788,16 @@ static void ptask_parse_link_init(sg_platf_link_cbarg_t link) current_property_set = NULL; } - +static void ptask_add_traces(){ + static_cast(surf_workstation_model)->addTraces(); +} static void ptask_define_callbacks() { sg_platf_host_add_cb(ptask_parse_cpu_init); + sg_platf_host_add_cb(ptask_parse_workstation_init); sg_platf_link_add_cb(ptask_parse_link_init); - //FIXME:sg_platf_postparse_add_cb(ptask_add_traces); + sg_platf_postparse_add_cb(ptask_add_traces); } /**************************************/ @@ -747,6 +809,7 @@ void surf_workstation_model_init_ptask_L07(void) xbt_assert(!surf_cpu_model, "CPU model type already defined"); xbt_assert(!surf_network_model, "network model type already defined"); ptask_define_callbacks(); - new WorkstationL07Model(); - xbt_dynar_push(model_list, &surf_workstation_model); + surf_workstation_model = new WorkstationL07Model(); + ModelPtr model = static_cast(surf_workstation_model); + xbt_dynar_push(model_list, &model); } diff --git a/src/surf/workstation_ptask_L07.hpp b/src/surf/workstation_ptask_L07.hpp index 38a6e9e498..cff52739ab 100644 --- a/src/surf/workstation_ptask_L07.hpp +++ b/src/surf/workstation_ptask_L07.hpp @@ -10,6 +10,15 @@ class WorkstationL07Model; typedef WorkstationL07Model *WorkstationL07ModelPtr; +class CpuL07Model; +typedef CpuL07Model *CpuL07ModelPtr; + +class NetworkL07Model; +typedef NetworkL07Model *NetworkL07ModelPtr; + +class WorkstationL07; +typedef WorkstationL07 *WorkstationL07Ptr; + class CpuL07; typedef CpuL07 *CpuL07Ptr; @@ -32,67 +41,92 @@ typedef WorkstationActionLmm *WorkstationActionLmmPtr;*/ class WorkstationL07Model : public WorkstationModel { public: WorkstationL07Model(); - void parseInit(sg_platf_host_cbarg_t host); - WorkstationCLM03Ptr createCpuResource(const char *name, double power_scale, + + double shareResources(double now); + void updateActionsState(double now, double delta); + ResourcePtr createResource(const char *name, double power_scale, double power_initial, tmgr_trace_t power_trace, e_surf_resource_state_t state_initial, tmgr_trace_t state_trace, xbt_dict_t cpu_properties); - WorkstationCLM03Ptr createLinkResource(const char *name, - double bw_initial, - tmgr_trace_t bw_trace, - double lat_initial, - tmgr_trace_t lat_trace, - e_surf_resource_state_t - state_initial, - tmgr_trace_t state_trace, - e_surf_link_sharing_policy_t - policy, xbt_dict_t properties); - double shareResources(double now); - void updateActionsState(double now, double delta); - void addTraces(); - ActionPtr executeParallelTask(int workstation_nb, void **workstation_list, double *computation_amount, double *communication_amount, double rate); - xbt_dynar_t getRoute(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst); - ActionPtr communicate(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst, double size, double rate); + xbt_dynar_t getRoute(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst); + ActionPtr communicate(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst, double size, double rate); + void addTraces(); + CpuL07ModelPtr p_cpuModel; + NetworkL07ModelPtr p_networkModel; +}; + +class CpuL07Model : public CpuModel { +public: + CpuL07Model() : CpuModel("cpuL07") {}; + ResourcePtr createResource(const char *name, double power_scale, + double power_initial, + tmgr_trace_t power_trace, + e_surf_resource_state_t state_initial, + tmgr_trace_t state_trace, + xbt_dict_t cpu_properties); + void addTraces() {DIE_IMPOSSIBLE;}; + WorkstationL07ModelPtr p_workstationModel; }; class NetworkL07Model : public NetworkCm02Model { public: - NetworkL07Model(): NetworkCm02Model() {}; + NetworkL07Model() : NetworkCm02Model(0) {}; + ResourcePtr createResource(const char *name, + double bw_initial, + tmgr_trace_t bw_trace, + double lat_initial, + tmgr_trace_t lat_trace, + e_surf_resource_state_t + state_initial, + tmgr_trace_t state_trace, + e_surf_link_sharing_policy_t + policy, xbt_dict_t properties); + NetworkCm02ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst, + double size, double rate); xbt_dynar_t getRoute(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst) {DIE_IMPOSSIBLE;}; ActionPtr communicate(WorkstationCLM03Ptr src, WorkstationCLM03Ptr dst, double size, double rate) {DIE_IMPOSSIBLE;}; void addTraces() {DIE_IMPOSSIBLE;}; + WorkstationL07ModelPtr p_workstationModel; }; /************ * Resource * ************/ -class CpuL07 : public WorkstationCLM03Lmm { +class WorkstationL07 : public WorkstationCLM03Lmm { public: - CpuL07(WorkstationL07ModelPtr model, const char* name, xbt_dict_t properties); + WorkstationL07(WorkstationModelPtr model, const char* name, xbt_dict_t props, RoutingEdgePtr netElm, CpuPtr cpu); bool isUsed(); + void updateState(tmgr_trace_event_t event_type, double value, double date) {DIE_IMPOSSIBLE;}; + ActionPtr execute(double size); + ActionPtr sleep(double duration); + e_surf_resource_state_t getState(); +}; + +class CpuL07 : public CpuLmm { +public: + CpuL07(CpuL07ModelPtr model, const char* name, xbt_dict_t properties); + bool isUsed() {DIE_IMPOSSIBLE;}; void updateState(tmgr_trace_event_t event_type, double value, double date); e_surf_resource_state_t getState(); double getSpeed(double load); double getAvailableSpeed(); - ActionPtr execute(double size); - ActionPtr sleep(double duration); - + ActionPtr execute(double size) {DIE_IMPOSSIBLE;}; + ActionPtr sleep(double duration) {DIE_IMPOSSIBLE;}; double m_powerCurrent; - RoutingEdgePtr p_info; }; -class LinkL07 : public WorkstationCLM03Lmm { +class LinkL07 : public NetworkCm02LinkLmm { public: - LinkL07(WorkstationL07ModelPtr model, const char* name, xbt_dict_t props); - bool isUsed(); + LinkL07(NetworkL07ModelPtr model, const char* name, xbt_dict_t props); + bool isUsed() {DIE_IMPOSSIBLE;}; void updateState(tmgr_trace_event_t event_type, double value, double date); double getBandwidth(); double getLatency(); @@ -109,7 +143,8 @@ public: **********/ class WorkstationL07ActionLmm : public WorkstationActionLmm { public: - WorkstationL07ActionLmm(ModelPtr model, double cost, bool failed): WorkstationActionLmm(model, cost, failed) {}; + WorkstationL07ActionLmm(ModelPtr model, double cost, bool failed) + : Action(model, cost, failed), WorkstationActionLmm(model, cost, failed) {}; ~WorkstationL07ActionLmm(); void updateBound();