+/* Copyright (c) 2013-2015. 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. */
+
+#include <cstddef>
+
+#include <algorithm>
+
+#include <xbt/log.h>
+
#include "network_smpi.hpp"
#include "simgrid/sg_config.h"
static int factor_cmp(const void *pa, const void *pb)
{
- return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor);
+ return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor) ? 1 :
+ (((s_smpi_factor_t*)pa)->factor < ((s_smpi_factor_t*)pb)->factor) ? -1 : 0;
}
radical_elements2 = xbt_str_split(value, ":");
if (xbt_dynar_length(radical_elements2) != 2)
- xbt_die("Malformed radical for smpi factor!");
+ surf_parse_error("Malformed radical for smpi factor!");
fact.factor = atol(xbt_dynar_get_as(radical_elements2, 0, char *));
fact.value = atof(xbt_dynar_get_as(radical_elements2, 1, char *));
xbt_dynar_push_as(smpi_factor, s_smpi_factor_t, fact);
if (surf_network_model)
return;
- surf_network_model = new NetworkSmpiModel();
-
- xbt_dynar_push(model_list, &surf_network_model);
+ surf_network_model = new simgrid::surf::NetworkSmpiModel();
+ net_define_callbacks();
+ xbt_dynar_push(all_existing_models, &surf_network_model);
xbt_cfg_setdefault_double(_sg_cfg_set, "network/sender_gap", 10e-6);
xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", 8775);
}
-void NetworkSmpiModel::gapAppend(double size, const NetworkCm02LinkLmmPtr link, NetworkCm02ActionLmmPtr action)
+namespace simgrid {
+namespace surf {
+
+NetworkSmpiModel::NetworkSmpiModel()
+ : NetworkCm02Model() {
+ m_haveGap=true;
+}
+
+NetworkSmpiModel::~NetworkSmpiModel(){
+ if (gap_lookup) {
+ xbt_dict_free(&gap_lookup);
+ }
+ if (smpi_bw_factor) {
+ xbt_dynar_free(&smpi_bw_factor);
+ smpi_bw_factor = NULL;
+ }
+ if (smpi_lat_factor) {
+ xbt_dynar_free(&smpi_lat_factor);
+ smpi_lat_factor = NULL;
+ }
+}
+
+void NetworkSmpiModel::gapAppend(double size, Link* link, NetworkAction *act)
{
- const char *src = link->m_name;
+ const char *src = link->getName();
xbt_fifo_t fifo;
- //surf_action_network_CM02_t last_action;
- //double bw;
+ NetworkCm02Action *action= static_cast<NetworkCm02Action*>(act);
if (sg_sender_gap > 0.0) {
if (!gap_lookup) {
- gap_lookup = xbt_dict_new();
+ gap_lookup = xbt_dict_new_homogeneous(NULL);
}
fifo = (xbt_fifo_t) xbt_dict_get_or_null(gap_lookup, src);
action->m_senderGap = 0.0;
}
}
-void NetworkSmpiModel::gapRemove(ActionLmmPtr lmm_action)
+void NetworkSmpiModel::gapRemove(Action *lmm_action)
{
xbt_fifo_t fifo;
size_t size;
- NetworkCm02ActionLmmPtr action = (NetworkCm02ActionLmmPtr)(lmm_action);
+ NetworkCm02Action *action = static_cast<NetworkCm02Action*>(lmm_action);
if (sg_sender_gap > 0.0 && action->p_senderLinkName
&& action->p_senderFifoItem) {
}
}
-double NetworkSmpiModel::latencyFactor(double size)
+double NetworkSmpiModel::bandwidthFactor(double size)
{
if (!smpi_bw_factor)
smpi_bw_factor =
double current=1.0;
xbt_dynar_foreach(smpi_bw_factor, iter, fact) {
if (size <= fact.factor) {
- XBT_DEBUG("%lf <= %ld return %f", size, fact.factor, current);
+ XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
return current;
}else
current=fact.value;
}
- XBT_DEBUG("%lf > %ld return %f", size, fact.factor, current);
+ XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
return current;
}
-double NetworkSmpiModel::bandwidthFactor(double size)
+
+double NetworkSmpiModel::latencyFactor(double size)
{
if (!smpi_lat_factor)
smpi_lat_factor =
double current=1.0;
xbt_dynar_foreach(smpi_lat_factor, iter, fact) {
if (size <= fact.factor) {
- XBT_DEBUG("%lf <= %ld return %f", size, fact.factor, current);
+ XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
return current;
}else
current=fact.value;
}
- XBT_DEBUG("%lf > %ld return %f", size, fact.factor, current);
+ XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
return current;
}
double NetworkSmpiModel::bandwidthConstraint(double rate, double bound, double size)
{
- return rate < 0 ? bound : min(bound, rate * bandwidthFactor(size));
+ return rate < 0 ? bound : std::min(bound, rate * bandwidthFactor(size));
}
/************
/**********
* Action *
**********/
+
+}
+}