changeset 702:fb0a9d082360

add twice/main.cbc test
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sat, 22 Aug 2020 19:51:17 +0900
parents f406b70c6e7a
children cf517d3f5ab9
files src/parallel_execution/perlTests/generate_stub.t src/parallel_execution/perlTests/testfiles/twice/main.c
diffstat 2 files changed, 160 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/perlTests/generate_stub.t	Sat Aug 22 19:37:07 2020 +0900
+++ b/src/parallel_execution/perlTests/generate_stub.t	Sat Aug 22 19:51:17 2020 +0900
@@ -7,15 +7,21 @@
 use File::Temp qw/tempfile/;
 use FindBin;
 
-subtest 'generate_stub.pl examples/boundedBuffer/BoundedBuffer.cbc' => sub {
-    my $targetFile = 'examples/boundedBuffer/BoundedBuffer.cbc';
-    my $wantGeneratedFile = "$FindBin::Bin/BoundedBuffer.c";
 
+sub compareCbC2C {
+  my ($targetFile, $wantCFile) = @_;
+
+  subtest "generate_stub.pl $targetFile" => sub {
     my ($_fh, $testOutputFile) = tempfile();
     close $_fh;
     system("perl", "generate_stub.pl", "-o", $testOutputFile, $targetFile);
 
-    is(compare($wantGeneratedFile, $testOutputFile), 0, "generate_stub.pl $targetFile");
-};
+    is(compare($wantCFile, $testOutputFile), 0, "$wantCFile eq  $testOutputFile");
+  };
+
+}
+
+compareCbC2C('examples/boundedBuffer/BoundedBuffer.cbc', "$FindBin::Bin/BoundedBuffer.c");
+compareCbC2C('examples/twice/main.cbc', "$FindBin::Bin/testfiles/twice/main.c");
 
 done_testing;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parallel_execution/perlTests/testfiles/twice/main.c	Sat Aug 22 19:51:17 2020 +0900
