diff src/parallel_execution/CPUWorker.cbc @ 288:f1b0cc555b6e

Add odgCommit
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Mon, 06 Feb 2017 04:04:25 +0900
parents a3448b0f0a56
children 3d70e21a3902
line wrap: on
line diff
--- a/src/parallel_execution/CPUWorker.cbc	Mon Feb 06 00:59:39 2017 +0900
+++ b/src/parallel_execution/CPUWorker.cbc	Mon Feb 06 04:04:25 2017 +0900
@@ -38,7 +38,7 @@
     if (!task)
         return; // end thread
     task->worker = worker;
-    context->next = C_taskReceiveWorker; // set CG after task exec
+    task->next = C_odgCommit; // set CG after task exec
     goto meta(task, task->next);
 }
 
@@ -48,6 +48,46 @@
     goto getTask(context, worker, task);
 }
 
+__code odgCommit(struct LoopCounter* loopCounter, struct Queue* queue, struct Context* task) {
+    int i = loopCounter->i ;
+    if(task->odg + i < task->maxOdg) {
+        queue->queue = (union Data*)GET_WAIT_LIST(task->data[task->odg+i]);
+        queue->next = C_odgCommit1;
+        goto meta(context, queue->queue->Queue.take);
+    }
+    loopCounter->i = 0;
+    goto meta(context, C_taskReceiveWorker);
+}
+
+__code odgCommit_stub(struct Context* context) {
+    struct Context* workerContext = context->worker->worker->CPUWorker.context;
+    goto odgCommit(workerContext,
+                   Gearef(workerContext, LoopCounter),
+                   Gearef(workerContext, Queue),
+                   context);
+}
+
+__code odgCommit1(struct TaskManager* taskManager, struct Context* task) {
+    if(__sync_fetch_and_sub(&task->idgCount, 1)) {
+        if(task->idgCount == 0) {
+            taskManager->taskManager = (union Data*)task->taskManager;
+            taskManager->context = task;
+            taskManager->next = C_odgCommit;
+            goto meta(context, task->taskManager->spawn);
+        }
+    } else {
+        goto meta(context, C_odgCommit1);
+    }
+}
+
+__code odgCommit1_stub(struct Context* context) {
+    struct Context* task = &Gearef(context, Queue)->data->Context;
+    goto odgCommit1(context,
+                    Gearef(context, TaskManager),
+                    task);
+                 
+}
+
 #ifdef USE_CUDA
 __code twiceGpu() {
     cuMemcpyHtoDAsync(context,context,context,context->stream);
@@ -62,4 +102,3 @@
 
 __code shutdownWorker(struct CPUWorker* worker) {
 }
-