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 }