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);//上位のループへ
}