A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #193 from Takishipp/signals
[simgrid.git]
/
examples
/
simdag
/
scheduling
/
sd_scheduling.c
diff --git
a/examples/simdag/scheduling/sd_scheduling.c
b/examples/simdag/scheduling/sd_scheduling.c
index
437ba69
..
bb53f2b
100644
(file)
--- a/
examples/simdag/scheduling/sd_scheduling.c
+++ b/
examples/simdag/scheduling/sd_scheduling.c
@@
-8,7
+8,7
@@
#include <string.h>
#include "simgrid/simdag.h"
#include <string.h>
#include "simgrid/simdag.h"
-#if HAVE_JEDULE
+#if
SIMGRID_
HAVE_JEDULE
#include "simgrid/jedule/jedule_sd_binding.h"
#endif
#include "simgrid/jedule/jedule_sd_binding.h"
#endif
@@
-21,19
+21,6
@@
struct _HostAttribute {
SD_task_t last_scheduled_task;
};
SD_task_t last_scheduled_task;
};
-static void sg_host_allocate_attribute(sg_host_t host)
-{
- void *data;
- data = calloc(1, sizeof(struct _HostAttribute));
- sg_host_user_set(host, data);
-}
-
-static void sg_host_free_attribute(sg_host_t host)
-{
- free(sg_host_user(host));
- sg_host_user_set(host, NULL);
-}
-
static double sg_host_get_available_at(sg_host_t host)
{
HostAttribute attr = (HostAttribute) sg_host_user(host);
static double sg_host_get_available_at(sg_host_t host)
{
HostAttribute attr = (HostAttribute) sg_host_user(host);
@@
-77,41
+64,30
@@
static xbt_dynar_t get_ready_tasks(xbt_dynar_t dax)
static double finish_on_at(SD_task_t task, sg_host_t host)
{
static double finish_on_at(SD_task_t task, sg_host_t host)
{
- volatile double result;
- unsigned int i;
- double data_available = 0.;
- double redist_time = 0;
- double last_data_available;
- SD_task_t parent, grand_parent;
- xbt_dynar_t parents, grand_parents;
-
- sg_host_t *grand_parent_host_list;
+ double result;
- parents = SD_task_get_parents(task);
+
xbt_dynar_t
parents = SD_task_get_parents(task);
if (!xbt_dynar_is_empty(parents)) {
if (!xbt_dynar_is_empty(parents)) {
+ unsigned int i;
+ double data_available = 0.;
+ double redist_time = 0;
+ double last_data_available;
/* compute last_data_available */
/* compute last_data_available */
+ SD_task_t parent;
last_data_available = -1.0;
xbt_dynar_foreach(parents, i, parent) {
/* normal case */
if (SD_task_get_kind(parent) == SD_TASK_COMM_E2E) {
last_data_available = -1.0;
xbt_dynar_foreach(parents, i, parent) {
/* normal case */
if (SD_task_get_kind(parent) == SD_TASK_COMM_E2E) {
- grand_parents = SD_task_get_parents(parent);
-
- xbt_assert(xbt_dynar_length(grand_parents) <2, "Error: transfer %s has 2 parents", SD_task_get_name(parent));
-
- xbt_dynar_get_cpy(grand_parents, 0, &grand_parent);
-
- grand_parent_host_list = SD_task_get_workstation_list(grand_parent);
+ sg_host_t * parent_host= SD_task_get_workstation_list(parent);
/* Estimate the redistribution time from this parent */
/* Estimate the redistribution time from this parent */
- if (SD_task_get_amount(parent)
== 0
){
+ if (SD_task_get_amount(parent)
<= 1e-6
){
redist_time= 0;
} else {
redist_time= 0;
} else {
- redist_time =
SD_route_get_latency(grand_parent_host_li
st[0], host) +
- SD_task_get_amount(parent) /
SD_route_get_bandwidth(grand_parent_host_li
st[0], host);
+ redist_time =
sg_host_route_latency(parent_ho
st[0], host) +
+ SD_task_get_amount(parent) /
sg_host_route_bandwidth(parent_ho
st[0], host);
}
}
- data_available = SD_task_get_finish_time(grand_parent) + redist_time;
-
- xbt_dynar_free_container(&grand_parents);
+ data_available = SD_task_get_start_time(parent) + redist_time;
}
/* no transfer, control dependency */
}
/* no transfer, control dependency */
@@
-136,17
+112,13
@@
static double finish_on_at(SD_task_t task, sg_host_t host)
static sg_host_t SD_task_get_best_host(SD_task_t task)
{
static sg_host_t SD_task_get_best_host(SD_task_t task)
{
- int i;
- double EFT, min_EFT = -1.0;
- const sg_host_t *hosts = sg_host_list();
+ sg_host_t *hosts = sg_host_list();
int nhosts = sg_host_count();
int nhosts = sg_host_count();
- sg_host_t best_host;
-
- best_host = hosts[0];
- min_EFT = finish_on_at(task, hosts[0]);
+ sg_host_t best_host = hosts[0];
+ double min_EFT = finish_on_at(task, hosts[0]);
- for (i = 1; i < nhosts; i++) {
- EFT = finish_on_at(task, hosts[i]);
+ for (i
nt i
= 1; i < nhosts; i++) {
+
double
EFT = finish_on_at(task, hosts[i]);
XBT_DEBUG("%s finishes on %s at %f", SD_task_get_name(task), sg_host_get_name(hosts[i]), EFT);
if (EFT < min_EFT) {
XBT_DEBUG("%s finishes on %s at %f", SD_task_get_name(task), sg_host_get_name(hosts[i]), EFT);
if (EFT < min_EFT) {
@@
-154,20
+126,19
@@
static sg_host_t SD_task_get_best_host(SD_task_t task)
best_host = hosts[i];
}
}
best_host = hosts[i];
}
}
+ xbt_free(hosts);
return best_host;
}
int main(int argc, char **argv)
{
unsigned int cursor;
return best_host;
}
int main(int argc, char **argv)
{
unsigned int cursor;
- double finish_time, min_finish_time = -1.0;
- SD_task_t task, selected_task = NULL, last_scheduled_task;
+ double min_finish_time = -1.0;
+ SD_task_t task;
+ SD_task_t selected_task = NULL;
xbt_dynar_t ready_tasks;
xbt_dynar_t ready_tasks;
- sg_host_t host, selected_host = NULL;
- int total_nhosts = 0;
- const sg_host_t *hosts = NULL;
+ sg_host_t selected_host = NULL;
char * tracefilename = NULL;
char * tracefilename = NULL;
- xbt_dynar_t dax;
/* initialization of SD */
SD_init(&argc, argv);
/* initialization of SD */
SD_init(&argc, argv);
@@
-183,14
+154,14
@@
int main(int argc, char **argv)
SD_create_environment(argv[1]);
/* Allocating the host attribute */
SD_create_environment(argv[1]);
/* Allocating the host attribute */
- total_nhosts = sg_host_count();
- hosts = sg_host_list();
+
int
total_nhosts = sg_host_count();
+
sg_host_t *
hosts = sg_host_list();
for (cursor = 0; cursor < total_nhosts; cursor++)
for (cursor = 0; cursor < total_nhosts; cursor++)
- sg_host_
allocate_attribute(hosts[cursor]
);
+ sg_host_
user_set(hosts[cursor], xbt_new0(struct _HostAttribute, 1)
);
/* load the DAX file */
/* load the DAX file */
- dax = SD_daxload(argv[2]);
+
xbt_dynar_t
dax = SD_daxload(argv[2]);
xbt_dynar_foreach(dax, cursor, task) {
SD_task_watch(task, SD_DONE);
xbt_dynar_foreach(dax, cursor, task) {
SD_task_watch(task, SD_DONE);
@@
-198,15
+169,20
@@
int main(int argc, char **argv)
/* Schedule the root first */
xbt_dynar_get_cpy(dax, 0, &task);
/* Schedule the root first */
xbt_dynar_get_cpy(dax, 0, &task);
- host = SD_task_get_best_host(task);
+
sg_host_t
host = SD_task_get_best_host(task);
SD_task_schedulel(task, 1, host);
SD_task_schedulel(task, 1, host);
+ xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL);
+ SD_simulate_with_update(-1.0, changed_tasks);
- while (!xbt_dynar_is_empty(
SD_simulate(-1.0)
)) {
+ while (!xbt_dynar_is_empty(
changed_tasks
)) {
/* Get the set of ready tasks */
ready_tasks = get_ready_tasks(dax);
/* Get the set of ready tasks */
ready_tasks = get_ready_tasks(dax);
+ xbt_dynar_reset(changed_tasks);
+
if (xbt_dynar_is_empty(ready_tasks)) {
xbt_dynar_free_container(&ready_tasks);
/* there is no ready task, let advance the simulation */
if (xbt_dynar_is_empty(ready_tasks)) {
xbt_dynar_free_container(&ready_tasks);
/* there is no ready task, let advance the simulation */
+ SD_simulate_with_update(-1.0, changed_tasks);
continue;
}
/* For each ready task:
continue;
}
/* For each ready task:
@@
-216,8
+192,8
@@
int main(int argc, char **argv)
xbt_dynar_foreach(ready_tasks, cursor, task) {
XBT_DEBUG("%s is ready", SD_task_get_name(task));
host = SD_task_get_best_host(task);
xbt_dynar_foreach(ready_tasks, cursor, task) {
XBT_DEBUG("%s is ready", SD_task_get_name(task));
host = SD_task_get_best_host(task);
- finish_time = finish_on_at(task, host);
- if (min_finish_time
== -1.
|| finish_time < min_finish_time) {
+
double
finish_time = finish_on_at(task, host);
+ if (min_finish_time
< 0
|| finish_time < min_finish_time) {
min_finish_time = finish_time;
selected_task = task;
selected_host = host;
min_finish_time = finish_time;
selected_task = task;
selected_host = host;
@@
-236,7
+212,7
@@
int main(int argc, char **argv)
* new dependency
*/
* new dependency
*/
- last_scheduled_task = sg_host_get_last_scheduled_task(selected_host);
+
SD_task_t
last_scheduled_task = sg_host_get_last_scheduled_task(selected_host);
if (last_scheduled_task && (SD_task_get_state(last_scheduled_task) != SD_DONE) &&
(SD_task_get_state(last_scheduled_task) != SD_FAILED) &&
!SD_task_dependency_exists(sg_host_get_last_scheduled_task(selected_host), selected_task))
if (last_scheduled_task && (SD_task_get_state(last_scheduled_task) != SD_DONE) &&
(SD_task_get_state(last_scheduled_task) != SD_FAILED) &&
!SD_task_dependency_exists(sg_host_get_last_scheduled_task(selected_host), selected_task))
@@
-248,27
+224,31
@@
int main(int argc, char **argv)
xbt_dynar_free_container(&ready_tasks);
/* reset the min_finish_time for the next set of ready tasks */
min_finish_time = -1.;
xbt_dynar_free_container(&ready_tasks);
/* reset the min_finish_time for the next set of ready tasks */
min_finish_time = -1.;
+ xbt_dynar_reset(changed_tasks);
+ SD_simulate_with_update(-1.0, changed_tasks);
}
XBT_INFO("Simulation Time: %f", SD_get_clock());
XBT_INFO("------------------- Produce the trace file---------------------------");
XBT_INFO("Producing a jedule output (if active) of the run into %s", tracefilename?tracefilename:"minmin_test.jed");
}
XBT_INFO("Simulation Time: %f", SD_get_clock());
XBT_INFO("------------------- Produce the trace file---------------------------");
XBT_INFO("Producing a jedule output (if active) of the run into %s", tracefilename?tracefilename:"minmin_test.jed");
-#if HAVE_JEDULE
+#if
SIMGRID_
HAVE_JEDULE
jedule_sd_dump(tracefilename);
#endif
free(tracefilename);
xbt_dynar_free_container(&ready_tasks);
jedule_sd_dump(tracefilename);
#endif
free(tracefilename);
xbt_dynar_free_container(&ready_tasks);
+ xbt_dynar_free(&changed_tasks);
xbt_dynar_foreach(dax, cursor, task) {
SD_task_destroy(task);
}
xbt_dynar_free_container(&dax);
xbt_dynar_foreach(dax, cursor, task) {
SD_task_destroy(task);
}
xbt_dynar_free_container(&dax);
- for (cursor = 0; cursor < total_nhosts; cursor++)
- sg_host_free_attribute(hosts[cursor]);
+ for (cursor = 0; cursor < total_nhosts; cursor++) {
+ free(sg_host_user(hosts[cursor]));
+ sg_host_user_set(hosts[cursor], NULL);
+ }
- /* exit */
- SD_exit();
+ xbt_free(hosts);
return 0;
}
return 0;
}