-/* $Id$ */
-
-/* Copyright (c) 2004 Arnaud Legrand. All rights reserved. */
+/* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
+ * All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
static lmm_system_t network_maxmin_system = NULL;
static void (*network_solve) (lmm_system_t) = NULL;
-double latency_factor = 1.0; /* default value */
-double bandwidth_factor = 1.0; /* default value */
-double weight_S_parameter = 0.0; /* default value */
+double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */
+double sg_bandwidth_factor = 1.0; /* default value; can be set by model or from command line */
+double sg_weight_S_parameter = 0.0;/* default value; can be set by model or from command line */
double sg_tcp_gamma = 0.0;
+/******************************************************************************/
+/* Factors callbacks */
+/******************************************************************************/
+static double constant_latency_factor(double size)
+{
+ return sg_latency_factor;
+}
+
+static double constant_bandwidth_factor(double size)
+{
+ return sg_bandwidth_factor;
+}
+
+static double constant_bandwidth_constraint(double rate, double bound, double size)
+{
+ return rate;
+}
+
+/**********************/
+/* SMPI callbacks */
+/**********************/
+static double smpi_latency_factor(double size)
+{
+ /* 1 B <= size <= 1 KiB */
+ if (size <= 1024.0) {
+ return 1.0056;
+ }
+
+ /* 2 KiB <= size <= 32 KiB */
+ if (size <= 32768.0) {
+ return 1.8805;
+ }
+
+ /* 64 KiB <= size <= 4 MiB */
+ return 22.7111;
+}
+
+static double smpi_bandwidth_factor(double size)
+{
+ /* 1 B <= size <= 1 KiB */
+ if (size <= 1024.0) {
+ return 0.2758;
+ }
+
+ /* 2 KiB <= size <= 32 KiB */
+ if (size <= 32768.0) {
+ return 0.5477;
+ }
+
+ /* 64 KiB <= size <= 4 MiB */
+ return 0.9359;
+}
+
+static double smpi_bandwidth_constraint(double rate, double bound, double size)
+{
+ return rate < 0 ? bound : min(bound, rate * smpi_bandwidth_factor(size));
+}
+
+
+static double (*latency_factor_callback)(double) = &constant_latency_factor;
+static double (*bandwidth_factor_callback)(double) = &constant_bandwidth_factor;
+static double (*bandwidth_constraint_callback)(double, double, double) = &constant_bandwidth_constraint;
+
+
static link_CM02_t net_link_new(char *name,
double bw_initial,
tmgr_trace_t bw_trace,
surf_resource_lmm_new(sizeof(s_link_CM02_t),
surf_network_model, name, properties,
network_maxmin_system,
- bandwidth_factor * bw_initial,
+ sg_bandwidth_factor * bw_initial,
history,
state_initial, state_trace,
bw_initial, bw_trace);
xbt_dict_set(surf_network_model->resource_set, name, nw_link,
surf_resource_free);
+#ifdef HAVE_TRACING
+ TRACE_surf_link_declaration (name, bw_initial, lat_initial);
+#endif
return nw_link;
}
static void net_action_cancel(surf_action_t action)
{
+ surf_network_model->action_state_set((surf_action_t) action,
+ SURF_ACTION_FAILED);
return;
}
*/
xbt_swag_foreach_safe(action, next_action, running_actions) {
+
+#ifdef HAVE_TRACING
+ xbt_dynar_t route = used_routing->get_route(action->src, action->dst);
+ link_CM02_t link;
+ unsigned int i;
+ xbt_dynar_foreach(route, i, link) {
+ TRACE_surf_link_set_utilization (link->lmm_resource.generic_resource.name,
+ action->generic_action.data, lmm_variable_getvalue(action->variable), now-delta, delta);
+ }
+#endif
+
deltap = delta;
if (action->latency > 0) {
if (action->latency > deltap) {
if (event_type == nw_link->lmm_resource.power.event) {
double delta =
- weight_S_parameter / value - weight_S_parameter /
+ sg_weight_S_parameter / value - sg_weight_S_parameter /
(nw_link->lmm_resource.power.peak * nw_link->lmm_resource.power.scale);
lmm_variable_t var = NULL;
lmm_element_t elem = NULL;
nw_link->lmm_resource.power.peak = value;
lmm_update_constraint_bound(network_maxmin_system,
nw_link->lmm_resource.constraint,
- bandwidth_factor *
+ sg_bandwidth_factor *
(nw_link->lmm_resource.power.peak *
nw_link->lmm_resource.power.scale));
- if (weight_S_parameter > 0) {
+#ifdef HAVE_TRACING
+ TRACE_surf_link_set_bandwidth (date, nw_link->lmm_resource.generic_resource.name, sg_bandwidth_factor * (nw_link->lmm_resource.power.peak * nw_link->lmm_resource.power.scale));
+#endif
+ if (sg_weight_S_parameter > 0) {
while ((var = lmm_get_var_from_cnst
(network_maxmin_system, nw_link->lmm_resource.constraint,
&elem))) {
static surf_action_t net_communicate(const char *src_name, const char *dst_name,
int src, int dst, double size, double rate)
{
+ unsigned int i;
+ link_CM02_t link;
+ int failed = 0;
surf_action_network_CM02_t action = NULL;
+ double bandwidth_bound;
/* LARGE PLATFORMS HACK:
Add a link_CM02_t *link and a int link_nb to network_card_CM02_t. It will represent local links for this node
Use the cluster_id for ->id */
xbt_dynar_t route = used_routing->get_route(src, dst);
/* LARGE PLATFORMS HACK:
total_route_size = route_size + src->link_nb + dst->nb */
- unsigned int i;
XBT_IN4("(%s,%s,%g,%g)", src_name, dst_name, size, rate);
/* LARGE PLATFORMS HACK:
"You're trying to send data from %s to %s but there is no connection between these two hosts.",
src_name, dst_name);
- link_CM02_t link;
- int failed = 0;
xbt_dynar_foreach(route, i, link) {
if (link->lmm_resource.state_current == SURF_RESOURCE_OFF) {
failed = 1;
action->latency = 0.0;
action->weight = 0.0;
+ bandwidth_bound = -1.0;
xbt_dynar_foreach(route, i, link) {
action->latency += link->lat_current;
action->weight +=
link->lat_current +
- weight_S_parameter /
+ sg_weight_S_parameter /
(link->lmm_resource.power.peak * link->lmm_resource.power.scale);
+ if(bandwidth_bound < 0.0)
+ bandwidth_bound = (*bandwidth_factor_callback)(size) * (link->lmm_resource.power.peak * link->lmm_resource.power.scale);
+ else
+ bandwidth_bound = min(bandwidth_bound, (*bandwidth_factor_callback)(size) * (link->lmm_resource.power.peak * link->lmm_resource.power.scale));
}
/* LARGE PLATFORMS HACK:
Add src->link and dst->link latencies */
action->lat_current = action->latency;
- action->latency *= latency_factor;
+ action->latency *= (*latency_factor_callback)(size);
+ action->rate = (*bandwidth_constraint_callback)(action->rate, bandwidth_bound, size);
/* LARGE PLATFORMS HACK:
lmm_variable_new(..., total_route_size) */
/* LARGE PLATFORMS HACK:
expand also with src->link and dst->link */
+ /* saving the src and dst of this communication */
+ action->src = src;
+ action->dst = dst;
+
XBT_OUT;
return (surf_action_t) action;
NULL));
}
+/************************************************************************/
+/* New model based on LV08 and experimental results of MPI ping-pongs */
+/************************************************************************/
+void surf_network_model_init_SMPI(const char *filename)
+{
+
+ if (surf_network_model)
+ return;
+ surf_network_model_init_internal();
+ latency_factor_callback = &smpi_latency_factor;
+ bandwidth_factor_callback = &smpi_bandwidth_factor;
+ bandwidth_constraint_callback = &smpi_bandwidth_constraint;
+ net_define_callbacks(filename);
+ xbt_dynar_push(model_list, &surf_network_model);
+ network_solve = lmm_solve;
+
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/weight_S", 8775);
+
+ update_model_description(surf_network_model_description,
+ "SMPI", surf_network_model);
+}
+
/************************************************************************/
/* New model based on optimizations discussed during this thesis */
/************************************************************************/
xbt_dynar_push(model_list, &surf_network_model);
network_solve = lmm_solve;
- latency_factor = 10.4;
- bandwidth_factor = 0.92;
- weight_S_parameter = 8775;
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/latency_factor",10.4);
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/bandwidth_factor", 0.92);
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/weight_S", 8775);
update_model_description(surf_network_model_description,
"LV08", surf_network_model);
lmm_set_default_protocol_function(func_reno_f, func_reno_fp, func_reno_fpi);
network_solve = lagrange_solve;
- latency_factor = 10.4;
- bandwidth_factor = 0.92;
- weight_S_parameter = 8775;
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/latency_factor", 10.4);
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/bandwidth_factor", 0.92);
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/weight_S", 8775);
update_model_description(surf_network_model_description,
"Reno", surf_network_model);
func_reno2_fpi);
network_solve = lagrange_solve;
- latency_factor = 10.4;
- bandwidth_factor = 0.92;
- weight_S_parameter = 8775;
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/latency_factor", 10.4);
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/bandwidth_factor", 0.92);
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/weight_S_parameter", 8775);
update_model_description(surf_network_model_description,
"Reno2", surf_network_model);
func_vegas_fpi);
network_solve = lagrange_solve;
- latency_factor = 10.4;
- bandwidth_factor = 0.92;
- weight_S_parameter = 8775;
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/latency_factor", 10.4);
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/bandwidth_factor", 0.92);
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/weight_S", 8775);
update_model_description(surf_network_model_description,
"Vegas", surf_network_model);