Mercurial > hg > Gears > GearsAgda
diff src/parallel_execution/examples/bitonicSort/bitonicSwap.cbc @ 404:c5cd9888bf2a
Fix bitonicSort
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 03 Sep 2017 00:21:16 +0900 |
parents | src/parallel_execution/examples/bitonicSort/swap.cbc@300c18700ca5 |
children | 49159fbdd1fb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/examples/bitonicSort/bitonicSwap.cbc Sun Sep 03 00:21:16 2017 +0900 @@ -0,0 +1,36 @@ +#include "../../../context.h" +#include <stdio.h> + +__code bitonicSwap(struct SortArray* inputArray, struct MultiDim* multiDim, __code next(struct SortArray* output, ...), struct LoopCounter* loopCounter) { + struct SortArray* output = *O_output; + int block = inputArray->block; + int first = inputArray->first; + if (loopCounter->i < inputArray->prefix) { + int index = loopCounter->i + multiDim->x * inputArray->prefix; + int position = index/block; + int index1 = index+block*position; + int index2 = (first == 1)? ((block<<1)*(position+1))-(index1%block)-1 : index1+block; + struct Integer* array = inputArray->array; + if (array[index2].value < array[index1].value) { + struct Integer tmp = array[index1]; + array[index1] = array[index2]; + array[index2] = tmp; + } + loopCounter->i++; + goto meta(context, C_bitonicSwap); + } + loopCounter->i = 0; + output->array = inputArray->array; + *O_output = output; + goto meta(context, next); +} + +__code bitonicSwap_stub(struct Context* context) { + SortArray** O_output = (struct SortArray **)&context->data[context->odg]; + goto bitonicSwap(context, + &context->data[context->idg]->SortArray, + &context->data[context->idg+1]->MultiDim, + context->next, + O_output, + Gearef(context, LoopCounter)); +}