@@ -0,0 +1,149 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "../../../context.h"
+
+int cpu_num = 1;
+int length = 102400;
+int split = 8;
+int* array_ptr;
+int gpu_num = 0;
+int CPU_ANY = -1;
+int CPU_CUDA = -1;
+
+__code initDataGears(struct Context *context,struct LoopCounter* loopCounter, struct TaskManager* taskManager) {
+    // loopCounter->tree = createRedBlackTree(context);
+    loopCounter->i = 0;
+    taskManager->taskManager = (union Data*)createTaskManagerImpl(context, cpu_num, gpu_num, 0);
+    context->before = C_initDataGears;
+    goto meta(context, C_code1);
+}
+
+__code initDataGears_stub(struct Context* context) {
+	LoopCounter* loopCounter = Gearef(context, LoopCounter);
+	TaskManager* taskManager = Gearef(context, TaskManager);
+	goto initDataGears(context, loopCounter, taskManager);
+} 
+
+__code code1(struct Context *context,struct LoopCounter* loopCounter) {
+    printf("cpus:\t\t%d\n", cpu_num);
+    printf("gpus:\t\t%d\n", gpu_num);
+    printf("length:\t\t%d\n", length);
+    printf("length/task:\t%d\n", length/split);
+    /* puts("queue"); */
+    /* print_queue(context->data[ActiveQueue]->queue.first); */
+    /* puts("tree"); */
+    /* print_tree(context->data[Tree]->tree.root); */
+    /* puts("result"); */
+    context->before = C_code1;
+    goto meta(context, C_createTask1);
+}
+
+
+__code code1_stub(struct Context* context) {
+	LoopCounter* loopCounter = Gearef(context, LoopCounter);
+	goto code1(context, loopCounter);
+} 
+
+__code createTask1(struct Context *context,struct LoopCounter* loopCounter, struct TaskManager* taskManager) {
+    Array* array1 = &ALLOCATE(context, Array)->Array;
+    Array* array2 = &ALLOCATE(context, Array)->Array;
+    Timer* timer = createTimerImpl(context);
+
+    struct Element* element;
+                    context->task = NEW(struct Context);
+                    initContext(context->task);
+                    context->task->next = C_createArray;
+                    context->task->idgCount = 0;
+                    context->task->idg = context->task->dataNum;
+                    context->task->maxIdg = context->task->idg + 0;
+                    context->task->odg = context->task->maxIdg;
+                    context->task->maxOdg = context->task->odg + 2;
+    GET_META(array1)->wait = createSynchronizedQueue(context);
+    GET_META(timer)->wait = createSynchronizedQueue(context);
+    context->task->data[context->task->odg+0] = (union Data*)array1;
+    context->task->data[context->task->odg+1] = (union Data*)timer;
+                    element = &ALLOCATE(context, Element)->Element;
+                    element->data = (union Data*)context->task;
+                    element->next = context->taskList;
+                    context->taskList = element;
+                    context->task = NEW(struct Context);
+                    initContext(context->task);
+                    context->task->next = C_twice;
+                    context->task->idgCount = 1;
+                    context->task->idg = context->task->dataNum;
+                    context->task->maxIdg = context->task->idg + 1;
+                    context->task->odg = context->task->maxIdg;
+                    context->task->maxOdg = context->task->odg + 1;
+    context->task->iterate = 0;
+    context->task->iterator = createMultiDimIterator(context, split, 1, 1);
+    GET_META(array1)->wait = createSynchronizedQueue(context);
+    GET_META(array2)->wait = createSynchronizedQueue(context);
+    context->task->data[context->task->idg+0] = (union Data*)array1;
+    context->task->data[context->task->odg+0] = (union Data*)array2;
+                    element = &ALLOCATE(context, Element)->Element;
+                    element->data = (union Data*)context->task;
+                    element->next = context->taskList;
+                    context->taskList = element;
+                    context->task = NEW(struct Context);
+                    initContext(context->task);
+                    context->task->next = C_printArray;
+                    context->task->idgCount = 2;
+                    context->task->idg = context->task->dataNum;
+                    context->task->maxIdg = context->task->idg + 2;
+                    context->task->odg = context->task->maxIdg;
+                    context->task->maxOdg = context->task->odg + 0;
+    GET_META(array2)->wait = createSynchronizedQueue(context);
+    GET_META(timer)->wait = createSynchronizedQueue(context);
+    context->task->data[context->task->idg+0] = (union Data*)array2;
+    context->task->data[context->task->idg+1] = (union Data*)timer;
+                    element = &ALLOCATE(context, Element)->Element;
+                    element->data = (union Data*)context->task;
+                    element->next = context->taskList;
+                    context->taskList = element;
+    Gearef(context, TaskManager)->taskList = context->taskList;
+    Gearef(context, TaskManager)->next1 = C_code2;
+    goto parGotoMeta(context, C_code2);
+}
+
+__code createTask1_stub(struct Context* context) {
+	LoopCounter* loopCounter = Gearef(context, LoopCounter);
+	TaskManager* taskManager = Gearef(context, TaskManager);
+	goto createTask1(context, loopCounter, taskManager);
+} 
+
+__code code2(struct Context *context,struct TaskManager* taskManager) {
+    Gearef(context, TaskManager)->taskManager = (union Data*) taskManager;
+    Gearef(context, TaskManager)->next = C_exit_code;
+    context->before = C_code2;
+    goto meta(context, taskManager->shutdown);
+}
+
+__code code2_stub(struct Context* context) {
+    goto code2(context, &Gearef(context, TaskManager)->taskManager->TaskManager);
+}
+
+void init(int argc, char** argv) {
+    for (int i = 1; argv[i]; ++i) {
+        if (strcmp(argv[i], "-cpu") == 0)
+            cpu_num = (int)atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-l") == 0)
+            length = (int)atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-s") == 0)
+            split = (int)atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-cuda") == 0) {
+            gpu_num = 1;
+            CPU_CUDA = 0;
+        }
+    }
+}
+
+int main(int argc, char** argv) {
+    init(argc, argv);
+    struct Context* main_context = NEW(struct Context);
+    initContext(main_context);
+    main_context->next = C_initDataGears;
+    goto start_code(main_context);
+}