# HG changeset patch # User Tatsuki IHA # Date 1504214333 -32400 # Node ID e958a409943ce9b35446473cbac031cc0da4916d # Parent 408b4aab7610dbd51e46db7f19c53cb30a499bdd Change iterator implement from oneDim to multiDim diff -r 408b4aab7610 -r e958a409943c src/parallel_execution/CMakeLists.txt --- a/src/parallel_execution/CMakeLists.txt Tue Aug 29 21:50:57 2017 +0900 +++ b/src/parallel_execution/CMakeLists.txt Fri Sep 01 06:18:53 2017 +0900 @@ -73,7 +73,7 @@ TARGET bitonicSort SOURCES - examples/bitonicSort/bitonicSort.cbc examples/bitonicSort/swap.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc OneDimIterator.cbc TimeImpl.cbc + examples/bitonicSort/bitonicSort.cbc examples/bitonicSort/swap.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc MultiDimIterator.cbc TimeImpl.cbc ) if (${USE_CUDA}) @@ -102,9 +102,9 @@ GearsCommand( TARGET - oneDimIterator_test + multiDimIterator_test SOURCES - test/oneDimIterator_test.cbc test/printIterator.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc OneDimIterator.cbc TimeImpl.cbc + test/multiDimIterator_test.cbc test/printIterator.cbc CPUWorker.cbc TaskManagerImpl.cbc SingleLinkedQueue.cbc SynchronizedQueue.cbc MultiDimIterator.cbc TimeImpl.cbc ) GearsCommand( diff -r 408b4aab7610 -r e958a409943c src/parallel_execution/MultiDimIterator.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/MultiDimIterator.cbc Fri Sep 01 06:18:53 2017 +0900 @@ -0,0 +1,102 @@ +#include "../context.h" +#include + +Iterator* createMultiDimIterator(struct Context* context, int x, int y, int z) { + struct Iterator* iterator = new Iterator(); + struct MultiDimIterator* multiDimIterator = new MultiDimIterator(); + iterator->iterator = (union Data*)multiDimIterator; + iterator->exec = C_execMultiDimIterator; + iterator->barrier = C_barrierMultiDimIterator; + multiDimIterator->x = x; + multiDimIterator->y = y; + multiDimIterator->z = z; + multiDimIterator->count = x * y * z; + multiDimIterator->counterX = 0; + multiDimIterator->counterY = 0; + multiDimIterator->counterZ = 0; + return iterator; +} + +/** + * create iterateTask with index, that copy from task argument + * @return created iterateTask + * @param task task of the copy source + * @x index + */ +struct Context* createMultiDimIterateTask(struct Context* task, int x, int y, int z) { + struct Context* task1 = NEW(struct Context); + initContext(task1); + task1->taskManager = task->taskManager; + task1->next = task->next; + task1->iterate = 1; + task1->iterator = task->iterator; + task1->idgCount = task->idgCount; + task1->idg = task->idg; + task1->maxIdg = task->maxIdg; + for(int i = task1->idg; i < task1->maxIdg; i++) { + task1->data[i] = task->data[i]; + } + + // create index data gear and register input data to iterate task + struct MultiDim* multiDim = &ALLOCATE_DATA_GEAR(task1, MultiDim)->MultiDim; + multiDim->x = x; + multiDim->y = y; + multiDim->z = z; + task1->data[task1->maxIdg++] = (union Data*)multiDim; + + task1->odg = task->odg + 1; + task1->maxOdg = task->maxOdg + 1; + for (int i = task1->odg; i < task1->maxOdg; i++) { + task1->data[i] = task->data[i-1]; + } + + return task1; +} + +__code execMultiDimIterator(struct MultiDimIterator* iterator, struct TaskManager* taskManager, struct Context* task, __code next(...)) { + int x = iterator->counterX; + int y = iterator->counterY; + int z = iterator->counterZ; + struct Context* iterateTask = createMultiDimIterateTask(task, x, y, z); + taskManager->taskManager = (union Data*)task->taskManager; + taskManager->context = iterateTask; + taskManager->next = C_execMultiDimIterator1; + goto meta(context, task->taskManager->spawn); +} + +__code execMultiDimIterator_stub(struct Context* context) { + MultiDimIterator* iterator = (MultiDimIterator*)GearImpl(context, Iterator, iterator); + TaskManager* taskManager = Gearef(context, TaskManager); + Context* task = Gearef(context, Iterator)->task; + enum Code next = Gearef(context, Iterator)->next; + goto execMultiDimIterator(context, iterator, taskManager, task, next); +} + +__code execMultiDimIterator1(struct MultiDimIterator* iterator, struct Context* task, __code next(...)) { + if (++iterator->counterX >= iterator->x) { + iterator->counterX = 0; + if (++iterator->counterY >= iterator->y) { + iterator->counterY = 0; + if (++iterator->counterZ >= iterator->z) { + iterator->counterZ = 0; + goto next(...); + } + } + } + goto meta(context, C_execMultiDimIterator); +} + +__code barrierMultiDimIterator(struct MultiDimIterator* iterator, struct Context* task, __code next(...), __code whenWait(...)) { + if (__sync_fetch_and_sub(&iterator->count, 1) == 1) { + goto next(...); + } + goto whenWait(...); +} + +__code barrierMultiDimIterator_stub(struct Context* context) { + MultiDimIterator* iterator = (MultiDimIterator*)GearImpl(context, Iterator, iterator); + Context* task = Gearef(context, Iterator)->task; + enum Code next = Gearef(context, Iterator)->next; + enum Code whenWait = Gearef(context, Iterator)->whenWait; + goto barrierMultiDimIterator(context, iterator, task, next, whenWait); +} diff -r 408b4aab7610 -r e958a409943c src/parallel_execution/OneDimIterator.cbc --- a/src/parallel_execution/OneDimIterator.cbc Tue Aug 29 21:50:57 2017 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -#include "../context.h" -#include - -Iterator* createOneDimIterator(struct Context* context, int x) { - struct Iterator* iterator = new Iterator(); - struct OneDimIterator* oneDimIterator = new OneDimIterator(); - iterator->iterator = (union Data*)oneDimIterator; - iterator->exec = C_execOneDimIterator; - iterator->barrier = C_barrierOneDimIterator; - oneDimIterator->x = x; - oneDimIterator->count = x; - oneDimIterator->loopCounter = new LoopCounter(); - oneDimIterator->loopCounter->i = 0; - return iterator; -} - -/** - * create iterateTask with index, that copy from task argument - * @return created iterateTask - * @param task task of the copy source - * @x index - */ -struct Context* createOneDimIterateTask(struct Context* task, int x) { - struct Context* task1 = NEW(struct Context); - initContext(task1); - task1->taskManager = task->taskManager; - task1->next = task->next; - task1->iterate = 1; - task1->iterator = task->iterator; - task1->idgCount = task->idgCount; - task1->idg = task->idg; - task1->maxIdg = task->maxIdg; - for(int i = task1->idg; i < task1->maxIdg; i++) { - task1->data[i] = task->data[i]; - } - - // create index data gear and register input data to iterate task - struct Integer* dataX = &ALLOCATE_DATA_GEAR(task1, Integer)->Integer; - dataX->value = x; - task1->data[task1->maxIdg++] = (union Data*)dataX; - - task1->odg = task->odg + 1; - task1->maxOdg = task->maxOdg + 1; - for (int i = task1->odg; i < task1->maxOdg; i++) { - task1->data[i] = task->data[i-1]; - } - - return task1; -} - -__code execOneDimIterator(struct OneDimIterator* iterator, struct TaskManager* taskManager, struct Context* task, __code next(...)) { - int i = iterator->loopCounter->i; - if (i == iterator->x) { - iterator->loopCounter->i = 0; - goto next(...); - } - struct Context* iterateTask = createOneDimIterateTask(task, i); - iterator->loopCounter->i++; - taskManager->taskManager = (union Data*)task->taskManager; - taskManager->context = iterateTask; - taskManager->next = C_execOneDimIterator; - goto meta(context, task->taskManager->spawn); -} - -__code execOneDimIterator_stub(struct Context* context) { - OneDimIterator* iterator = (OneDimIterator*)GearImpl(context, Iterator, iterator); - TaskManager* taskManager = Gearef(context, TaskManager); - Context* task = Gearef(context, Iterator)->task; - enum Code next = Gearef(context, Iterator)->next; - goto execOneDimIterator(context, iterator, taskManager, task, next); -} - -__code barrierOneDimIterator(struct OneDimIterator* iterator, struct Context* task, __code next(...), __code whenWait(...)) { - if (__sync_fetch_and_sub(&iterator->count, 1) == 1) { - goto next(...); - } - goto whenWait(...); -} - -__code barrierOneDimIterator_stub(struct Context* context) { - OneDimIterator* iterator = (OneDimIterator*)GearImpl(context, Iterator, iterator); - Context* task = Gearef(context, Iterator)->task; - enum Code next = Gearef(context, Iterator)->next; - enum Code whenWait = Gearef(context, Iterator)->whenWait; - goto barrierOneDimIterator(context, iterator, task, next, whenWait); -} diff -r 408b4aab7610 -r e958a409943c src/parallel_execution/context.h --- a/src/parallel_execution/context.h Tue Aug 29 21:50:57 2017 +0900 +++ b/src/parallel_execution/context.h Fri Sep 01 06:18:53 2017 +0900 @@ -317,11 +317,20 @@ enum Code whenWait; enum Code next; } Iterator; - struct OneDimIterator { + struct MultiDimIterator { int x; + int y; + int z; int count; - struct LoopCounter *loopCounter; - } OneDimIterator; + int counterX; + int counterY; + int counterZ; + } MultiDimIterator; + struct MultiDim { + int x; + int y; + int z; + } MultiDim; }; // union Data end this is necessary for context generator typedef union Data Data; diff -r 408b4aab7610 -r e958a409943c src/parallel_execution/generate_stub.pl --- a/src/parallel_execution/generate_stub.pl Tue Aug 29 21:50:57 2017 +0900 +++ b/src/parallel_execution/generate_stub.pl Fri Sep 01 06:18:53 2017 +0900 @@ -420,10 +420,10 @@ my $outputCount = $codeGear{$codeGearName}->{'output'}; my @dataGears = split(/,\s*/, $3); my $nextCodeGear = pop(@dataGears); - my $iterateCount; + my $iterateCounts; # parse examples 'par goto(.., iterate(10), exit);' - if ($3 =~ /iterate\((\d*)\)/) { - $iterateCount = $1; + if ($3 =~ /iterate\((.*)?\)/) { + $iterateCounts = $1; $inputCount--; # pop iterate statement pop(@dataGears); @@ -445,9 +445,9 @@ ${prev}task->maxOdg = task->odg + $outputCount; EOFEOF print $fd $initTask; - if (defined $iterateCount) { + if (defined $iterateCounts) { print $fd "${prev}task->iterate = 0;\n"; - print $fd "${prev}task->iterator = createOneDimIterator(context, $iterateCount);\n"; + print $fd "${prev}task->iterator = createMultiDimIterator(context, $iterateCounts);\n"; } for my $i (0..$inputCount-1) { print $fd "${prev}task->data[task->idg+$i] = (union Data*)@dataGears[$i];\n"; diff -r 408b4aab7610 -r e958a409943c src/parallel_execution/test/multiDimIterator_test.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/test/multiDimIterator_test.cbc Fri Sep 01 06:18:53 2017 +0900 @@ -0,0 +1,109 @@ +#include +#include +#include +#include + +#include "../../context.h" + +int cpu_num = 1; +int length = 1; +int gpu_num = 0; +int CPU_ANY = -1; +int CPU_CUDA = -1; + +void *start_taskManager(struct Context *context) { + goto initDataGears(context, Gearef(context, LoopCounter), Gearef(context, TaskManager)); + return 0; +} + +#ifdef USE_CUDAWorker +#ifdef USE_CUDA_MAIN_THREAD +extern volatile int cuda_initialized; +#endif +#endif + +__code initDataGears(struct LoopCounter* loopCounter, struct TaskManager* taskManager) { + // loopCounter->tree = createRedBlackTree(context); + loopCounter->i = 0; + taskManager->taskManager = (union Data*)createTaskManagerImpl(context, cpu_num, gpu_num, 0); +#ifdef USE_CUDAWorker +#ifdef USE_CUDA_MAIN_THREAD + while(! cuda_initialized) {}; +#endif +#endif + goto meta(context, C_code1); +} + +__code initDataGears_stub(struct Context* context) { + struct TaskManager* taskManager = Gearef(context, TaskManager); + taskManager->taskManager = 0; +#if (! defined(USE_CUDAWorker) || ! defined(USE_CUDA_MAIN_THREAD)) + struct LoopCounter* loopCounter = Gearef(context, LoopCounter); + goto initDataGears(context, loopCounter, taskManager); +#else + cuda_initialized = 0; + pthread_t thread; + pthread_create(&thread, NULL, (void*)&start_taskManager, context); + while (taskManager->taskManager == 0); + TaskManager *t = (TaskManager*)taskManager->taskManager; + TaskManagerImpl *im = (TaskManagerImpl*)t->taskManager; + struct Queue *q = (Queue *)im->workers[0]; + createCUDAWorker(context,0,q, im); + pthread_join(thread,0); + exit(0); +#endif +} + +__code code1(struct Time* time) { + printf("cpus:\t\t%d\n", cpu_num); + printf("gpus:\t\t%d\n", gpu_num); + printf("length:\t\t%d\n", length); + /* puts("queue"); */ + /* print_queue(context->data[ActiveQueue]->queue.first); */ + /* puts("tree"); */ + /* print_tree(context->data[Tree]->tree.root); */ + /* puts("result"); */ + + time->time = (union Data*)createTimeImpl(context); + time->next = C_createTask1; + goto meta(context, time->time->Time.start); +} + +__code createTask1(struct LoopCounter* loopCounter, struct TaskManager* taskManager, struct Time* time) { + int i = loopCounter->i; + + if (i < length) { + loopCounter->i++; + goto meta(context, C_createTask2); + } + + loopCounter->i = 0; + taskManager->next = C_exit_code; + goto meta(context, taskManager->taskManager->TaskManager.shutdown); +} + +__code createTask2(struct TaskManager* taskManager) { + par goto printIterator(iterate(2, 2, 2), exit); + goto createTask1(); +} + +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], "-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); +} diff -r 408b4aab7610 -r e958a409943c src/parallel_execution/test/oneDimIterator_test.cbc --- a/src/parallel_execution/test/oneDimIterator_test.cbc Tue Aug 29 21:50:57 2017 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -#include -#include -#include -#include - -#include "../../context.h" - -int cpu_num = 1; -int length = 100; -int gpu_num = 0; -int CPU_ANY = -1; -int CPU_CUDA = -1; - -void *start_taskManager(struct Context *context) { - goto initDataGears(context, Gearef(context, LoopCounter), Gearef(context, TaskManager)); - return 0; -} - -#ifdef USE_CUDAWorker -#ifdef USE_CUDA_MAIN_THREAD -extern volatile int cuda_initialized; -#endif -#endif - -__code initDataGears(struct LoopCounter* loopCounter, struct TaskManager* taskManager) { - // loopCounter->tree = createRedBlackTree(context); - loopCounter->i = 0; - taskManager->taskManager = (union Data*)createTaskManagerImpl(context, cpu_num, gpu_num, 0); -#ifdef USE_CUDAWorker -#ifdef USE_CUDA_MAIN_THREAD - while(! cuda_initialized) {}; -#endif -#endif - goto meta(context, C_code1); -} - -__code initDataGears_stub(struct Context* context) { - struct TaskManager* taskManager = Gearef(context, TaskManager); - taskManager->taskManager = 0; -#if (! defined(USE_CUDAWorker) || ! defined(USE_CUDA_MAIN_THREAD)) - struct LoopCounter* loopCounter = Gearef(context, LoopCounter); - goto initDataGears(context, loopCounter, taskManager); -#else - cuda_initialized = 0; - pthread_t thread; - pthread_create(&thread, NULL, (void*)&start_taskManager, context); - while (taskManager->taskManager == 0); - TaskManager *t = (TaskManager*)taskManager->taskManager; - TaskManagerImpl *im = (TaskManagerImpl*)t->taskManager; - struct Queue *q = (Queue *)im->workers[0]; - createCUDAWorker(context,0,q, im); - pthread_join(thread,0); - exit(0); -#endif -} - -__code code1(struct Time* time) { - printf("cpus:\t\t%d\n", cpu_num); - printf("gpus:\t\t%d\n", gpu_num); - printf("length:\t\t%d\n", length); - /* puts("queue"); */ - /* print_queue(context->data[ActiveQueue]->queue.first); */ - /* puts("tree"); */ - /* print_tree(context->data[Tree]->tree.root); */ - /* puts("result"); */ - - time->time = (union Data*)createTimeImpl(context); - time->next = C_createTask1; - goto meta(context, time->time->Time.start); -} - -__code createTask1(struct LoopCounter* loopCounter, struct TaskManager* taskManager, struct Time* time) { - int i = loopCounter->i; - - if (i < length) { - loopCounter->i++; - goto meta(context, C_createTask2); - } - - loopCounter->i = 0; - taskManager->next = C_exit_code; - goto meta(context, taskManager->taskManager->TaskManager.shutdown); -} - -__code createTask2(struct TaskManager* taskManager) { - par goto printIterator(iterate(10), exit); - goto createTask1(); -} - -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], "-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); -} diff -r 408b4aab7610 -r e958a409943c src/parallel_execution/test/printIterator.cbc --- a/src/parallel_execution/test/printIterator.cbc Tue Aug 29 21:50:57 2017 +0900 +++ b/src/parallel_execution/test/printIterator.cbc Fri Sep 01 06:18:53 2017 +0900 @@ -1,12 +1,12 @@ #include "../../context.h" #include -__code printIterator(struct Integer* x, __code next(...)) { - printf("%d\n", x->value); +__code printIterator(struct MultiDim* multiDim, __code next(...)) { + printf("x: %d, y: %d, z: %d\n", multiDim->x, multiDim->y, multiDim->z); goto meta(context, next); } __code printIterator_stub(struct Context* context) { goto printIterator(context, - &context->data[context->idg]->Integer, + &context->data[context->idg]->MultiDim, context->next); }