Mercurial > hg > Gears > GearsAgda
comparison src/parallel_execution/main.c @ 247:ce262b2c1daf
Fix createTask for main
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 25 Jan 2017 04:14:50 +0900 |
parents | 421ea91dd76c |
children | 1ede5390cda2 |
comparison
equal
deleted
inserted
replaced
246:421ea91dd76c | 247:ce262b2c1daf |
---|---|
4 | 4 |
5 #include "context.h" | 5 #include "context.h" |
6 #include "origin_cs.h" | 6 #include "origin_cs.h" |
7 | 7 |
8 extern union Data* createRedBlackTree(struct Context* context); | 8 extern union Data* createRedBlackTree(struct Context* context); |
9 extern union Data* createTaskManager(struct Context* context); | 9 extern union Data* createTaskManager(struct Context* context, int numCPU, int numGPU, int numIO); |
10 extern void allocator(struct Context* context); | 10 extern void allocator(struct Context* context); |
11 | 11 |
12 int cpu_num = 1; | 12 int cpu_num = 1; |
13 int length = 102400; | 13 int length = 102400; |
14 int split = 8; | 14 int split = 8; |
30 } | 30 } |
31 | 31 |
32 __code initDataGears(struct Context* context, struct LoopCounter* loopCounter, struct TaskManager* taskManager) { | 32 __code initDataGears(struct Context* context, struct LoopCounter* loopCounter, struct TaskManager* taskManager) { |
33 loopCounter->tree = &createRedBlackTree(context)->Tree; | 33 loopCounter->tree = &createRedBlackTree(context)->Tree; |
34 loopCounter->i = 0; | 34 loopCounter->i = 0; |
35 taskManager->taskManager = (union Data*)&createTaskManager(context)->TaskManager; | 35 taskManager->taskManager = (union Data*)&createTaskManager(context, cpu_num, 0, 0)->TaskManager; |
36 goto meta(context, C_createData1); | 36 goto meta(context, C_createData1); |
37 } | 37 } |
38 | 38 |
39 __code initDataGears_stub(struct Context* context) { | 39 __code initDataGears_stub(struct Context* context) { |
40 goto initDataGears(context, Gearef(context, LoopCounter), Gearef(context, TaskManager)); | 40 goto initDataGears(context, Gearef(context, LoopCounter), Gearef(context, TaskManager)); |
118 array, | 118 array, |
119 Gearef(context, Node), | 119 Gearef(context, Node), |
120 Gearef(context, Tree)); | 120 Gearef(context, Tree)); |
121 } | 121 } |
122 | 122 |
123 __code createTask1(struct Context* context, struct LoopCounter* loopCounter, struct TaskManager* taskManager, struct Task* task) { | 123 __code createTask1(struct Context* context, struct LoopCounter* loopCounter, struct TaskManager* taskManager) { |
124 task->code = C_twice; | 124 int i = loopCounter->i; |
125 task->idsCount = 0; | 125 |
126 | 126 if ((length/split*i) < length) { |
127 // taskManager->task = task; | 127 taskManager->next = C_createTask2; |
128 taskManager->next = C_createData1; | 128 goto meta(context, taskManager->taskManager->TaskManager.createTask); |
129 loopCounter->i++; | 129 } |
130 | 130 |
131 goto meta(context, taskManager->taskManager->TaskManager.spawn); | 131 loopCounter->i = 0; |
132 goto meta(context, C_code1); | |
132 } | 133 } |
133 | 134 |
134 __code createTask1_stub(struct Context* context) { | 135 __code createTask1_stub(struct Context* context) { |
135 Task* task = &ALLOCATE(context, Task)->Task; | |
136 goto createTask1(context, | 136 goto createTask1(context, |
137 Gearef(context, LoopCounter), | 137 Gearef(context, LoopCounter), |
138 Gearef(context, TaskManager)); | |
139 } | |
140 | |
141 __code createTask2(Context* context, LoopCounter* loopCounter, TaskManager* taskManager, Context* task, Array* array) { | |
142 int i = loopCounter->i; | |
143 | |
144 if ((length/split*i) < length) { | |
145 array->index = i; | |
146 array->prefix = length/split; | |
147 array->array = array_ptr; | |
148 task->idgCount = 0; | |
149 task->next = C_twice; | |
150 // task->data[task->idg] = (union Data*)array; | |
151 taskManager->next = C_createTask1; | |
152 loopCounter->i++; | |
153 | |
154 goto meta(context, taskManager->taskManager->TaskManager.spawn); | |
155 } | |
156 | |
157 loopCounter->i = 0; | |
158 goto meta(context, C_code1); | |
159 } | |
160 | |
161 __code createTask2_stub(struct Context* context) { | |
162 Array* array = &ALLOCATE(context, Array)->Array; | |
163 goto createTask2(context, | |
164 Gearef(context, LoopCounter), | |
138 Gearef(context, TaskManager), | 165 Gearef(context, TaskManager), |
139 task); | 166 Gearef(context, TaskManager)->context, |
167 array); | |
140 } | 168 } |
141 | 169 |
142 __code taskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { | 170 __code taskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { |
143 loopCounter->i = 0; | 171 loopCounter->i = 0; |
144 | 172 |
173 | 201 |
174 struct Context* main_context = NEW(struct Context); | 202 struct Context* main_context = NEW(struct Context); |
175 initContext(main_context); | 203 initContext(main_context); |
176 main_context->next = C_initDataGears; | 204 main_context->next = C_initDataGears; |
177 | 205 |
178 struct Context* worker_contexts = NEWN(cpu_num, struct Context); | |
179 | |
180 for (int i = 0;i<cpu_num;i++) | |
181 initContext(&worker_contexts[i]); | |
182 | |
183 goto start_code(main_context); | 206 goto start_code(main_context); |
184 } | 207 } |
185 | 208 |