Mercurial > hg > GearsTemplate
view src/examples/bitonicSort/sort.cbc @ 590:9146d6017f18 default tip
hg mv parallel_execution/* ..
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 16 Jan 2020 15:12:06 +0900 |
parents | src/parallel_execution/examples/bitonicSort/sort.cbc@3bb5da57ddb5 |
children |
line wrap: on
line source
#include<stdio.h> #include <stdlib.h> #include "../../../context.h" #define LOGN 5 #define MAX 1 << LOGN int main(int argc, char const* argv[]) { struct Context* main_context = NEW(struct Context); initContext(main_context); main_context->next = C_sort_start; goto start_code(main_context); } __code sort_start(struct SortArray* sortArray){ sortArray->sortArray = new SortArray(); sortArray->sortArray->array = (Integer**)ALLOCATE_PTR_ARRAY(context, Integer, MAX);//ALLOC_ARRAYはDSの配列なのでintではできない sortArray->sortArray->loop_counter = 0; sortArray->sortArray->loop_counter2 = 0; sortArray->sortArray->loop_counter3 = 0; srand((unsigned) time(NULL)); goto meta(context, C_make_array); } __code make_array(struct SortArray* sortArray){//乱数生成 if (sortArray->sortArray->loop_counter == MAX){//ループの終了→配列表示へ sortArray->sortArray->loop_counter = 0; goto meta(context, C_print); } struct Integer* integer = new Integer(); integer->value = rand() % 1000; sortArray->sortArray->array[sortArray->sortArray->loop_counter] = integer; sortArray->sortArray->loop_counter++; goto meta(context, C_make_array); } __code print(struct SortArray* sortArray){//配列表示 if (sortArray->sortArray->loop_counter == MAX){//ループの終了→ソートへ printf("\n"); if (sortArray->sortArray->sort_finish == 1){//ソート終わってたら終了 goto meta(context, C_exit_code); } sortArray->sortArray->loop_counter = 0; sortArray->sortArray->loop_counter2 = 0; goto meta(context, C_bitonic_sort); } printf("%d, ", sortArray->sortArray->array[sortArray->sortArray->loop_counter]->value); sortArray->sortArray->loop_counter++; goto meta(context, C_print); } __code bitonic_sort(struct SortArray* sortArray){//ソートの繰り返し if (sortArray->sortArray->loop_counter >= LOGN){//ループの終了→配列表示へ sortArray->sortArray->loop_counter = 0; sortArray->sortArray->sort_finish = 1; goto meta(context, C_print); } goto meta(context, C_kernel); } __code kernel(struct SortArray* sortArray){//繰り返し2 if (sortArray->sortArray->loop_counter2 > sortArray->sortArray->loop_counter){//ループの終了→上のループへ sortArray->sortArray->loop_counter++; sortArray->sortArray->loop_counter2 = 0; goto meta(context, C_bitonic_sort); } goto meta(context, C_kernel2); } __code kernel2(struct SortArray* sortArray){//ソートの中身 int i = sortArray->sortArray->loop_counter3; if (i >= GET_LEN(sortArray->sortArray->array)){//ループの終了→上のループへ sortArray->sortArray->loop_counter2++; sortArray->sortArray->loop_counter3 = 0; goto meta(context, C_kernel); } goto meta(context, C_swap); } __code swap(struct SortArray* sortArray){//配列の要素を入れ替える int i = sortArray->sortArray->loop_counter3; int d = 1 << (sortArray->sortArray->loop_counter - sortArray->sortArray->loop_counter2); int up = ((i >> sortArray->sortArray->loop_counter) & 2) == 0; if ((i & d) == 0 && (sortArray->sortArray->array[i]->value > sortArray->sortArray->array[i | d]->value) == up) { struct Integer *tmp = sortArray->sortArray->array[i]; sortArray->sortArray->array[i] = sortArray->sortArray->array[i | d]; sortArray->sortArray->array[i | d] = tmp; } sortArray->sortArray->loop_counter3++; goto meta(context, C_kernel2);//上位のループへ }