source: trunk/softs/test_llsc/scripts/LLSCTestGenerator/Program.hpp@ 778

Last change on this file since 778 was 571, checked in by meunier, 13 years ago

Correction of the "double barrier" problem from the user point of view for the generated llsc tests (use of 2 distinct barriers)

File size: 7.9 KB
Line 
1
2#ifndef _program_hpp_
3#define _program_hpp_
4
5#include <iostream>
6#include <sstream>
7#include <stdbool.h>
8
9#include "config.h"
10#include "TestThread.hpp"
11
12
13using namespace std;
14
15class Program {
16
17 int nb_threads;
18 int nb_max_incr;
19 int nb_locks;
20 int nb_vars;
21 int line_size;
22 bool lock_in_line, vars_in_line;
23 int tab_size;
24 TestThread ** threads;
25
26 public:
27
28 Program(int nb_procs, int nb_locks, int nb_max_accesses, int line_size, bool lock_in_line, bool vars_in_line){
29 this->nb_threads = nb_procs;
30 this->nb_max_incr = nb_max_accesses;
31 this->nb_locks = nb_locks;
32 this->nb_vars = nb_locks;
33 this->line_size = line_size;
34 this->lock_in_line = lock_in_line;
35 this->vars_in_line = vars_in_line;
36 this->tab_size = (lock_in_line ? ceil((float) nb_locks / line_size) * line_size : nb_locks * line_size) + (vars_in_line ? ceil((float) nb_vars / line_size) * line_size : nb_vars * line_size);
37 this->threads = new TestThread * [nb_threads];
38
39 for (int i = 0; i < nb_threads; i++){
40 threads[i] = new TestThread(nb_locks, nb_max_accesses, line_size, lock_in_line, vars_in_line, i);
41 }
42 }
43
44 ~Program(){
45 for (int i = 0; i < nb_threads; i++){
46 delete threads[i];
47 }
48 delete [] threads;
49 }
50
51
52 string write_main_task() {
53 stringstream res;
54 res << "#include \"srl.h\"" << endl;
55 res << "#include \"stdio.h\"" << endl;
56 res << "#include \"test_llsc_main_proto.h\"" << endl;
57 res << "#include \"functions.h\"" << endl;
58 res << endl;
59 res << "/*" << endl;
60 res << " * Test generated for a dsx_vm compilation" << endl;
61 res << " * NB_LOCKS : " << nb_locks << endl;
62 res << " * NB_VARS : " << nb_vars << endl;
63 if (lock_in_line) {
64 res << " * LOCKS PLACEMENT : horizontal" << endl;
65 }
66 else {
67 res << " * LOCKS PLACEMENT : vertical" << endl;
68 }
69 if (vars_in_line) {
70 res << " * VARS PLACEMENT : horizontal" << endl;
71 }
72 else {
73 res << " * VARS PLACEMENT : vertical" << endl;
74 }
75 res << " * NB_MAX_INCRS : " << nb_max_incr << endl;
76 res << " * LINE_SIZE : " << LINE_SIZE << endl;
77 res << " */" << endl;
78 res << endl;
79 res << "int * tab;" << endl;
80 res << endl;
81 res << threads[0]->write_task();
82 res << endl;
83 res << endl;
84 res << "FUNC(test_llsc_main_func) {" << endl;
85 res << endl;
86 res << " int i;" << endl;
87 res << endl;
88 res << " srl_memspace_t memspace = SRL_GET_MEMSPACE(table);" << endl;
89 res << " tab = (int *) SRL_MEMSPACE_ADDR(memspace);" << endl;
90 res << " srl_barrier_t barrier = SRL_GET_BARRIER(barrier);" << endl;
91 res << " srl_barrier_t barrier2 = SRL_GET_BARRIER(barrier2);" << endl;
92 res << endl;
93 res << " // Initialisation du tableau" << endl;
94 res << " for (i = 0; i < " << tab_size << "; i++) {" << endl;
95 res << " tab[i] = 0;" << endl;
96 res << " }" << endl;
97 res << endl;
98 res << " barrier_wait(barrier);" << endl;
99 res << endl;
100 res << " run0();" << endl;
101 res << endl;
102 res << " barrier_wait(barrier2);" << endl;
103 res << endl;
104 res << " for (i = 0; i < " << tab_size << "; i++) {" << endl;
105 res << " if (tab[i] != 0) {" << endl;
106 res << " giet_tty_printf(\"tab[%d] final : %d\\n\", i, tab[i]);" << endl;
107 res << " }" << endl;
108 res << " }" << endl;
109 res << endl;
110 res << " giet_raise_sigint();" << endl;
111 res << endl;
112 res << " srl_exit();" << endl;
113 res << "}" << endl;
114 res << endl;
115
116 return res.str();
117 }
118
119
120 string write_task_no_tty() {
121 stringstream res;
122 res << "#include \"srl.h\"" << endl;
123 res << "#include \"stdio.h\"" << endl;
124 res << "#include \"test_llsc_no_tty_proto.h\"" << endl;
125 res << "#include \"functions.h\"" << endl;
126 res << endl;
127 res << "/*" << endl;
128 res << " * Test generated for a dsx_vm compilation" << endl;
129 res << " * NB_LOCKS : " << nb_locks << endl;
130 res << " * NB_VARS : " << nb_vars << endl;
131 if (lock_in_line) {
132 res << " * LOCKS PLACEMENT : horizontal" << endl;
133 }
134 else {
135 res << " * LOCKS PLACEMENT : vertical" << endl;
136 }
137 if (vars_in_line) {
138 res << " * VARS PLACEMENT : horizontal" << endl;
139 }
140 else {
141 res << " * VARS PLACEMENT : vertical" << endl;
142 }
143 res << " * NB_MAX_INCRS : " << nb_max_incr << endl;
144 res << " * LINE_SIZE : " << LINE_SIZE << endl;
145 res << " */" << endl;
146 res << endl;
147 res << "int * tab;" << endl;
148 res << endl;
149
150 for (int i = 1; i < nb_threads; i++) {
151 res << threads[i]->write_task();
152 }
153
154 res << endl;
155 res << endl;
156 res << "FUNC(test_llsc_no_tty_func) {" << endl;
157 res << endl;
158 res << " srl_memspace_t memspace = SRL_GET_MEMSPACE(table);" << endl;
159 res << " tab = (int *) SRL_MEMSPACE_ADDR(memspace);" << endl;
160 res << " srl_barrier_t barrier = SRL_GET_BARRIER(barrier);" << endl;
161 res << " srl_barrier_t barrier2 = SRL_GET_BARRIER(barrier2);" << endl;
162 res << " int thread_id = SRL_GET_CONST(id);" << endl;
163 res << endl;
164 res << " barrier_wait(barrier);" << endl;
165 res << endl;
166 res << " if (thread_id == 1) {" << endl;
167 res << " run1();" << endl;
168 res << " }" << endl;
169 for (int i = 2; i < nb_threads; i++) {
170 res << " else if (thread_id == " << i << ") {" << endl;
171 res << " run" << i << "();" << endl;
172 res << " }" << endl;
173 }
174 res << " else {" << endl;
175 res << " srl_assert(0);" << endl;
176 res << " }" << endl;
177 res << endl;
178 res << " barrier_wait(barrier2);" << endl;
179 res << endl;
180 res << " srl_exit();" << endl;
181 res << endl;
182 res << "}" << endl;
183 res << endl;
184
185 return res.str();
186 }
187
188
189 string write_output() {
190 cout << tab_size;
191 stringstream res;
192 res << endl;
193 res << "#include <stdio.h>" << endl;
194 res << "#include <assert.h>" << endl;
195 res << endl;
196 res << "/*" << endl;
197 res << " * Test generated for a posix execution" << endl;
198 res << " * NB_LOCKS : " << nb_locks << endl;
199 res << " * NB_VARS : " << nb_vars << endl;
200 if (lock_in_line) {
201 res << " * LOCKS PLACEMENT : horizontal" << endl;
202 }
203 else {
204 res << " * LOCKS PLACEMENT : vertical" << endl;
205 }
206 if (vars_in_line) {
207 res << " * VARS PLACEMENT : horizontal" << endl;
208 }
209 else {
210 res << " * VARS PLACEMENT : vertical" << endl;
211 }
212 res << " * NB_MAX_INCRS : " << nb_max_incr << endl;
213 res << " * LINE_SIZE : " << LINE_SIZE << endl;
214 res << " */" << endl;
215 res << endl;
216 res << "volatile int tab[" << tab_size << "];" << endl;
217 res << endl;
218 res << endl;
219
220
221 for (int i = 0; i < nb_threads; i++) {
222 res << threads[i]->write_output();
223 }
224
225 res << "int main() {" << endl;
226 res << endl;
227 res << " int i;" << endl;
228 res << endl;
229 res << " /* Version native séquentielle */" << endl;
230 res << endl;
231 res << " // Initialisation du tableau" << endl;
232 res << " for (i = 0; i < " << tab_size << "; i++) {" << endl;
233 res << " tab[i] = 0;" << endl;
234 res << " }" << endl;
235 res << endl;
236 res << " run0();" << endl;
237 for (int i = 1; i < nb_threads; i++){
238 res << " run" << i << "();" << endl;
239 }
240 res << endl;
241 res << " for (i = 0; i < " << tab_size << "; i++) {" << endl;
242 res << " if (tab[i] != 0) {" << endl;
243 res << " printf(\"tab[%d] final : %d\\n\", i, tab[i]);" << endl;
244 res << " }" << endl;
245 res << " }" << endl;
246 res << endl;
247 res << " return 0;" << endl;
248 res << "}" << endl;
249 res << endl;
250
251 return res.str();
252 }
253
254};
255
256#endif
257
258
259
260
261
Note: See TracBrowser for help on using the repository browser.