double time = 0;
int i = 0;
p_timePoints = (double*) xbt_malloc0(sizeof(double) *
- (xbt_dynar_length(speedTrace->s_list.event_list) + 1));
+ (xbt_dynar_length(speedTrace->event_list) + 1));
p_integral = (double*) xbt_malloc0(sizeof(double) *
- (xbt_dynar_length(speedTrace->s_list.event_list) + 1));
- m_nbPoints = xbt_dynar_length(speedTrace->s_list.event_list) + 1;
- xbt_dynar_foreach(speedTrace->s_list.event_list, cpt, val) {
+ (xbt_dynar_length(speedTrace->event_list) + 1));
+ m_nbPoints = xbt_dynar_length(speedTrace->event_list) + 1;
+ xbt_dynar_foreach(speedTrace->event_list, cpt, val) {
p_timePoints[i] = time;
p_integral[i] = integral;
integral += val.delta * val.value;
reduced_a = a - floor(a / m_lastTime) * m_lastTime;
point = p_trace->binarySearch(p_trace->p_timePoints, reduced_a, 0,
p_trace->m_nbPoints - 1);
- xbt_dynar_get_cpy(p_speedTrace->s_list.event_list, point, &val);
+ xbt_dynar_get_cpy(p_speedTrace->event_list, point, &val);
return val.value;
}
}
/* only one point available, fixed trace */
- if (xbt_dynar_length(speedTrace->s_list.event_list) == 1) {
- xbt_dynar_get_cpy(speedTrace->s_list.event_list, 0, &val);
+ if (xbt_dynar_length(speedTrace->event_list) == 1) {
+ xbt_dynar_get_cpy(speedTrace->event_list, 0, &val);
m_type = TRACE_FIXED;
m_value = val.value;
return;
p_speedTrace = speedTrace;
/* count the total time of trace file */
- xbt_dynar_foreach(speedTrace->s_list.event_list, cpt, val) {
+ xbt_dynar_foreach(speedTrace->event_list, cpt, val) {
total_time += val.delta;
}
p_trace = new CpuTiTrace(speedTrace);
if (stateTrace)
p_stateEvent = future_evt_set->add_trace(stateTrace, 0.0, this);
- if (speedTrace && xbt_dynar_length(speedTrace->s_list.event_list) > 1) {
+ if (speedTrace && xbt_dynar_length(speedTrace->event_list) > 1) {
s_tmgr_event_t val;
// add a fake trace event if periodicity == 0
- xbt_dynar_get_cpy(speedTrace->s_list.event_list,
- xbt_dynar_length(speedTrace->s_list.event_list) - 1, &val);
+ xbt_dynar_get_cpy(speedTrace->event_list,
+ xbt_dynar_length(speedTrace->event_list) - 1, &val);
if (val.delta == 0) {
p_speedEvent =
future_evt_set->add_trace(tmgr_empty_trace_new(), p_availTrace->m_lastTime, this);
p_availTrace = new CpuTiTgmr(trace, m_speedScale);
/* add a fake trace event if periodicity == 0 */
- if (trace && xbt_dynar_length(trace->s_list.event_list) > 1) {
+ if (trace && xbt_dynar_length(trace->event_list) > 1) {
s_tmgr_event_t val;
- xbt_dynar_get_cpy(trace->s_list.event_list,
- xbt_dynar_length(trace->s_list.event_list) - 1, &val);
+ xbt_dynar_get_cpy(trace->event_list,
+ xbt_dynar_length(trace->event_list) - 1, &val);
if (val.delta == 0) {
p_speedEvent = future_evt_set->add_trace(tmgr_empty_trace_new(), 0.0, this);
}
modified(true);
speedTrace = p_availTrace->p_speedTrace;
- xbt_dynar_get_cpy(speedTrace->s_list.event_list,
- xbt_dynar_length(speedTrace->s_list.event_list) - 1, &val);
+ xbt_dynar_get_cpy(speedTrace->event_list,
+ xbt_dynar_length(speedTrace->event_list) - 1, &val);
/* free old trace */
delete p_availTrace;
m_speedScale = val.value;
for (int i = 0; i < host_nb; i++) {
for (int j = 0; j < host_nb; j++) {
- xbt_dynar_t route=NULL;
if (bytes_amount[i * host_nb + j] > 0) {
double lat=0.0;
- unsigned int cpt;
- void *_link;
- LinkL07 *link;
+ xbt_dynar_t route=NULL;
- routing_platf->getRouteAndLatency((*this->p_netcardList)[i], (*this->p_netcardList)[j],
- &route, &lat);
+ routing_platf->getRouteAndLatency((*p_netcardList)[i], (*p_netcardList)[j], &route, &lat);
latency = MAX(latency, lat);
+ void *_link;
xbt_dynar_foreach(route, cpt, _link) {
- link = static_cast<LinkL07*>(_link);
+ LinkL07 *link = static_cast<LinkL07*>(_link);
xbt_dict_set(ptask_parallel_task_link_set, link->getName(), link, NULL);
}
}
if(bytes_amount != NULL) {
for (int i = 0; i < host_nb; i++) {
for (int j = 0; j < host_nb; j++) {
- void *_link;
xbt_dynar_t route=NULL;
if (bytes_amount[i * host_nb + j] == 0.0)
continue;
- routing_platf->getRouteAndLatency((*this->p_netcardList)[i], (*this->p_netcardList)[j],
+ routing_platf->getRouteAndLatency((*p_netcardList)[i], (*p_netcardList)[j],
&route, NULL);
+ void *_link;
xbt_dynar_foreach(route, cpt, _link) {
LinkL07 *link = static_cast<LinkL07*>(_link);
lmm_expand_add(model->getMaxminSystem(), link->getConstraint(),
#include "src/surf/platform.hpp"
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
-static int host_number_int = 0;
-
-static void netcste_parse_nolink(sg_platf_link_cbarg_t link){
- xbt_die("There is no link in the Constant network model. "
- "Please remove any link from your platform (and switch to routing='None')");
-}
/*********
* Model *
{
xbt_assert(surf_network_model == NULL);
surf_network_model = new simgrid::surf::NetworkConstantModel();
+ xbt_dynar_push(all_existing_models, &surf_network_model);
routing_model_create(NULL);
- simgrid::s4u::Host::onCreation.connect([](simgrid::s4u::Host&) {
- host_number_int++;
+ simgrid::surf::on_link.connect([](sg_platf_link_cbarg_t link){
+ xbt_die("There is no link in the Constant network model. "
+ "Please remove any link from your platform (and switch to routing='None')");
});
- simgrid::surf::on_link.connect(netcste_parse_nolink);
-
- simgrid::surf::Model *model = surf_network_model;
- xbt_dynar_push(all_existing_models, &model);
}
namespace simgrid {
return storage;
}
-double StorageN11Model::shareResources(double now)
+double StorageN11Model::shareResources(double /*now*/)
{
- XBT_DEBUG("storage_share_resources %f", now);
+ XBT_DEBUG("storage_share_resources");
unsigned int i, j;
Storage *storage;
void *_write_action;
xbt_heap_free(p_heap);
}
-
+#if 0 /* probabilistic dead code. Should be reimplemented, not killed (please) */
/**
* \brief Create a #tmgr_trace_t from probabilist generators
*
return generator->next_value;
}
+#endif /* probabilistic dead code */
tmgr_trace_t tmgr_trace_new_from_string(const char *id, const char *input,
double periodicity)
"Invalid periodicity %g (must be positive)", periodicity);
trace = xbt_new0(s_tmgr_trace_t, 1);
- trace->type = e_trace_list;
- trace->s_list.event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
+ trace->event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
list = xbt_str_split(input, "\n\r");
s_tmgr_event_t first_event;
first_event.delta=event.delta;
first_event.value=-1.0;
- xbt_dynar_push(trace->s_list.event_list, &first_event);
+ xbt_dynar_push(trace->event_list, &first_event);
}
}
- xbt_dynar_push(trace->s_list.event_list, &event);
- last_event = (tmgr_event_t)xbt_dynar_get_ptr(trace->s_list.event_list, xbt_dynar_length(trace->s_list.event_list) - 1);
+ xbt_dynar_push(trace->event_list, &event);
+ last_event = (tmgr_event_t)xbt_dynar_get_ptr(trace->event_list, xbt_dynar_length(trace->event_list) - 1);
}
if (last_event)
last_event->delta = periodicity;
s_tmgr_event_t event;
trace = xbt_new0(s_tmgr_trace_t, 1);
- trace->type = e_trace_list;
- trace->s_list.event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
+ trace->event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
event.delta = 0.0;
event.value = 0.0;
- xbt_dynar_push(trace->s_list.event_list, &event);
+ xbt_dynar_push(trace->event_list, &event);
return trace;
}
if (!trace)
return;
- switch(trace->type) {
- case e_trace_list:
- xbt_dynar_free(&(trace->s_list.event_list));
- break;
- case e_trace_probabilist:
- THROW_UNIMPLEMENTED;
- break;
- }
+ xbt_dynar_free(&(trace->event_list));
free(trace);
}
trace_iterator->idx = 0;
trace_iterator->resource = resource;
- if(trace->type == e_trace_list) {
- xbt_assert((trace_iterator->idx < xbt_dynar_length(trace->s_list.event_list)),
- "You're referring to an event that does not exist!");
- }
+ xbt_assert((trace_iterator->idx < xbt_dynar_length(trace->event_list)),
+ "Your trace should have at least one event!");
xbt_heap_push(p_heap, trace_iterator, start_time);
tmgr_trace_t trace = trace_iterator->trace;
*resource = trace_iterator->resource;
- if (trace->type == e_trace_list) {
-
- tmgr_event_t event = (tmgr_event_t)xbt_dynar_get_ptr(trace->s_list.event_list, trace_iterator->idx);
+ tmgr_event_t event = (tmgr_event_t)xbt_dynar_get_ptr(trace->event_list, trace_iterator->idx);
- *value = event->value;
+ *value = event->value;
- if (trace_iterator->idx < xbt_dynar_length(trace->s_list.event_list) - 1) {
- xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
- trace_iterator->idx++;
- } else if (event->delta > 0) { /* Last element, checking for periodicity */
- xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
- trace_iterator->idx = 1; /* not 0 as the first event is a placeholder to handle when events really start */
- } else { /* We don't need this trace_event anymore */
- trace_iterator->free_me = 1;
- }
-
- } else if (trace->type == e_trace_probabilist) { //FIXME : not tested yet
- double event_delta;
- if(trace->s_probabilist.is_state_trace) {
- *value = (double) trace->s_probabilist.next_event;
- if(trace->s_probabilist.next_event == 0) {
- event_delta = tmgr_event_generator_next_value(trace->s_probabilist.event_generator[0]);
- trace->s_probabilist.next_event = 1;
- } else {
- event_delta = tmgr_event_generator_next_value(trace->s_probabilist.event_generator[1]);
- trace->s_probabilist.next_event = 0;
- }
- } else {
- event_delta = tmgr_event_generator_next_value(trace->s_probabilist.event_generator[0]);
- *value = tmgr_event_generator_next_value(trace->s_probabilist.event_generator[1]);
- }
- xbt_heap_push(p_heap, trace_iterator, event_date + event_delta);
- XBT_DEBUG("Generating a new event at date %f, with value %f", event_date + event_delta, *value);
-
- } else
- THROW_IMPOSSIBLE;
+ if (trace_iterator->idx < xbt_dynar_length(trace->event_list) - 1) {
+ xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
+ trace_iterator->idx++;
+ } else if (event->delta > 0) { /* Last element, checking for periodicity */
+ xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
+ trace_iterator->idx = 1; /* not 0 as the first event is a placeholder to handle when events really start */
+ } else { /* We don't need this trace_event anymore */
+ trace_iterator->free_me = 1;
+ }
return trace_iterator;
}
} s_probabilist_event_generator_t;
typedef struct tmgr_trace {
- enum e_trace_type type;
- union {
- struct {
- xbt_dynar_t event_list;
- } s_list;
- struct {
- probabilist_event_generator_t event_generator[2];
- int is_state_trace;
- int next_event;
- } s_probabilist;
- };
+ xbt_dynar_t event_list;
} s_tmgr_trace_t;
/* Iterator within a trace */
#ifdef __cplusplus
namespace simgrid {
+/** @brief Modeling of the resource variations, such as those due to an external load
+ *
+ * There is 3 main concepts in this module:
+ * - #trace: a set of dated values, ie a list of pair <timestamp, value>
+ * - #trace_iterator: links a given trace to a given simgrid resource. A Cpu for example has 2 iterators: state (ie, is it ON/OFF) and speed, while a link has 3 iterators: state, bandwidth and latency.
+ * - #future_evt_set: makes it easy to find the next occuring event of all traces
+ */
namespace trace_mgr {
-/* Future Event Set (collection of iterators over the traces)
+/** @brief A trace_iterator links a trace to a resource */
+XBT_PUBLIC_CLASS trace_iterator {
+
+};
+
+/** @brief A trace is a set of timed values, encoding the value that a variable takes at what time *
+ *
+ * It is useful to model dynamic platforms, where an external load that makes the resource availability change over time.
+ * To model that, you have to set several traces per resource: one for the on/off state and one for each numerical value (computational speed, bandwidt and latency).
+ */
+XBT_PUBLIC_CLASS trace {
+public:
+ /** Creates an empty trace */
+ trace() {}
+ virtual ~trace() {}
+};
+
+/** @brief Future Event Set (collection of iterators over the traces)
* That's useful to quickly know which is the next occurring event in a set of traces. */
XBT_PUBLIC_CLASS future_evt_set {
public: