1 /* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #include "network_private.h"
11 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf,
12 "Logging specific to the SURF network module");
14 surf_model_t surf_network_model = NULL;
15 static lmm_system_t network_maxmin_system = NULL;
16 static void (*network_solve) (lmm_system_t) = NULL;
18 double sg_sender_gap = 0.0;
19 double sg_latency_factor = 1.0; /* default value; can be set by model or from command line */
20 double sg_bandwidth_factor = 1.0; /* default value; can be set by model or from command line */
21 double sg_weight_S_parameter = 0.0; /* default value; can be set by model or from command line */
23 double sg_tcp_gamma = 0.0;
24 int sg_network_fullduplex = 0;
26 xbt_dict_t gap_lookup = NULL;
28 static double net_get_link_bandwidth(const void *link);
30 static void gap_append(double size, const link_CM02_t link, surf_action_network_CM02_t action) {
31 const char* src = link->lmm_resource.generic_resource.name;
33 surf_action_network_CM02_t last_action;
36 if(sg_sender_gap > 0.0) {
38 gap_lookup = xbt_dict_new();
40 fifo = (xbt_fifo_t)xbt_dict_get_or_null(gap_lookup, src);
41 action->sender.gap = 0.0;
42 if(fifo && xbt_fifo_size(fifo) > 0) {
43 /* Compute gap from last send */
44 last_action = (surf_action_network_CM02_t)xbt_fifo_get_item_content(xbt_fifo_get_last_item(fifo));
45 bw = net_get_link_bandwidth(link);
46 action->sender.gap = last_action->sender.gap + max(sg_sender_gap, last_action->sender.size / bw);
47 action->latency += action->sender.gap;
49 /* Append action as last send */
50 action->sender.link_name = link->lmm_resource.generic_resource.name;
51 fifo = (xbt_fifo_t)xbt_dict_get_or_null(gap_lookup, action->sender.link_name);
53 fifo = xbt_fifo_new();
54 xbt_dict_set(gap_lookup, action->sender.link_name, fifo, NULL);
56 action->sender.fifo_item = xbt_fifo_push(fifo, action);
57 action->sender.size = size;
61 static void gap_unknown(surf_action_network_CM02_t action) {
62 action->sender.gap = 0.0;
63 action->sender.link_name = NULL;
64 action->sender.fifo_item = NULL;
65 action->sender.size = 0.0;
68 static void gap_remove(surf_action_network_CM02_t action) {
72 if(sg_sender_gap > 0.0 && action->sender.link_name && action->sender.fifo_item) {
73 fifo = (xbt_fifo_t)xbt_dict_get_or_null(gap_lookup, action->sender.link_name);
74 xbt_fifo_remove_item(fifo, action->sender.fifo_item);
75 size = xbt_fifo_size(fifo);
78 xbt_dict_remove(gap_lookup, action->sender.link_name);
79 size = xbt_dict_size(gap_lookup);
81 xbt_dict_free(&gap_lookup);
87 /******************************************************************************/
88 /* Factors callbacks */
89 /******************************************************************************/
90 static double constant_latency_factor(double size)
92 return sg_latency_factor;
95 static double constant_bandwidth_factor(double size)
97 return sg_bandwidth_factor;
100 static double constant_bandwidth_constraint(double rate, double bound,
106 /**--------- <copy/paste C code snippet in surf/network.c> -------------
108 * ./regression2.py ./pingpong-in.dat 0.15 100 2 2.4e-5 1.25e8
111 plot "./pingpong-in.dat" using 1:2 with lines title "data", \
112 (x >= 65472) ? 0.00850436*x+558.894 : \
113 (x >= 15424) ? 0.0114635*x+167.446 : \
114 (x >= 9376) ? 0.0136219*x+124.464 : \
115 (x >= 5776) ? 0.00735707*x+105.022 : \
116 (x >= 3484) ? 0.0103235*x+90.2886 : \
117 (x >= 1426) ? 0.0131384*x+77.3159 : \
118 (x >= 732) ? 0.0233927*x+93.6146 : \
119 (x >= 257) ? 0.0236608*x+93.7637 : \
120 (x >= 0) ? 0.00985119*x+96.704 : \
121 1.0 with lines title "piecewise function"
122 *-------------------------------------------------------------------*/
124 static double smpi_bandwidth_factor(double size)
127 if (size >= 65472) return 0.940694;
128 if (size >= 15424) return 0.697866;
129 if (size >= 9376) return 0.58729;
130 if (size >= 5776) return 1.08739;
131 if (size >= 3484) return 0.77493;
132 if (size >= 1426) return 0.608902;
133 if (size >= 732) return 0.341987;
134 if (size >= 257) return 0.338112;
135 if (size >= 0) return 0.812084;
139 static double smpi_latency_factor(double size)
142 if (size >= 65472) return 11.6436;
143 if (size >= 15424) return 3.48845;
144 if (size >= 9376) return 2.59299;
145 if (size >= 5776) return 2.18796;
146 if (size >= 3484) return 1.88101;
147 if (size >= 1426) return 1.61075;
148 if (size >= 732) return 1.9503;
149 if (size >= 257) return 1.95341;
150 if (size >= 0) return 2.01467;
153 /**--------- <copy/paste C code snippet in surf/network.c> -----------*/
155 static double smpi_bandwidth_constraint(double rate, double bound,
158 return rate < 0 ? bound : min(bound, rate * smpi_bandwidth_factor(size));
162 static double (*latency_factor_callback) (double) =
163 &constant_latency_factor;
164 static double (*bandwidth_factor_callback) (double) =
165 &constant_bandwidth_factor;
166 static double (*bandwidth_constraint_callback) (double, double, double) =
167 &constant_bandwidth_constraint;
170 static link_CM02_t net_link_new(char *name,
172 tmgr_trace_t bw_trace,
174 tmgr_trace_t lat_trace,
175 e_surf_resource_state_t
177 tmgr_trace_t state_trace,
178 e_surf_link_sharing_policy_t
179 policy, xbt_dict_t properties)
181 link_CM02_t nw_link = (link_CM02_t)
182 surf_resource_lmm_new(sizeof(s_link_CM02_t),
183 surf_network_model, name, properties,
184 network_maxmin_system,
185 sg_bandwidth_factor * bw_initial,
187 state_initial, state_trace,
188 bw_initial, bw_trace);
190 xbt_assert(!xbt_lib_get_or_null(link_lib, name, SURF_LINK_LEVEL),
191 "Link '%s' declared several times in the platform file.",
194 nw_link->lat_current = lat_initial;
197 tmgr_history_add_trace(history, lat_trace, 0.0, 0, nw_link);
199 if (policy == SURF_LINK_FATPIPE)
200 lmm_constraint_shared(nw_link->lmm_resource.constraint);
202 xbt_lib_set(link_lib, name, SURF_LINK_LEVEL, nw_link);
207 static void net_parse_link_init(void)
211 tmgr_trace_t bw_trace;
213 tmgr_trace_t lat_trace;
214 e_surf_resource_state_t state_initial_link = SURF_RESOURCE_ON;
215 e_surf_link_sharing_policy_t policy_initial_link = SURF_LINK_SHARED;
216 tmgr_trace_t state_trace;
217 XBT_DEBUG("link_CM02");
218 name_link = xbt_strdup(A_surfxml_link_id);
219 surf_parse_get_double(&bw_initial, A_surfxml_link_bandwidth);
220 bw_trace = tmgr_trace_new(A_surfxml_link_bandwidth_file);
221 surf_parse_get_double(&lat_initial, A_surfxml_link_latency);
222 lat_trace = tmgr_trace_new(A_surfxml_link_latency_file);
224 xbt_assert((A_surfxml_link_state == A_surfxml_link_state_ON)
225 || (A_surfxml_link_state ==
226 A_surfxml_link_state_OFF), "Invalid state");
227 if (A_surfxml_link_state == A_surfxml_link_state_ON)
228 state_initial_link = SURF_RESOURCE_ON;
229 else if (A_surfxml_link_state == A_surfxml_link_state_OFF)
230 state_initial_link = SURF_RESOURCE_OFF;
232 if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_SHARED)
233 policy_initial_link = SURF_LINK_SHARED;
236 if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FATPIPE)
237 policy_initial_link = SURF_LINK_FATPIPE;
238 else if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX)
239 policy_initial_link = SURF_LINK_FULLDUPLEX;
242 state_trace = tmgr_trace_new(A_surfxml_link_state_file);
244 if(policy_initial_link == SURF_LINK_FULLDUPLEX)
246 net_link_new(bprintf("%s_UP",name_link), bw_initial, bw_trace,
247 lat_initial, lat_trace, state_initial_link, state_trace,
248 policy_initial_link, xbt_dict_new());
249 net_link_new(bprintf("%s_DOWN",name_link), bw_initial, bw_trace,
250 lat_initial, lat_trace, state_initial_link, state_trace,
251 policy_initial_link, xbt_dict_new());
255 net_link_new(name_link, bw_initial, bw_trace,
256 lat_initial, lat_trace, state_initial_link, state_trace,
257 policy_initial_link, xbt_dict_new());
262 static void net_create_resource(char *name,
264 tmgr_trace_t bw_trace,
266 tmgr_trace_t lat_trace,
267 e_surf_resource_state_t
269 tmgr_trace_t state_trace,
270 e_surf_link_sharing_policy_t policy,
271 xbt_dict_t properties)
273 net_link_new(name, bw_initial, bw_trace,
274 lat_initial, lat_trace, state_initial, state_trace,
275 policy, xbt_dict_new());
278 static void net_add_traces(void)
280 xbt_dict_cursor_t cursor = NULL;
281 char *trace_name, *elm;
283 static int called = 0;
288 /* connect all traces relative to network */
289 xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
290 tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
292 xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
294 xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
297 "Cannot connect trace %s to link %s: trace undefined",
300 link->lmm_resource.state_event =
301 tmgr_history_add_trace(history, trace, 0.0, 0, link);
304 xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
305 tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
307 xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
309 xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
312 "Cannot connect trace %s to link %s: trace undefined",
315 link->lmm_resource.power.event =
316 tmgr_history_add_trace(history, trace, 0.0, 0, link);
319 xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
320 tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
322 xbt_lib_get_or_null(link_lib, elm, SURF_LINK_LEVEL);
324 xbt_assert(link, "Cannot connect trace %s to link %s: link undefined",
327 "Cannot connect trace %s to link %s: trace undefined",
330 link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
334 static void net_define_callbacks(const char *file)
336 /* Figuring out the network links */
337 surfxml_add_callback(STag_surfxml_link_cb_list, &net_parse_link_init);
338 surfxml_add_callback(ETag_surfxml_platform_cb_list, &net_add_traces);
341 static int net_resource_used(void *resource_id)
343 return lmm_constraint_used(network_maxmin_system,
344 ((surf_resource_lmm_t)
345 resource_id)->constraint);
348 static int net_action_unref(surf_action_t action)
351 if (!action->refcount) {
352 xbt_swag_remove(action, action->state_set);
353 if (((surf_action_network_CM02_t) action)->variable)
354 lmm_variable_free(network_maxmin_system,
355 ((surf_action_network_CM02_t) action)->variable);
357 xbt_free(((surf_action_network_CM02_t) action)->src_name);
358 xbt_free(((surf_action_network_CM02_t) action)->dst_name);
359 if (action->category)
360 xbt_free(action->category);
362 surf_action_free(&action);
368 static void net_action_cancel(surf_action_t action)
370 surf_network_model->action_state_set(action, SURF_ACTION_FAILED);
373 void net_action_recycle(surf_action_t action)
378 #ifdef HAVE_LATENCY_BOUND_TRACKING
379 int net_get_link_latency_limited(surf_action_t action)
381 return action->latency_limited;
385 double net_action_get_remains(surf_action_t action)
387 return action->remains;
390 static double net_share_resources(double now)
392 s_surf_action_network_CM02_t s_action;
393 surf_action_network_CM02_t action = NULL;
394 xbt_swag_t running_actions =
395 surf_network_model->states.running_action_set;
398 min = generic_maxmin_share_resources(running_actions,
399 xbt_swag_offset(s_action,
401 network_maxmin_system,
404 #define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + xbt_swag_offset(s_action, variable) )))
406 xbt_swag_foreach(action, running_actions) {
407 #ifdef HAVE_LATENCY_BOUND_TRACKING
408 if (lmm_is_variable_limited_by_latency(action->variable)) {
409 (action->generic_action).latency_limited = 1;
411 (action->generic_action).latency_limited = 0;
414 if (action->latency > 0) {
416 min = action->latency;
417 else if (action->latency < min)
418 min = action->latency;
422 XBT_DEBUG("Min of share resources %f", min);
427 static void net_update_actions_state(double now, double delta)
430 surf_action_network_CM02_t action = NULL;
431 surf_action_network_CM02_t next_action = NULL;
432 xbt_swag_t running_actions =
433 surf_network_model->states.running_action_set;
435 xbt_swag_t failed_actions =
436 surf_network_model->states.failed_action_set;
439 xbt_swag_foreach_safe(action, next_action, running_actions) {
441 if (action->latency > 0) {
442 if (action->latency > deltap) {
443 double_update(&(action->latency), deltap);
446 double_update(&(deltap), action->latency);
447 action->latency = 0.0;
449 if ((action->latency == 0.0) && !(action->suspended))
450 lmm_update_variable_weight(network_maxmin_system, action->variable,
454 if (TRACE_is_enabled()) {
455 xbt_dynar_t route = global_routing->get_route(action->src_name,
459 xbt_dynar_foreach(route, i, link) {
460 TRACE_surf_link_set_utilization(link->lmm_resource.generic_resource.name,
461 action->generic_action.data,
462 (surf_action_t) action,
463 lmm_variable_getvalue
464 (action->variable), now - delta,
469 if(!lmm_get_number_of_cnst_from_var(network_maxmin_system, action->variable)) {
470 /* There is actually no link used, hence an infinite bandwidth.
471 * This happens often when using models like vivaldi.
472 * In such case, just make sure that the action completes immediately.
474 double_update(&(action->generic_action.remains),
475 action->generic_action.remains);
477 double_update(&(action->generic_action.remains),
478 lmm_variable_getvalue(action->variable) * deltap);
479 if (action->generic_action.max_duration != NO_MAX_DURATION)
480 double_update(&(action->generic_action.max_duration), delta);
482 if ((action->generic_action.remains <= 0) &&
483 (lmm_get_variable_weight(action->variable) > 0)) {
484 action->generic_action.finish = surf_get_clock();
485 surf_network_model->action_state_set((surf_action_t) action,
488 } else if ((action->generic_action.max_duration != NO_MAX_DURATION)
489 && (action->generic_action.max_duration <= 0)) {
490 action->generic_action.finish = surf_get_clock();
491 surf_network_model->action_state_set((surf_action_t) action,
500 static void net_update_resource_state(void *id,
501 tmgr_trace_event_t event_type,
502 double value, double date)
504 link_CM02_t nw_link = id;
505 /* printf("[" "%lg" "] Asking to update network card \"%s\" with value " */
506 /* "%lg" " for event %p\n", surf_get_clock(), nw_link->name, */
507 /* value, event_type); */
509 if (event_type == nw_link->lmm_resource.power.event) {
511 sg_weight_S_parameter / value - sg_weight_S_parameter /
512 (nw_link->lmm_resource.power.peak *
513 nw_link->lmm_resource.power.scale);
514 lmm_variable_t var = NULL;
515 lmm_element_t elem = NULL;
516 surf_action_network_CM02_t action = NULL;
518 nw_link->lmm_resource.power.peak = value;
519 lmm_update_constraint_bound(network_maxmin_system,
520 nw_link->lmm_resource.constraint,
521 sg_bandwidth_factor *
522 (nw_link->lmm_resource.power.peak *
523 nw_link->lmm_resource.power.scale));
525 TRACE_surf_link_set_bandwidth(date, nw_link->lmm_resource.generic_resource.name,
526 sg_bandwidth_factor *
527 (nw_link->lmm_resource.power.peak *
528 nw_link->lmm_resource.power.scale));
530 if (sg_weight_S_parameter > 0) {
531 while ((var = lmm_get_var_from_cnst
532 (network_maxmin_system, nw_link->lmm_resource.constraint,
534 action = lmm_variable_id(var);
535 action->weight += delta;
536 if (!(action->suspended))
537 lmm_update_variable_weight(network_maxmin_system,
538 action->variable, action->weight);
541 if (tmgr_trace_event_free(event_type))
542 nw_link->lmm_resource.power.event = NULL;
543 } else if (event_type == nw_link->lat_event) {
544 double delta = value - nw_link->lat_current;
545 lmm_variable_t var = NULL;
546 lmm_element_t elem = NULL;
547 surf_action_network_CM02_t action = NULL;
549 nw_link->lat_current = value;
550 while ((var = lmm_get_var_from_cnst
551 (network_maxmin_system, nw_link->lmm_resource.constraint,
553 action = lmm_variable_id(var);
554 action->lat_current += delta;
555 action->weight += delta;
556 if (action->rate < 0)
557 lmm_update_variable_bound(network_maxmin_system, action->variable,
558 sg_tcp_gamma / (2.0 *
559 action->lat_current));
561 lmm_update_variable_bound(network_maxmin_system, action->variable,
563 sg_tcp_gamma / (2.0 *
564 action->lat_current)));
566 if (action->rate < sg_tcp_gamma / (2.0 * action->lat_current)) {
567 XBT_INFO("Flow is limited BYBANDWIDTH");
569 XBT_INFO("Flow is limited BYLATENCY, latency of flow is %f",
570 action->lat_current);
573 if (!(action->suspended))
574 lmm_update_variable_weight(network_maxmin_system, action->variable,
578 if (tmgr_trace_event_free(event_type))
579 nw_link->lat_event = NULL;
580 } else if (event_type == nw_link->lmm_resource.state_event) {
582 nw_link->lmm_resource.state_current = SURF_RESOURCE_ON;
584 lmm_constraint_t cnst = nw_link->lmm_resource.constraint;
585 lmm_variable_t var = NULL;
586 lmm_element_t elem = NULL;
588 nw_link->lmm_resource.state_current = SURF_RESOURCE_OFF;
589 while ((var = lmm_get_var_from_cnst
590 (network_maxmin_system, cnst, &elem))) {
591 surf_action_t action = lmm_variable_id(var);
593 if (surf_action_state_get(action) == SURF_ACTION_RUNNING ||
594 surf_action_state_get(action) == SURF_ACTION_READY) {
595 action->finish = date;
596 surf_network_model->action_state_set(action, SURF_ACTION_FAILED);
600 if (tmgr_trace_event_free(event_type))
601 nw_link->lmm_resource.state_event = NULL;
603 XBT_CRITICAL("Unknown event ! \n");
611 static surf_action_t net_communicate(const char *src_name,
612 const char *dst_name, double size,
618 surf_action_network_CM02_t action = NULL;
619 double bandwidth_bound;
621 /* LARGE PLATFORMS HACK:
622 Add a link_CM02_t *link and a int link_nb to network_card_CM02_t. It will represent local links for this node
623 Use the cluster_id for ->id */
625 xbt_dynar_t back_route = NULL;
626 int constraints_per_variable = 0;
628 // I will need this route for some time so require for no cleanup
629 global_routing->get_route_latency(src_name, dst_name, &route, &latency, 0);
631 if (sg_network_fullduplex == 1) {
632 back_route = global_routing->get_route(dst_name, src_name);
635 /* LARGE PLATFORMS HACK:
636 total_route_size = route_size + src->link_nb + dst->nb */
638 XBT_IN("(%s,%s,%g,%g)", src_name, dst_name, size, rate);
639 /* LARGE PLATFORMS HACK:
640 assert on total_route_size */
641 xbt_assert(xbt_dynar_length(route) || latency,
642 "You're trying to send data from %s to %s but there is no connection at all between these two hosts.",
645 xbt_dynar_foreach(route, i, link) {
646 if (link->lmm_resource.state_current == SURF_RESOURCE_OFF) {
652 surf_action_new(sizeof(s_surf_action_network_CM02_t), size,
653 surf_network_model, failed);
654 #ifdef HAVE_LATENCY_BOUND_TRACKING
655 (action->generic_action).latency_limited = 0;
657 action->weight = action->latency = latency;
659 xbt_swag_insert(action, action->generic_action.state_set);
662 bandwidth_bound = -1.0;
664 xbt_dynar_foreach(route, i, link) {
666 sg_weight_S_parameter /
667 (link->lmm_resource.power.peak * link->lmm_resource.power.scale);
668 if (bandwidth_bound < 0.0)
670 (*bandwidth_factor_callback) (size) *
671 (link->lmm_resource.power.peak * link->lmm_resource.power.scale);
675 (*bandwidth_factor_callback) (size) *
676 (link->lmm_resource.power.peak *
677 link->lmm_resource.power.scale));
679 /* LARGE PLATFORMS HACK:
680 Add src->link and dst->link latencies */
681 action->lat_current = action->latency;
682 action->latency *= (*latency_factor_callback) (size);
684 (*bandwidth_constraint_callback) (action->rate, bandwidth_bound,
687 if(xbt_dynar_length(route) > 0) {
688 link = *(link_CM02_t*)xbt_dynar_get_ptr(route, 0);
689 gap_append(size, link, action);
690 XBT_DEBUG("Comm %p: %s -> %s gap=%f (lat=%f)",
691 action, src_name, dst_name, action->sender.gap, action->latency);
697 /* LARGE PLATFORMS HACK:
698 lmm_variable_new(..., total_route_size) */
699 if (back_route != NULL) {
700 constraints_per_variable =
701 xbt_dynar_length(route) + xbt_dynar_length(back_route);
703 constraints_per_variable = xbt_dynar_length(route);
706 if (action->latency > 0)
708 lmm_variable_new(network_maxmin_system, action, 0.0, -1.0,
709 constraints_per_variable);
712 lmm_variable_new(network_maxmin_system, action, 1.0, -1.0,
713 constraints_per_variable);
715 if (action->rate < 0) {
716 if (action->lat_current > 0)
717 lmm_update_variable_bound(network_maxmin_system, action->variable,
718 sg_tcp_gamma / (2.0 *
719 action->lat_current));
721 lmm_update_variable_bound(network_maxmin_system, action->variable,
724 if (action->lat_current > 0)
725 lmm_update_variable_bound(network_maxmin_system, action->variable,
727 sg_tcp_gamma / (2.0 *
728 action->lat_current)));
730 lmm_update_variable_bound(network_maxmin_system, action->variable,
734 xbt_dynar_foreach(route, i, link) {
735 lmm_expand(network_maxmin_system, link->lmm_resource.constraint,
736 action->variable, 1.0);
739 if (sg_network_fullduplex == 1) {
740 XBT_DEBUG("Fullduplex active adding backward flow using 5%c", '%');
741 xbt_dynar_foreach(back_route, i, link) {
742 lmm_expand(network_maxmin_system, link->lmm_resource.constraint,
743 action->variable, .05);
746 /* LARGE PLATFORMS HACK:
747 expand also with src->link and dst->link */
749 if (TRACE_is_enabled()) {
750 action->src_name = xbt_strdup(src_name);
751 action->dst_name = xbt_strdup(dst_name);
753 action->src_name = action->dst_name = NULL;
757 xbt_dynar_free(&route);
760 return (surf_action_t) action;
763 static xbt_dynar_t net_get_route(const char *src, const char *dst)
765 return global_routing->get_route(src, dst);
768 static double net_get_link_bandwidth(const void *link)
770 surf_resource_lmm_t lmm = (surf_resource_lmm_t) link;
771 return lmm->power.peak * lmm->power.scale;
774 static double net_get_link_latency(const void *link)
776 return ((link_CM02_t) link)->lat_current;
779 static int net_link_shared(const void *link)
782 lmm_constraint_is_shared(((surf_resource_lmm_t) link)->constraint);
785 static void net_action_suspend(surf_action_t action)
787 ((surf_action_network_CM02_t) action)->suspended = 1;
788 lmm_update_variable_weight(network_maxmin_system,
789 ((surf_action_network_CM02_t)
790 action)->variable, 0.0);
793 static void net_action_resume(surf_action_t action)
795 if (((surf_action_network_CM02_t) action)->suspended) {
796 lmm_update_variable_weight(network_maxmin_system,
797 ((surf_action_network_CM02_t)
799 ((surf_action_network_CM02_t)
801 ((surf_action_network_CM02_t) action)->suspended = 0;
805 static int net_action_is_suspended(surf_action_t action)
807 return ((surf_action_network_CM02_t) action)->suspended;
810 void net_action_set_max_duration(surf_action_t action, double duration)
812 action->max_duration = duration;
816 static void net_action_set_category(surf_action_t action, const char *category)
818 action->category = xbt_strdup (category);
822 static void net_finalize(void)
824 surf_model_exit(surf_network_model);
825 surf_network_model = NULL;
827 global_routing->finalize();
829 lmm_system_free(network_maxmin_system);
830 network_maxmin_system = NULL;
833 static void surf_network_model_init_internal(void)
835 surf_network_model = surf_model_init();
837 surf_network_model->name = "network";
838 surf_network_model->action_unref = net_action_unref;
839 surf_network_model->action_cancel = net_action_cancel;
840 surf_network_model->action_recycle = net_action_recycle;
841 surf_network_model->get_remains = net_action_get_remains;
842 #ifdef HAVE_LATENCY_BOUND_TRACKING
843 surf_network_model->get_latency_limited = net_get_link_latency_limited;
846 surf_network_model->model_private->resource_used = net_resource_used;
847 surf_network_model->model_private->share_resources = net_share_resources;
848 surf_network_model->model_private->update_actions_state =
849 net_update_actions_state;
850 surf_network_model->model_private->update_resource_state =
851 net_update_resource_state;
852 surf_network_model->model_private->finalize = net_finalize;
854 surf_network_model->suspend = net_action_suspend;
855 surf_network_model->resume = net_action_resume;
856 surf_network_model->is_suspended = net_action_is_suspended;
857 surf_network_model->set_max_duration = net_action_set_max_duration;
859 surf_network_model->set_category = net_action_set_category;
862 surf_network_model->extension.network.communicate = net_communicate;
863 surf_network_model->extension.network.get_route = net_get_route;
864 surf_network_model->extension.network.get_link_bandwidth =
865 net_get_link_bandwidth;
866 surf_network_model->extension.network.get_link_latency =
867 net_get_link_latency;
868 surf_network_model->extension.network.link_shared = net_link_shared;
869 surf_network_model->extension.network.add_traces = net_add_traces;
870 surf_network_model->extension.network.create_resource =
873 if (!network_maxmin_system)
874 network_maxmin_system = lmm_system_new();
876 routing_model_create(sizeof(link_CM02_t),
877 net_link_new(xbt_strdup("__loopback__"),
878 498000000, NULL, 0.000015, NULL,
879 SURF_RESOURCE_ON, NULL,
880 SURF_LINK_FATPIPE, NULL),
881 net_get_link_latency);
886 /************************************************************************/
887 /* New model based on LV08 and experimental results of MPI ping-pongs */
888 /************************************************************************/
889 void surf_network_model_init_SMPI(const char *filename)
892 if (surf_network_model)
894 surf_network_model_init_internal();
895 latency_factor_callback = &smpi_latency_factor;
896 bandwidth_factor_callback = &smpi_bandwidth_factor;
897 bandwidth_constraint_callback = &smpi_bandwidth_constraint;
898 net_define_callbacks(filename);
899 xbt_dynar_push(model_list, &surf_network_model);
900 network_solve = lmm_solve;
902 xbt_cfg_setdefault_double(_surf_cfg_set, "network/sender_gap", 10e-6);
903 xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 8775);
905 update_model_description(surf_network_model_description,
906 "SMPI", surf_network_model);
909 /************************************************************************/
910 /* New model based on optimizations discussed during this thesis */
911 /************************************************************************/
912 void surf_network_model_init_LegrandVelho(const char *filename)
915 if (surf_network_model)
917 surf_network_model_init_internal();
918 net_define_callbacks(filename);
919 xbt_dynar_push(model_list, &surf_network_model);
920 network_solve = lmm_solve;
922 xbt_cfg_setdefault_double(_surf_cfg_set, "network/latency_factor", 10.4);
923 xbt_cfg_setdefault_double(_surf_cfg_set, "network/bandwidth_factor",
925 xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 8775);
927 update_model_description(surf_network_model_description,
928 "LV08", surf_network_model);
931 /***************************************************************************/
932 /* The nice TCP sharing model designed by Loris Marchal and Henri Casanova */
933 /***************************************************************************/
934 /* @TechReport{ rr-lip2002-40, */
935 /* author = {Henri Casanova and Loris Marchal}, */
936 /* institution = {LIP}, */
937 /* title = {A Network Model for Simulation of Grid Application}, */
938 /* number = {2002-40}, */
942 void surf_network_model_init_CM02(const char *filename)
945 if (surf_network_model)
947 surf_network_model_init_internal();
948 net_define_callbacks(filename);
949 xbt_dynar_push(model_list, &surf_network_model);
950 network_solve = lmm_solve;
952 update_model_description(surf_network_model_description,
953 "CM02", surf_network_model);
956 void surf_network_model_init_Reno(const char *filename)
958 if (surf_network_model)
960 surf_network_model_init_internal();
961 net_define_callbacks(filename);
963 xbt_dynar_push(model_list, &surf_network_model);
964 lmm_set_default_protocol_function(func_reno_f, func_reno_fp,
966 network_solve = lagrange_solve;
968 xbt_cfg_setdefault_double(_surf_cfg_set, "network/latency_factor", 10.4);
969 xbt_cfg_setdefault_double(_surf_cfg_set, "network/bandwidth_factor",
971 xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 8775);
973 update_model_description(surf_network_model_description,
974 "Reno", surf_network_model);
978 void surf_network_model_init_Reno2(const char *filename)
980 if (surf_network_model)
982 surf_network_model_init_internal();
983 net_define_callbacks(filename);
985 xbt_dynar_push(model_list, &surf_network_model);
986 lmm_set_default_protocol_function(func_reno2_f, func_reno2_fp,
988 network_solve = lagrange_solve;
990 xbt_cfg_setdefault_double(_surf_cfg_set, "network/latency_factor", 10.4);
991 xbt_cfg_setdefault_double(_surf_cfg_set, "network/bandwidth_factor",
993 xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S_parameter",
996 update_model_description(surf_network_model_description,
997 "Reno2", surf_network_model);
1000 void surf_network_model_init_Vegas(const char *filename)
1002 if (surf_network_model)
1004 surf_network_model_init_internal();
1005 net_define_callbacks(filename);
1007 xbt_dynar_push(model_list, &surf_network_model);
1008 lmm_set_default_protocol_function(func_vegas_f, func_vegas_fp,
1010 network_solve = lagrange_solve;
1012 xbt_cfg_setdefault_double(_surf_cfg_set, "network/latency_factor", 10.4);
1013 xbt_cfg_setdefault_double(_surf_cfg_set, "network/bandwidth_factor",
1015 xbt_cfg_setdefault_double(_surf_cfg_set, "network/weight_S", 8775);
1017 update_model_description(surf_network_model_description,
1018 "Vegas", surf_network_model);