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