summaryrefslogtreecommitdiff
path: root/boost/compute/algorithm/detail/merge_sort_on_gpu.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/compute/algorithm/detail/merge_sort_on_gpu.hpp')
-rw-r--r--boost/compute/algorithm/detail/merge_sort_on_gpu.hpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/boost/compute/algorithm/detail/merge_sort_on_gpu.hpp b/boost/compute/algorithm/detail/merge_sort_on_gpu.hpp
index d5e1a2d8c9..a3d932741f 100644
--- a/boost/compute/algorithm/detail/merge_sort_on_gpu.hpp
+++ b/boost/compute/algorithm/detail/merge_sort_on_gpu.hpp
@@ -170,8 +170,12 @@ inline size_t bitonic_block_sort(KeyIterator keys_first,
k.decl<bool>("compare") << " = " <<
compare(k.var<key_type>("sibling_key"),
k.var<key_type>("my_key")) << ";\n" <<
+ k.decl<bool>("equal") << " = !(compare || " <<
+ compare(k.var<key_type>("my_key"),
+ k.var<key_type>("sibling_key")) << ");\n" <<
k.decl<bool>("swap") <<
" = compare ^ (sibling_idx < lid) ^ direction;\n" <<
+ "swap = equal ? false : swap;\n" <<
"my_key = swap ? sibling_key : my_key;\n";
if(sort_by_key)
{
@@ -220,8 +224,12 @@ inline size_t bitonic_block_sort(KeyIterator keys_first,
k.decl<bool>("compare") << " = " <<
compare(k.var<key_type>("sibling_key"),
k.var<key_type>("my_key")) << ";\n" <<
+ k.decl<bool>("equal") << " = !(compare || " <<
+ compare(k.var<key_type>("my_key"),
+ k.var<key_type>("sibling_key")) << ");\n" <<
k.decl<bool>("swap") <<
" = compare ^ (sibling_idx < lid);\n" <<
+ "swap = equal ? false : swap;\n" <<
"my_key = swap ? sibling_key : my_key;\n";
if(sort_by_key)
{