Mercurial > hg > Gears > GearsAgda
annotate src/parallel_execution/taskManager.c @ 236:865179a0a56d
fix taskManager
author | ikkun |
---|---|
date | Mon, 23 Jan 2017 20:00:46 +0900 |
parents | 05e61405cc88 |
children | 6f6cc49213c5 |
rev | line source |
---|---|
178 | 1 #include "context.h" |
2 #include "stack.h" | |
182 | 3 #include "queue.h" |
178 | 4 #include "origin_cs.h" |
5 #include <stdio.h> | |
6 | |
233 | 7 union Data* createTaskManager(struct Context* context, int numCPU, int numGPU, int numIO) { |
209 | 8 struct TaskManager* taskManager = &ALLOCATE(context, TaskManager)->TaskManager; |
9 struct TaskManagerImpl* taskManagerImpl = &ALLOCATE(context, TaskManagerImpl)->TaskManagerImpl; | |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
10 taskManager->taskManager = (union Data*)taskManagerImpl; |
233 | 11 taskManagerImpl -> activeQueue = &createSingleLinkedQueue(context)->Queue; |
12 taskManagerImpl -> taskQueue = &createSingleLinkedQueue(context)->Queue; | |
13 // 0...numIO-1 IOProcessor | |
14 // numIO...numIO+numGPU-1 GPUProcessor | |
15 // numIO+numGPU...numIO+numGPU+numCPU-1 CPUProcessor | |
16 taskManager->io = 0; | |
17 taskManager->gpu = numIO; | |
235 | 18 taskManager->cpu = numIO+numGPU; |
236 | 19 taskManager->maxCPU = numIO+numGPU+numCPU; |
234 | 20 taskManager->createTask = C_createTask; |
178 | 21 taskManager->spawn = C_spawnTaskManager; |
22 taskManager->shutdown = C_shutdownTaskManager; | |
236 | 23 createWorkers(taskManager); |
178 | 24 return (union Data*)(taskManager); |
25 } | |
26 | |
236 | 27 void createWorker(Context* context, TaskManeger * taskManeger) { |
28 int i = 0; | |
29 TaskManagerImpl *taskManagerImpl = GearImpl(context,TaskManagerImpl,taskManager); | |
30 taskManagerImpl->workers = ALLOC_ARRAY(context,Worker,taskManager->maxCPU); | |
31 for (;i>taskManeger->gpu;i++) { | |
32 Queue* queue = &createSynchronizedQueue(context)->Queue; | |
33 taskManagerImpl->workers[i] = (Worker*)createCPUWorker (context,i,queue); | |
34 } | |
35 for (;i>taskManeger->cpu;i++) { | |
36 #ifdef USE_CUDA | |
37 #else | |
38 Queue* queue = &createSynchronizedQueue(context)->Queue; | |
39 taskManagerImpl->workers[i] = (Worker*)createCPUWorker (context,i,queue); | |
40 #endif | |
41 } | |
42 for (;i>taskManeger->maxCPU;i++) { | |
43 Queue* queue = &createSynchronizedQueue(context)->Queue; | |
44 taskManagerImpl->workers[i] = (Worker*)createCPUWorker (context,i,queue); | |
45 } | |
46 } | |
47 | |
48 __code createTask(struct Context* context, TaskManeger* taskManager, enum Code next) { | |
49 taskManager->context = NEW(struct Context); | |
50 initContext(taskManager->context); | |
51 goto meta(context, next); | |
52 } | |
53 | |
54 __code createTask_stub(struct Context* context) { | |
55 goto createTask(context,Gearef(context,TaskManager),Gearef(context,TaskManager)->next); | |
56 } | |
57 | |
58 __code spawnTaskManager(struct Context* context, struct TaskManagerImpl* taskManager, struct Queue* queue, struct Context* task, enum Code next) { | |
59 if (task->idgCount == 0) { | |
178 | 60 // enqueue activeQueue |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
61 queue->queue = (union Data*)taskManager->activeQueue; |
178 | 62 } else { |
63 // enqueue waitQueue | |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
64 queue->queue = (union Data*)taskManager->taskQueue; |
178 | 65 } |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
66 queue->data = (union Data*)task; |
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
67 queue->next = next; |
236 | 68 pthread_mutex_unlock(taskManagerImpl->mutex); |
209 | 69 goto meta(context, queue->queue->Queue.put); |
178 | 70 } |
71 | |
72 __code spawnTaskManager_stub(struct Context* context) { | |
236 | 73 pthread_mutex_lock(taskManager->mutex); |
209 | 74 goto spawnTaskManager(context, |
236 | 75 GearImpl(context, TaskManagerImpl, taskManager), |
76 Gearef(context, Queue), | |
77 Gearef(context, TaskManager)->context, | |
78 Gearef(context, TaskManager)->next | |
218
d8a59b727f65
Fix spawnTaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
209
diff
changeset
|
79 ); |
178 | 80 } |
81 | |
222
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
221
diff
changeset
|
82 __code taskSend(struct Context* context) { |
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
221
diff
changeset
|
83 if(loopCounter->i < taskManager->numWorker) { |
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
221
diff
changeset
|
84 taskManager->workers[i]->taskSend; |
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
221
diff
changeset
|
85 loopCounter->i++; |
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
221
diff
changeset
|
86 goto meta(context, C_taskSend); |
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
221
diff
changeset
|
87 } |
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
221
diff
changeset
|
88 goto meta(context, TaskManager->next); |
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
221
diff
changeset
|
89 } |
231 | 90 |
230 | 91 __code createWorker1(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) { |
92 int i = loopCounter->i; | |
93 | |
94 if (i < worker->id) { | |
95 struct Context* worker_context = &worker->contexts[i]; | |
96 worker_context->next = C_getTask1; | |
97 worker_context->data[D_Tree] = context->data[D_Tree]; | |
98 // worker_context->data[D_ActiveQueue] = context->data[D_ActiveQueue]; | |
99 pthread_create(&worker_context->thread, NULL, (void*)&start_code, worker_context); | |
100 worker_context->thread_num = i; | |
101 loopCounter->i++; | |
102 | |
103 goto meta(context, C_createWorker1); | |
104 } | |
105 | |
106 loopCounter->i = 0; | |
107 goto meta(context, C_taskManager); | |
108 } | |
222
77faa28128b4
Add taskSend for TaskManager
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
221
diff
changeset
|
109 |
231 | 110 __code createWorker1_stub(struct Context* context) { |
111 goto createWorker1(context, &context->data[D_LoopCounter]->LoopCounter, &context->data[D_Worker]->Worker); | |
112 } | |
113 | |
223 | 114 __code shutdownTaskManager(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker, struct TaskManager* taskManager) { |
178 | 115 int i = loopCounter->i; |
116 | |
209 | 117 if (i < worker->id) { |
178 | 118 pthread_join(worker->contexts[i].thread, NULL); |
119 loopCounter->i++; | |
120 | |
231 | 121 goto meta(context, C_shutdownTaskManager); |
178 | 122 } |
123 | |
124 loopCounter->i = 0; | |
223 | 125 goto meta(context, taskManager->next); |
178 | 126 } |
127 | |
182 | 128 __code shutdownTaskManager_stub(struct Context* context) { |
223 | 129 goto shutdownTaskManager(context, &context->data[D_LoopCounter]->LoopCounter, &context->data[D_Worker]->Worker, Gearef(context, TaskManager)); |
178 | 130 } |