Mercurial > hg > Gears > GearsAgda
comparison src/parallel_execution/worker.c @ 232:123b0d277b84
worker interface
author | mir3636 |
---|---|
date | Sun, 22 Jan 2017 19:02:12 +0900 |
parents | a1fb3f2d1a36 |
children | 06133afb3b5b |
comparison
equal
deleted
inserted
replaced
231:24da4f217447 | 232:123b0d277b84 |
---|---|
1 #include <libkern/OSAtomic.h> | 1 #include <libkern/OSAtomic.h> |
2 | 2 |
3 #include "context.h" | 3 #include "context.h" |
4 #include "origin_cs.h" | 4 #include "origin_cs.h" |
5 | 5 |
6 union Data* createWorker(struct Context* context, int id, Queue* queue) { | 6 union Data* createCPUWorker(struct Context* context, int id, Queue* queue, enum Code next) { |
7 struct Worker* worker = &ALLOCATE(context, Worker)->Worker; | 7 struct Worker* worker = &ALLOCATE(context, Worker)->Worker; |
8 worker->tasks = queue; | 8 struct CPUWorker* cpuWorker = &ALLOCATE(context, CPUWorker)->CPUWorker; |
9 worker->id = id; | 9 worker->worker = (union Data*)cpuWorker; |
10 worker->runFlag = 1; | 10 cpuWorker->tasks = queue; |
11 cpuWorker->id = id; | |
12 cpuWorker->runFlag = 1; | |
13 cpuWorker->next = next; | |
11 worker->taskReceive = C_taskReceiveWorker; | 14 worker->taskReceive = C_taskReceiveWorker; |
12 worker->shutdown = C_shutdownWorker; | 15 worker->shutdown = C_shutdownWorker; |
13 return (union Data*)(worker); | 16 return (union Data*)(worker); |
14 } | 17 } |
15 | 18 |
16 __code taskReceiveWorker(struct Context* context, Worker* worker) { | 19 __code taskReceiveWorker(struct Context* context, CPUWorker* worker) { |
17 if (! worker->runFlag) | 20 if (! worker->runFlag) |
18 goto meta(context, worker->next); | 21 goto meta(context, worker->next); |
19 Queue* queue = worker->tasks; | 22 Queue* queue = worker->tasks; |
20 queue->next = C_getTask1; | 23 queue->next = C_getTask1; |
21 goto meta(context, queue->take); | 24 goto meta(context, queue->take); |
22 } | 25 } |
23 | 26 |
24 __code taskReceiveWorker_stub(struct Context* context) { | 27 __code taskReceiveWorker_stub(struct Context* context) { |
25 Worker* worker = Gearef(context,Worker); | 28 CPUWorker* worker = (CPUWorker *)GearImpl(context, Worker, worker); |
26 goto taskReceiveWorker(context,worker); | 29 goto taskReceiveWorker(context,worker); |
27 } | 30 } |
28 | 31 |
29 __code getTask1(struct Context* context, Worker* worker, struct Context* task) { | 32 __code getTask1(struct Context* context, Worker* worker, struct Context* task) { |
30 task->worker = worker; | 33 task->worker = worker; |
31 goto meta(task, task->next); | 34 goto meta(task, task->next); |
32 } | 35 } |
33 | 36 |
34 __code getTask1_stub(struct Context* context) { | 37 __code getTask1_stub(struct Context* context) { |
35 Worker* worker = Gearef(context,Worker); | 38 Worker* worker = Gearef(context,Worker); |
36 Context* task = &worker->tasks->data->context; | 39 CPUWorker* cpuWorker = (CPUWorker *)GearImpl(context, Worker, worker); |
40 Context* task = &cpuWorker->tasks->data->context; | |
37 goto getTask1(context,worker,task); | 41 goto getTask1(context,worker,task); |
38 } | 42 } |
39 | 43 |
40 #ifdef USE_CUDA | 44 #ifdef USE_CUDA |
41 __code twiceGpu(struct Context* context) { | 45 __code twiceGpu(struct Context* context) { |
43 cuLaunchkanel(); | 47 cuLaunchkanel(); |
44 cuMemcpyDtoHAsync(); | 48 cuMemcpyDtoHAsync(); |
45 } | 49 } |
46 #endif | 50 #endif |
47 | 51 |
48 __code shutdownWorker(struct Context* context, Worker* worker) { | 52 __code shutdownWorker(struct Context* context, CPUWorker* worker) { |
49 worker->runFlag = 0; | 53 worker->runFlag = 0; |
50 } | 54 } |
51 | 55 |
52 __code shutdownWorker_stub(struct Context* context) { | 56 __code shutdownWorker_stub(struct Context* context) { |
53 Worker* worker = Gearef(context,Worker); | 57 CPUWorker* worker = (CPUWorker *)GearImpl(context, Worker, worker); |
54 goto shutdownWorker(context,worker); | 58 goto shutdownWorker(context,worker); |
55 } | 59 } |