view src/parallel_execution/CPUWorker.cbc @ 291:87128b876c63

add test
author ikkun
date Thu, 09 Feb 2017 19:02:15 +0900
parents a3448b0f0a56
children f1b0cc555b6e
line wrap: on
line source

#include <libkern/OSAtomic.h>

#include "../context.h"

static void start_worker(Worker* worker);

Worker* createCPUWorker(struct Context* context, int id, Queue* queue) {
    struct Worker* worker = new Worker();
    struct CPUWorker* cpuWorker = new CPUWorker();
    worker->worker = (union Data*)cpuWorker;
    worker->tasks = queue;
    cpuWorker->id = id;
    worker->taskReceive = C_taskReceiveWorker;
    worker->shutdown = C_shutdownWorker;
    pthread_create(&worker->worker->CPUWorker.thread, NULL, (void*)&start_worker, worker);
    return worker;
}

static void start_worker(Worker* worker) {
    CPUWorker* cpuWorker = (CPUWorker*)worker->worker;
    cpuWorker->context = NEW(struct Context);
    initContext(cpuWorker->context);
    Gearef(cpuWorker->context, Worker)->worker = (union Data*)worker;
    goto meta(cpuWorker->context, worker->taskReceive);
}

__code taskReceiveWorker(struct Worker* worker,struct Queue* queue) {
    queue->queue = (union Data*)worker->tasks;
    queue->next = C_getTask;
    goto meta(context, worker->tasks->take);
}

__code taskReceiveWorker_stub(struct Context* context) {
    goto taskReceiveWorker(context, &Gearef(context, Worker)->worker->Worker, Gearef(context, Queue));
}

__code getTask(struct Worker* worker, struct Context* task) {
    if (!task)
        return; // end thread
    task->worker = worker;
    context->next = C_taskReceiveWorker; // set CG after task exec
    goto meta(task, task->next);
}

__code getTask_stub(struct Context* context) {
    Worker* worker = &Gearef(context,Worker)->worker->Worker;
    struct Context* task = &Gearef(context, Queue)->data->Context;
    goto getTask(context, worker, task);
}

#ifdef USE_CUDA
__code twiceGpu() {
    cuMemcpyHtoDAsync(context,context,context,context->stream);
    cuLaunchkanel();
    cuMemcpyDtoHAsync();
}

__code twiceGpu_stub() {
}

#endif

__code shutdownWorker(struct CPUWorker* worker) {
}