changeset 109:059b26a250cc

Change put_queue process
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Mon, 02 May 2016 20:02:09 +0900
parents 67f68f9c04b6
children fbcdbe8db53c
files src/parallel_execution/context.c src/parallel_execution/context.h src/parallel_execution/main.c src/parallel_execution/twice.c src/parallel_execution/worker.c
diffstat 5 files changed, 42 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/context.c	Mon Apr 11 01:45:22 2016 +0900
+++ b/src/parallel_execution/context.c	Mon May 02 20:02:09 2016 +0900
@@ -153,7 +153,12 @@
     activeQueue->last = 0;
     activeQueue->count = 0;
 
-    context->dataNum = ActiveQueue;
+    struct Queue* waitQueue = ALLOC_DATA_TYPE(context, WaitQueue, Queue);
+    waitQueue->first = 0;
+    waitQueue->last = 0;
+    waitQueue->count = 0;
+
+    context->dataNum = Queue;
     
     context->node_stack = stack_init(sizeof(struct Node*), 100);
     context->code_stack = stack_init(sizeof(enum Code), 100);
--- a/src/parallel_execution/context.h	Mon Apr 11 01:45:22 2016 +0900
+++ b/src/parallel_execution/context.h	Mon May 02 20:02:09 2016 +0900
@@ -87,6 +87,8 @@
     Time,
     Element,
     ActiveQueue,
+    WaitQueue,
+    Queue,
 };
 
 struct Context {
@@ -128,8 +130,8 @@
     struct Task {
         enum Code code;
         int key;
-        struct Queue* wait_me;
-        struct Queue* wait_i;
+        struct Queue* waitMe;
+        struct Queue* waitI;
     } task;
     struct Queue {
         struct Element* first;
--- a/src/parallel_execution/main.c	Mon Apr 11 01:45:22 2016 +0900
+++ b/src/parallel_execution/main.c	Mon May 02 20:02:09 2016 +0900
@@ -119,25 +119,31 @@
     goto createTask1(context, &context->data[Allocate]->allocate);
 }
 
-__code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element) {
+__code meta_createTask2(struct Context* context, struct Queue* activeQueue, enum Code next) {
+    context->data[Queue] = (union Data *)activeQueue;
+    goto (context->code[next])(context);
+}
+
+__code createTask2(struct Context* context, struct LoopCounter* loopCounter, struct Task* task, struct Element* element, struct Queue* activeQueue) {
     int i = loopCounter->i;
-    
+
     task->code = Twice;
     task->key = i;
-    
+
     element->task = task;
 
     context->next = CreateData1;
     loopCounter->i++;
-    
-    goto meta(context, PutQueue1);
+
+    goto meta_createTask2(context, activeQueue, PutQueue1);
 }
 
 __code createTask2_stub(struct Context* context) {
     goto createTask2(context,
-                     &context->data[LoopCounter]->loopCounter,
-                     &context->data[context->dataNum]->task,
-                     &context->data[Element]->element);
+            &context->data[LoopCounter]->loopCounter,
+            &context->data[context->dataNum]->task,
+            &context->data[Element]->element,
+            &context->data[ActiveQueue]->queue);
 }
 
 __code putQueue1(struct Context* context, struct Allocate* allocate) {
@@ -162,9 +168,9 @@
 
 __code putQueue2_stub(struct Context* context) {
     goto putQueue2(context,
-                   &context->data[context->dataNum]->element,
-                   &context->data[Element]->element,
-                   &context->data[ActiveQueue]->queue);
+            &context->data[context->dataNum]->element,
+            &context->data[Element]->element,
+            &context->data[Queue]->queue);
 }
 
 __code putQueue3(struct Context* context, struct Queue* queue, struct Element* new_element) {
@@ -173,7 +179,7 @@
     if (__sync_bool_compare_and_swap(&queue->last, last, new_element)) {
         last->next = new_element;
         queue->count++;
-        
+
         goto meta(context, context->next);
     } else {
         goto meta(context, PutQueue3);
@@ -181,14 +187,14 @@
 }
 
 __code putQueue3_stub(struct Context* context) {
-    goto putQueue3(context, &context->data[ActiveQueue]->queue, &context->data[context->dataNum]->element);
+    goto putQueue3(context, &context->data[Queue]->queue, &context->data[context->dataNum]->element);
 }
 
 __code putQueue4(struct Context* context, struct Queue* queue, struct Element* new_element) {
     if (__sync_bool_compare_and_swap(&queue->first, 0, new_element)) {
         queue->last = new_element;
         queue->count++;
-        
+
         goto meta(context, context->next);
     } else {
         goto meta(context, PutQueue3);
@@ -196,7 +202,7 @@
 }
 
 __code putQueue4_stub(struct Context* context) {
-    goto putQueue4(context, &context->data[ActiveQueue]->queue, &context->data[context->dataNum]->element);
+    goto putQueue4(context, &context->data[Queue]->queue, &context->data[context->dataNum]->element);
 }
 
 __code createWorker(struct Context* context, struct LoopCounter* loopCounter, struct Worker* worker) {
@@ -217,7 +223,7 @@
     loopCounter->i = 0;
     goto meta(context, TaskManager);
 }
-    
+
 __code createWorker_stub(struct Context* context) {
     goto createWorker(context, &context->data[LoopCounter]->loopCounter, &context->data[Worker]->worker);
 }
@@ -238,7 +244,7 @@
     t->next = Code2;
     goto meta(context, EndTime);
 }
-    
+
 __code taskManager_stub(struct Context* context) {
     goto taskManager(context, &context->data[LoopCounter]->loopCounter, &context->data[Worker]->worker);
 }
@@ -253,7 +259,7 @@
             split = (int)atoi(argv[i+1]);
     }
 }
-            
+
 
 int main(int argc, char** argv) {
     init(argc, argv);
@@ -268,13 +274,13 @@
     main_context->next = CreateData1;
 
     struct Context* worker_contexts = NEWN(cpu_num, struct Context);
-    
+
     struct Worker* worker = &main_context->data[Worker]->worker;
     worker->num = cpu_num;
     worker->contexts = worker_contexts;
-    
+
     for (int i = 0;i<cpu_num;i++)
         initContext(&worker_contexts[i]);
-        
+
     goto start_code(main_context);
 }
--- a/src/parallel_execution/twice.c	Mon Apr 11 01:45:22 2016 +0900
+++ b/src/parallel_execution/twice.c	Mon May 02 20:02:09 2016 +0900
@@ -26,4 +26,3 @@
                context->data[Node]->node.value->array.prefix,
                context->data[Node]->node.value->array.array);
 }
-    
--- a/src/parallel_execution/worker.c	Mon Apr 11 01:45:22 2016 +0900
+++ b/src/parallel_execution/worker.c	Mon May 02 20:02:09 2016 +0900
@@ -8,18 +8,17 @@
         return;
 
     struct Element* first = queue->first;
-//    if (__sync_bool_compare_and_swap(&queue->first, first, first->next)) {
-    if (OSAtomicCompareAndSwapPtr(first, first->next, (void*)&queue->first)) {
+    if (__sync_bool_compare_and_swap(&queue->first, first, first->next)) {
         queue->count--;
-        
+
         context->next = GetQueue;
         stack_push(context->code_stack, &context->next);
-        
+
         context->next = first->task->code;
         node->key = first->task->key;
 
-	struct Traverse *t = &context->data[Traverse]->traverse;
-	t->next = GetQueue;
+        struct Traverse *t = &context->data[Traverse]->traverse;
+        t->next = GetQueue;
         goto meta(context, Get);
     } else {
         goto meta(context, GetQueue);