Mercurial > hg > GearsTemplate
diff src/parallel_execution/examples/bitonicSort/bitonicSort.cbc @ 381:b81492c74d2b
Create examples directory
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 Jul 2017 16:52:09 +0900 |
parents | src/parallel_execution/examples/bitonicSort.cbc@783017f6dfbe |
children | f1d111e293c4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/examples/bitonicSort/bitonicSort.cbc Mon Jul 24 16:52:09 2017 +0900 @@ -0,0 +1,211 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <math.h> + +#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) { + int logN = (int)log2((float)length); + struct Context** tasks = (struct Context**)ALLOC_ARRAY(context, Context, logN*(1+logN)/2 + 2); + int taskCount = 0; + + struct SortArray* outputSortArray = &ALLOCATE_DATA_GEAR(context, SortArray)->SortArray; + struct SortArray* inputSortArray = outputSortArray; + + // par goto makeArray(outputSortArray, _exit); + struct Context* task = NEW(struct Context); + initContext(task); + task->next = C_makeArray; + task->idgCount = 0; + task->idg = task->dataNum; + task->maxIdg = task->idg; + task->odg = task->maxIdg; + task->data[task->odg] = (union Data*)outputSortArray; + task->maxOdg = task->odg + 1; + tasks[taskCount] = task; + + taskCount++; + for (int i=2; i <= length; i=2*i) { + int first = 1; + for (int j=i>>1; j > 0; j=j>>1) { + outputSortArray = &ALLOCATE_DATA_GEAR(context, SortArray)->SortArray; + struct Context* task = NEW(struct Context); + initContext(task); + struct Integer* integer1 = &ALLOCATE_DATA_GEAR(context, Integer)->Integer; + struct Integer* integer2 = &ALLOCATE_DATA_GEAR(context, Integer)->Integer; + integer1->value = j; + integer2->value = first; + + task->next = C_bitonicSwap; + task->iterator = createOneDimIterator(context, length/2); + task->idgCount = 1; + task->idg = task->dataNum; + task->data[task->idg] = (union Data*)inputSortArray; + task->data[task->idg+1] = (union Data*)integer1; + task->data[task->idg+2] = (union Data*)integer2; + task->maxIdg = task->idg + 3; + task->odg = task->maxIdg; + task->data[task->odg] = (union Data*)outputSortArray; + task->maxOdg = task->odg + 1; + tasks[taskCount] = task; + taskCount++; + first = 0; + inputSortArray = outputSortArray; + } + } + + // par goto printArray(inputSortArray, __exit) + task = NEW(struct Context); + initContext(task); + task->next = C_printArray; + task->idgCount = 1; + task->idg = task->dataNum; + task->data[task->idg] = (union Data*)inputSortArray; + task->maxIdg = task->idg + 1; + task->odg = task->maxIdg; + task->maxOdg = task->odg; + tasks[taskCount] = task; + + taskManager->contexts = tasks; + // goto code2(); + taskManager->next1 = C_code2; + goto meta(context, taskManager->taskManager->TaskManager.spawnTasks); + //goto meta(context, taskManager->taskManager->TaskManager.shutdown); +} + +__code code2(struct LoopCounter* loopCounter, struct TaskManager* taskManager, struct Time* time) { + sleep(2); + taskManager->next = C_exit_code; + goto meta(context, taskManager->taskManager->TaskManager.shutdown); +} + +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); +} + +__code makeArray(__code next(struct SortArray* output, ...)){ + struct SortArray* output = *O_output; + if (output->loopCounter == 0){ + output->array = (Integer**)ALLOC_ARRAY(context, Integer, length); + srand((unsigned) time(NULL)); + } + if (output->loopCounter == GET_SIZE(output->array)){ + printf("created Array\n"); + output->loopCounter = 0; + goto meta(context, next); + } + struct Integer* integer = new Integer(); + integer->value = rand() % 1000; + output->array[output->loopCounter] = integer; + printf("%d\n", output->array[output->loopCounter]->value); + output->loopCounter++; + *O_output = output; + goto meta(context, C_makeArray); +} + +__code makeArray_stub(struct Context* context) { + SortArray** O_output = (struct SortArray **)&context->data[context->odg]; + goto makeArray(context, + context->next, + O_output); +} + +__code printArray(struct SortArray* inputArray, __code next(...)){ + if (inputArray->loopCounter == GET_SIZE(inputArray->array)){ + inputArray->loopCounter = 0; + goto meta(context, next); + } + printf("%d\n", inputArray->array[inputArray->loopCounter]->value); + inputArray->loopCounter++; + goto meta(context, C_printArray); +} + +__code printArray_stub(struct Context* context) { + goto printArray(context, + &context->data[context->idg]->SortArray, + context->next); +}