[compute] 44/49: Fix binary_find algorithm
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Fri Dec 18 17:58:21 UTC 2015
This is an automated email from the git hooks/post-receive script.
ghisvail-guest pushed a commit to branch master
in repository compute.
commit 10583d386851459c5605a2ab89f884527a750a7a
Author: Jakub Szuppe <j.szuppe at gmail.com>
Date: Sat Sep 19 18:00:23 2015 +0200
Fix binary_find algorithm
This prevents iterators from going out of range which
resulted in errors.
---
.../boost/compute/algorithm/detail/binary_find.hpp | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/include/boost/compute/algorithm/detail/binary_find.hpp b/include/boost/compute/algorithm/detail/binary_find.hpp
index e27065b..53dc413 100644
--- a/include/boost/compute/algorithm/detail/binary_find.hpp
+++ b/include/boost/compute/algorithm/detail/binary_find.hpp
@@ -95,29 +95,39 @@ inline InputIterator binary_find(InputIterator first,
size_t threads = parameters->get(cache_key, "tpb", 128);
size_t count = iterator_range_size(first, last);
+ InputIterator search_first = first;
+ InputIterator search_last = last;
+
while(count > find_if_limit) {
scalar<uint_> index(queue.get_context());
index.write(static_cast<uint_>(count), queue);
binary_find_kernel kernel(threads);
- kernel.set_range(first, last, predicate);
+ kernel.set_range(search_first, search_last, predicate);
kernel.exec(queue, index);
size_t i = index.read(queue);
if(i == count) {
- first = last - count%threads;
+ search_first = search_last - ((count - 1)%(threads - 1));
break;
} else {
- last = first + i;
- first = last - count/threads;
+ search_last = search_first + i;
+ search_first = search_last - ((count - 1)/(threads - 1));
}
- count = iterator_range_size(first, last);
+ // Make sure that first and last stay within the input range
+ search_last = std::min(search_last, last);
+ search_last = std::max(search_last, first);
+
+ search_first = std::max(search_first, first);
+ search_first = std::min(search_first, last);
+
+ count = iterator_range_size(search_first, search_last);
}
- return find_if(first, last, predicate, queue);
+ return find_if(search_first, search_last, predicate, queue);
}
} // end detail namespace
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/compute.git
More information about the debian-science-commits
mailing list