# HG changeset patch # User Shohei KOKUBO # Date 1423244086 -32400 # Node ID a78f8360c7f9e203cee57772f844d9043b38208b # Parent 0b3d1d2863c85d6287475b72735c622043620ab1 modify bitonic sort. use sorting network diff -r 0b3d1d2863c8 -r a78f8360c7f9 example/bitonic_sort/main.cc --- a/example/bitonic_sort/main.cc Fri Feb 06 06:21:57 2015 +0900 +++ b/example/bitonic_sort/main.cc Sat Feb 07 02:34:46 2015 +0900 @@ -25,7 +25,7 @@ int length = 1024; int* data; -bool first = false; +bool flag = false; static double getTime() @@ -103,20 +103,22 @@ HTask* swap; for (int i=2; i <= length; i=2*i) { + bool first = true; for (int j=i>>1; 0 < j; j=j>>1) { swap = manager->create_task(SWAP); swap->set_inData(0, data, length*sizeof(int*)); swap->set_outData(0, data, length*sizeof(int*)); - swap->set_param(0, (long)i); - swap->set_param(1, (long)j); + swap->set_param(0, (long)j); + swap->set_param(1, (bool)first); swap->set_cpu(spe_cpu); swap->flip(); - if (first) + if (flag) swap->wait_for(wait); - swap->iterate(length); + swap->iterate(length/2); + first = false; wait = swap; } - first = true; + flag = true; } } diff -r 0b3d1d2863c8 -r a78f8360c7f9 example/bitonic_sort/ppe/swap.cc --- a/example/bitonic_sort/ppe/swap.cc Fri Feb 06 06:21:57 2015 +0900 +++ b/example/bitonic_sort/ppe/swap.cc Sat Feb 07 02:34:46 2015 +0900 @@ -7,22 +7,19 @@ { int* inData = (int*)s->get_input(rbuf, 0); int* outData = (int*)s->get_output(wbuf, 0); - long i = (long)s->get_param(0); - long j = (long)s->get_param(1); - int k = s->x; - - int point = j^k; - int temp = inData[k]; + long block = (long)s->get_param(0); + bool first = (bool)s->get_param(1); + int x = s->x; + + int position = x/block; + int index = x+block*position; - if (k < point) { - if ((i&k)==0 && inData[point] < inData[k]) { - outData[k] = inData[point]; - outData[point] = temp; - } - if ((i&k)!=0 && inData[k] < inData[point]) { - outData[k] = inData[point]; - outData[point] = temp; - } + block = first ? ((block<<1)*(position+1))-(index%block)-1 : index+block; + + if (inData[block] < inData[index]) { + int tmp = inData[index]; + outData[index] = inData[block]; + outData[block] = tmp; } return 0;