aboutsummaryrefslogtreecommitdiffstats
path: root/native
diff options
context:
space:
mode:
authorJeremy Erickson <jerickso@cs.unc.edu>2013-01-02 21:58:07 -0500
committerBjoern Brandenburg <bbb@mpi-sws.org>2013-02-04 10:41:25 -0500
commit3472c8ececbee3198d680ec711b733472d6606f8 (patch)
tree77c4cbbba2b48e22af12fa13a67a02d4c649be2c /native
parent4cdaafacd7da23c7c86b524ac26a55f54ad861e7 (diff)
Improvements to the GEL Piecewise Linear module: support for arbitrary GEL schedulers in native code and easy max lateness computation.
Diffstat (limited to 'native')
-rw-r--r--native/include/edf/gel_pl.h7
-rw-r--r--native/include/tasks.h12
-rw-r--r--native/src/edf/gel_pl.cpp25
-rw-r--r--native/src/tasks.cpp9
4 files changed, 27 insertions, 26 deletions
diff --git a/native/include/edf/gel_pl.h b/native/include/edf/gel_pl.h
index d70138a..9902e37 100644
--- a/native/include/edf/gel_pl.h
+++ b/native/include/edf/gel_pl.h
@@ -59,13 +59,8 @@ class GELPl
59 }; 59 };
60 60
61 public: 61 public:
62 enum Scheduler {
63 GEDF,
64 GFL
65 };
66 62
67 GELPl(Scheduler sched, 63 GELPl(unsigned int num_processors,
68 unsigned int num_processors,
69 const TaskSet& tasks, 64 const TaskSet& tasks,
70 unsigned int rounds); 65 unsigned int rounds);
71 66
diff --git a/native/include/tasks.h b/native/include/tasks.h
index 0aafa98..092e21a 100644
--- a/native/include/tasks.h
+++ b/native/include/tasks.h
@@ -18,20 +18,23 @@ class Task
18 unsigned long period; 18 unsigned long period;
19 unsigned long wcet; 19 unsigned long wcet;
20 unsigned long deadline; 20 unsigned long deadline;
21 unsigned long prio_pt;
21 22
22 public: 23 public:
23 24
24 /* construction and initialization */ 25 /* construction and initialization */
25 void init(unsigned long wcet, unsigned long period, unsigned long deadline = 0); 26 void init(unsigned long wcet, unsigned long period, unsigned long deadline = 0, unsigned long prio_pt = 0);
26 Task(unsigned long wcet = 0, 27 Task(unsigned long wcet = 0,
27 unsigned long period = 0, 28 unsigned long period = 0,
28 unsigned long deadline = 0) { init(wcet, period, deadline); } 29 unsigned long deadline = 0,
30 unsigned long prio_pt = 0) { init(wcet, period, deadline, prio_pt); }
29 31
30 /* getter / setter */ 32 /* getter / setter */
31 unsigned long get_period() const { return period; } 33 unsigned long get_period() const { return period; }
32 unsigned long get_wcet() const { return wcet; } 34 unsigned long get_wcet() const { return wcet; }
33 /* defaults to implicit deadline */ 35 /* defaults to implicit deadline */
34 unsigned long get_deadline() const {return deadline; } 36 unsigned long get_deadline() const {return deadline; }
37 unsigned long get_prio_pt() const { return prio_pt; }
35 38
36 void set_period(unsigned long period) { this->period = period; } 39 void set_period(unsigned long period) { this->period = period; }
37 void set_wcet(unsigned long wcet) { this->wcet = wcet; } 40 void set_wcet(unsigned long wcet) { this->wcet = wcet; }
@@ -156,9 +159,10 @@ class TaskSet
156 TaskSet(const TaskSet &original); 159 TaskSet(const TaskSet &original);
157 virtual ~TaskSet(); 160 virtual ~TaskSet();
158 161
159 void add_task(unsigned long wcet, unsigned long period, unsigned long deadline = 0) 162 void add_task(unsigned long wcet, unsigned long period,
163 unsigned long deadline = 0, unsigned long prio_pt = 0)
160 { 164 {
161 tasks.push_back(Task(wcet, period, deadline)); 165 tasks.push_back(Task(wcet, period, deadline, prio_pt));
162 } 166 }
163 167
164 unsigned int get_task_count() const { return tasks.size(); } 168 unsigned int get_task_count() const { return tasks.size(); }
diff --git a/native/src/edf/gel_pl.cpp b/native/src/edf/gel_pl.cpp
index 89d0177..b058ab1 100644
--- a/native/src/edf/gel_pl.cpp
+++ b/native/src/edf/gel_pl.cpp
@@ -13,7 +13,7 @@ static bool reversed_order(const fractional_t& first,
13 return second < first; 13 return second < first;
14} 14}
15 15
16GELPl::GELPl(Scheduler sched, unsigned int num_processors, const TaskSet& ts, 16GELPl::GELPl(unsigned int num_processors, const TaskSet& ts,
17 unsigned int num_rounds) 17 unsigned int num_rounds)
18:no_cpus(num_processors), tasks(ts), rounds(num_rounds) 18:no_cpus(num_processors), tasks(ts), rounds(num_rounds)
19{ 19{
@@ -25,13 +25,13 @@ GELPl::GELPl(Scheduler sched, unsigned int num_processors, const TaskSet& ts,
25 sys_utilization.get_num().get_mpz_t(), 25 sys_utilization.get_num().get_mpz_t(),
26 sys_utilization.get_den().get_mpz_t()); 26 sys_utilization.get_den().get_mpz_t());
27 util_ceil = util_ceil_pre.get_ui(); 27 util_ceil = util_ceil_pre.get_ui();
28 std::vector<unsigned long> pps; 28 std::vector<unsigned long> prio_pts;
29 fractional_t S = 0; 29 fractional_t S = 0;
30 std::vector<fractional_t> Y_ints; 30 std::vector<fractional_t> Y_ints;
31 31
32 int task_count = tasks.get_task_count(); 32 int task_count = tasks.get_task_count();
33 // Reserve capacity in all vectors to minimize allocation costs. 33 // Reserve capacity in all vectors to minimize allocation costs.
34 pps.reserve(task_count); 34 prio_pts.reserve(task_count);
35 Y_ints.reserve(task_count); 35 Y_ints.reserve(task_count);
36 S_i.reserve(task_count); 36 S_i.reserve(task_count);
37 G_i.reserve(task_count); 37 G_i.reserve(task_count);
@@ -43,29 +43,26 @@ GELPl::GELPl(Scheduler sched, unsigned int num_processors, const TaskSet& ts,
43 utilizations[i] /= tasks[i].get_period(); 43 utilizations[i] /= tasks[i].get_period();
44 } 44 }
45 45
46 unsigned long min_pp = std::numeric_limits<unsigned long>::max(); 46 unsigned long min_prio_pt = std::numeric_limits<unsigned long>::max();
47 47
48 // Compute initial priority points, including minimum. 48 // Compute initial priority points, including minimum.
49 for (int i = 0; i < task_count; i++) { 49 for (int i = 0; i < task_count; i++) {
50 const Task& task = tasks[i]; 50 const Task& task = tasks[i];
51 unsigned long new_pp = task.get_deadline(); 51 unsigned long new_prio_pt = task.get_prio_pt();
52 if (sched == GFL) { 52 prio_pts.push_back(new_prio_pt);
53 new_pp -= ((num_processors - 1) * task.get_wcet()) / num_processors; 53 if (new_prio_pt < min_prio_pt) {
54 } 54 min_prio_pt = new_prio_pt;
55 pps.push_back(new_pp);
56 if (new_pp < min_pp) {
57 min_pp = new_pp;
58 } 55 }
59 } 56 }
60 57
61 // Reduce to compute minimum. Also compute Y intercepts, S_i values, and 58 // Reduce to compute minimum. Also compute Y intercepts, S_i values, and
62 // S. 59 // S.
63 for (int i = 0; i < task_count; i++) { 60 for (int i = 0; i < task_count; i++) {
64 pps[i] -= min_pp; 61 prio_pts[i] -= min_prio_pt;
65 const Task& task = tasks[i]; 62 const Task& task = tasks[i];
66 unsigned long wcet = task.get_wcet(); 63 unsigned long wcet = task.get_wcet();
67 unsigned long period = task.get_period(); 64 unsigned long period = task.get_period();
68 S_i.push_back(pps[i]); 65 S_i.push_back(prio_pts[i]);
69 fractional_t& S_i_i = S_i[i]; 66 fractional_t& S_i_i = S_i[i];
70 S_i_i *= -1; 67 S_i_i *= -1;
71 S_i_i /= period; 68 S_i_i /= period;
@@ -102,7 +99,7 @@ GELPl::GELPl(Scheduler sched, unsigned int num_processors, const TaskSet& ts,
102 mpz_cdiv_q(xi_ceil.get_mpz_t(), 99 mpz_cdiv_q(xi_ceil.get_mpz_t(),
103 x_i.get_num().get_mpz_t(), 100 x_i.get_num().get_mpz_t(),
104 x_i.get_den().get_mpz_t()); 101 x_i.get_den().get_mpz_t());
105 bounds.push_back(pps[i] 102 bounds.push_back(prio_pts[i]
106 + tasks[i].get_wcet() 103 + tasks[i].get_wcet()
107 + xi_ceil.get_ui()); 104 + xi_ceil.get_ui());
108 G_i.push_back(s); 105 G_i.push_back(s);
diff --git a/native/src/tasks.cpp b/native/src/tasks.cpp
index 0d0624c..409c6d6 100644
--- a/native/src/tasks.cpp
+++ b/native/src/tasks.cpp
@@ -9,8 +9,9 @@
9#include "task_io.h" 9#include "task_io.h"
10 10
11void Task::init(unsigned long wcet, 11void Task::init(unsigned long wcet,
12 unsigned long period, 12 unsigned long period,
13 unsigned long deadline) 13 unsigned long deadline,
14 unsigned long prio_pt)
14{ 15{
15 this->wcet = wcet; 16 this->wcet = wcet;
16 this->period = period; 17 this->period = period;
@@ -18,6 +19,10 @@ void Task::init(unsigned long wcet,
18 this->deadline = period; // implicit 19 this->deadline = period; // implicit
19 else 20 else
20 this->deadline = deadline; 21 this->deadline = deadline;
22 if (!prio_pt)
23 this->prio_pt = deadline;
24 else
25 this->prio_pt = prio_pt;
21} 26}
22 27
23bool Task::has_implicit_deadline() const 28bool Task::has_implicit_deadline() const