From 6245d82d57aa9e0029a0beb1b37555f27440dcd5 Mon Sep 17 00:00:00 2001 From: Kyle Lutz Date: Wed, 29 Oct 2014 22:51:40 -0700 Subject: [PATCH] Change vector to use the system-wide default queue This changes the vector container class to use the system-wide default queue instead of creating temporary queue objects. --- include/boost/compute/container/flat_map.hpp | 130 ++++-------------- include/boost/compute/container/flat_set.hpp | 135 ++++--------------- include/boost/compute/container/vector.hpp | 134 +++--------------- test/test_vector.cpp | 10 +- 4 files changed, 79 insertions(+), 330 deletions(-) diff --git a/include/boost/compute/container/flat_map.hpp b/include/boost/compute/container/flat_map.hpp index 5a72a2ad9..e257a7561 100644 --- a/include/boost/compute/container/flat_map.hpp +++ b/include/boost/compute/container/flat_map.hpp @@ -55,8 +55,9 @@ class flat_map { } - flat_map(const flat_map &other) - : m_vector(other.m_vector) + flat_map(const flat_map &other, + command_queue &queue = system::default_queue()) + : m_vector(other.m_vector, queue) { } @@ -153,18 +154,12 @@ class flat_map return m_vector.capacity(); } - void reserve(size_type size, command_queue &queue) + void reserve(size_type size, + command_queue &queue = system::default_queue()) { m_vector.reserve(size, queue); } - void reserve(size_type size) - { - command_queue queue = m_vector.default_queue(); - reserve(size, queue); - queue.finish(); - } - void shrink_to_fit() { m_vector.shrink_to_fit(); @@ -176,7 +171,8 @@ class flat_map } std::pair - insert(const value_type &value, command_queue &queue) + insert(const value_type &value, + command_queue &queue = system::default_queue()) { iterator location = upper_bound(value.first, queue); @@ -192,43 +188,21 @@ class flat_map return std::make_pair(location, true); } - std::pair insert(const value_type &value) - { - command_queue queue = m_vector.default_queue(); - std::pair result = insert(value, queue); - queue.finish(); - return result; - } - - iterator erase(const const_iterator &position, command_queue &queue) + iterator erase(const const_iterator &position, + command_queue &queue = system::default_queue()) { return erase(position, position + 1, queue); } - iterator erase(const const_iterator &position) - { - command_queue queue = m_vector.default_queue(); - iterator iter = erase(position, queue); - queue.finish(); - return iter; - } - iterator erase(const const_iterator &first, const const_iterator &last, - command_queue &queue) + command_queue &queue = system::default_queue()) { return m_vector.erase(first, last, queue); } - iterator erase(const const_iterator &first, const const_iterator &last) - { - command_queue queue = m_vector.default_queue(); - iterator iter = erase(first, last, queue); - queue.finish(); - return iter; - } - - size_type erase(const key_type &value, command_queue &queue) + size_type erase(const key_type &value, + command_queue &queue = system::default_queue()) { iterator position = find(value, queue); @@ -241,7 +215,8 @@ class flat_map } } - iterator find(const key_type &value, command_queue &queue) + iterator find(const key_type &value, + command_queue &queue = system::default_queue()) { ::boost::compute::get<0> get_key; @@ -253,15 +228,8 @@ class flat_map ).base(); } - iterator find(const key_type &value) - { - command_queue queue = m_vector.default_queue(); - iterator iter = find(value, queue); - queue.finish(); - return iter; - } - - const_iterator find(const key_type &value, command_queue &queue) const + const_iterator find(const key_type &value, + command_queue &queue = system::default_queue()) const { ::boost::compute::get<0> get_key; @@ -273,28 +241,14 @@ class flat_map ).base(); } - const_iterator find(const key_type &value) const - { - command_queue queue = m_vector.default_queue(); - const_iterator iter = find(value, queue); - queue.finish(); - return iter; - } - - size_type count(const key_type &value, command_queue &queue) const + size_type count(const key_type &value, + command_queue &queue = system::default_queue()) const { return find(value, queue) != end() ? 1 : 0; } - size_type count(const key_type &value) const - { - command_queue queue = m_vector.default_queue(); - size_type result = count(value, queue); - queue.finish(); - return result; - } - - iterator lower_bound(const key_type &value, command_queue &queue) + iterator lower_bound(const key_type &value, + command_queue &queue = system::default_queue()) { ::boost::compute::get<0> get_key; @@ -306,15 +260,8 @@ class flat_map ).base(); } - iterator lower_bound(const key_type &value) - { - command_queue queue = m_vector.default_queue(); - iterator iter = lower_bound(value, queue); - queue.finish(); - return iter; - } - - const_iterator lower_bound(const key_type &value, command_queue &queue) const + const_iterator lower_bound(const key_type &value, + command_queue &queue = system::default_queue()) const { ::boost::compute::get<0> get_key; @@ -326,15 +273,8 @@ class flat_map ).base(); } - const_iterator lower_bound(const key_type &value) const - { - command_queue queue = m_vector.default_queue(); - const_iterator iter = lower_bound(value, queue); - queue.finish(); - return iter; - } - - iterator upper_bound(const key_type &value, command_queue &queue) + iterator upper_bound(const key_type &value, + command_queue &queue = system::default_queue()) { ::boost::compute::get<0> get_key; @@ -346,15 +286,8 @@ class flat_map ).base(); } - iterator upper_bound(const key_type &value) - { - command_queue queue = m_vector.default_queue(); - iterator iter = upper_bound(value, queue); - queue.finish(); - return iter; - } - - const_iterator upper_bound(const key_type &value, command_queue &queue) const + const_iterator upper_bound(const key_type &value, + command_queue &queue = system::default_queue()) const { ::boost::compute::get<0> get_key; @@ -366,14 +299,6 @@ class flat_map ).base(); } - const_iterator upper_bound(const key_type &value) const - { - command_queue queue = m_vector.default_queue(); - const_iterator iter = upper_bound(value, queue); - queue.finish(); - return iter; - } - const mapped_type at(const key_type &key) const { const_iterator iter = find(key); @@ -391,6 +316,9 @@ class flat_map iter = insert(std::make_pair(key, mapped_type())).first; } + // ensure insert() is finished before returning value + system::finish(); + size_t index = iter.get_index() * sizeof(value_type) + sizeof(key_type); return detail::buffer_value(m_vector.get_buffer(), index); diff --git a/include/boost/compute/container/flat_set.hpp b/include/boost/compute/container/flat_set.hpp index 58a389164..f0709f5ab 100644 --- a/include/boost/compute/container/flat_set.hpp +++ b/include/boost/compute/container/flat_set.hpp @@ -44,8 +44,9 @@ class flat_set { } - flat_set(const flat_set &other) - : m_vector(other.m_vector) + flat_set(const flat_set &other, + command_queue &queue = system::default_queue()) + : m_vector(other.m_vector, queue) { } @@ -142,18 +143,12 @@ class flat_set return m_vector.capacity(); } - void reserve(size_type size, command_queue &queue) + void reserve(size_type size, + command_queue &queue = system::default_queue()) { m_vector.reserve(size, queue); } - void reserve(size_type size) - { - command_queue queue = m_vector.default_queue(); - reserve(size, queue); - queue.finish(); - } - void shrink_to_fit() { m_vector.shrink_to_fit(); @@ -165,7 +160,8 @@ class flat_set } std::pair - insert(const value_type &value, command_queue &queue) + insert(const value_type &value, + command_queue &queue = system::default_queue()) { iterator location = upper_bound(value, queue); @@ -181,43 +177,21 @@ class flat_set return std::make_pair(location, true); } - std::pair insert(const value_type &value) - { - command_queue queue = m_vector.default_queue(); - std::pair result = insert(value, queue); - queue.finish(); - return result; - } - - iterator erase(const const_iterator &position, command_queue &queue) + iterator erase(const const_iterator &position, + command_queue &queue = system::default_queue()) { return erase(position, position + 1, queue); } - iterator erase(const const_iterator &position) - { - command_queue queue = m_vector.default_queue(); - iterator iter = erase(position, queue); - queue.finish(); - return iter; - } - iterator erase(const const_iterator &first, const const_iterator &last, - command_queue &queue) + command_queue &queue = system::default_queue()) { return m_vector.erase(first, last, queue); } - iterator erase(const const_iterator &first, const const_iterator &last) - { - command_queue queue = m_vector.default_queue(); - iterator iter = erase(first, last, queue); - queue.finish(); - return iter; - } - - size_type erase(const key_type &value, command_queue &queue) + size_type erase(const key_type &value, + command_queue queue = system::default_queue()) { iterator position = find(value, queue); @@ -230,105 +204,48 @@ class flat_set } } - size_type erase(const key_type &value) - { - command_queue queue = m_vector.default_queue(); - size_type result = erase(value, queue); - queue.finish(); - return result; - } - - iterator find(const key_type &value, command_queue &queue) + iterator find(const key_type &value, + command_queue queue = system::default_queue()) { return ::boost::compute::find(begin(), end(), value, queue); } - iterator find(const key_type &value) - { - command_queue queue = m_vector.default_queue(); - iterator iter = find(value, queue); - queue.finish(); - return iter; - } - - const_iterator find(const key_type &value, command_queue &queue) const + const_iterator find(const key_type &value, + command_queue &queue = system::default_queue()) const { return ::boost::compute::find(begin(), end(), value, queue); } - const_iterator find(const key_type &value) const - { - command_queue queue = m_vector.default_queue(); - const_iterator iter = find(value, queue); - queue.finish(); - return iter; - } - - size_type count(const key_type &value, command_queue &queue) const + size_type count(const key_type &value, + command_queue &queue = system::default_queue()) const { return find(value, queue) != end() ? 1 : 0; } - size_type count(const key_type &value) const - { - command_queue queue = m_vector.default_queue(); - size_type result = count(value, queue); - queue.finish(); - return result; - } - - iterator lower_bound(const key_type &value, command_queue &queue) + iterator lower_bound(const key_type &value, + command_queue &queue = system::default_queue()) { return ::boost::compute::lower_bound(begin(), end(), value, queue); } - iterator lower_bound(const key_type &value) - { - command_queue queue = m_vector.default_queue(); - iterator iter = lower_bound(value, queue); - queue.finish(); - return iter; - } - - const_iterator lower_bound(const key_type &value, command_queue &queue) const + const_iterator lower_bound(const key_type &value, + command_queue &queue = system::default_queue()) const { return ::boost::compute::lower_bound(begin(), end(), value, queue); } - const_iterator lower_bound(const key_type &value) const - { - command_queue queue = m_vector.default_queue(); - const_iterator iter = lower_bound(value, queue); - queue.finish(); - return iter; - } - - iterator upper_bound(const key_type &value, command_queue &queue) + iterator upper_bound(const key_type &value, + command_queue &queue = system::default_queue()) { return ::boost::compute::upper_bound(begin(), end(), value, queue); } - iterator upper_bound(const key_type &value) - { - command_queue queue = m_vector.default_queue(); - iterator iter = upper_bound(value, queue); - queue.finish(); - return iter; - } - - const_iterator upper_bound(const key_type &value, command_queue &queue) const + const_iterator upper_bound(const key_type &value, + command_queue &queue = system::default_queue()) const { return ::boost::compute::upper_bound(begin(), end(), value, queue); } - const_iterator upper_bound(const key_type &value) const - { - command_queue queue = m_vector.default_queue(); - const_iterator iter = upper_bound(value, queue); - queue.finish(); - return iter; - } - private: vector m_vector; }; diff --git a/include/boost/compute/container/vector.hpp b/include/boost/compute/container/vector.hpp index c53d36409..84ea29979 100644 --- a/include/boost/compute/container/vector.hpp +++ b/include/boost/compute/container/vector.hpp @@ -194,7 +194,7 @@ class vector m_data = m_allocator.allocate((std::max)(m_size, _minimum_capacity())); if(!other.empty()){ - command_queue queue = default_queue(); + command_queue queue = system::default_queue(); ::boost::compute::copy(other.begin(), other.end(), begin(), queue); queue.finish(); } @@ -228,7 +228,7 @@ class vector vector& operator=(const vector &other) { if(this != &other){ - command_queue queue = default_queue(); + command_queue queue = system::default_queue(); resize(other.size(), queue); ::boost::compute::copy(other.begin(), other.end(), begin(), queue); queue.finish(); @@ -240,7 +240,7 @@ class vector template vector& operator=(const std::vector &vector) { - command_queue queue = default_queue(); + command_queue queue = system::default_queue(); resize(vector.size(), queue); ::boost::compute::copy(vector.begin(), vector.end(), begin(), queue); queue.finish(); @@ -354,7 +354,7 @@ class vector } /// Resizes the vector to \p size. - void resize(size_type size, command_queue &queue) + void resize(size_type size, command_queue &queue = system::default_queue()) { if(size < capacity()){ m_size = size; @@ -380,14 +380,6 @@ class vector } } - /// \overload - void resize(size_type size) - { - command_queue queue = default_queue(); - resize(size, queue); - queue.finish(); - } - /// Returns \c true if the vector is empty. bool empty() const { @@ -400,31 +392,17 @@ class vector return m_data.get_buffer().size() / sizeof(T); } - void reserve(size_type size, command_queue &queue) + void reserve(size_type size, command_queue &queue = system::default_queue()) { (void) size; (void) queue; } - void reserve(size_type size) - { - command_queue queue = default_queue(); - reserve(size, queue); - queue.finish(); - } - - void shrink_to_fit(command_queue &queue) + void shrink_to_fit(command_queue &queue = system::default_queue()) { (void) queue; } - void shrink_to_fit() - { - command_queue queue = default_queue(); - shrink_to_fit(queue); - queue.finish(); - } - reference operator[](size_type index) { return *(begin() + static_cast(index)); @@ -476,7 +454,7 @@ class vector template void assign(InputIterator first, InputIterator last, - command_queue &queue) + command_queue &queue = system::default_queue()) { // resize vector for new contents resize(detail::iterator_range_size(first, last), queue); @@ -485,15 +463,7 @@ class vector ::boost::compute::copy(first, last, begin(), queue); } - template - void assign(InputIterator first, InputIterator last) - { - command_queue queue = default_queue(); - assign(first, last, queue); - queue.finish(); - } - - void assign(size_type n, const T &value, command_queue &queue) + void assign(size_type n, const T &value, command_queue &queue = system::default_queue()) { // resize vector for new contents resize(n, queue); @@ -502,13 +472,6 @@ class vector ::boost::compute::fill_n(begin(), n, value, queue); } - void assign(size_type n, const T &value) - { - command_queue queue = default_queue(); - assign(n, value, queue); - queue.finish(); - } - /// Inserts \p value at the end of the vector (resizing if neccessary). /// /// Note that calling \c push_back() to insert data values one at a time @@ -516,32 +479,19 @@ class vector /// transfer to the device. It is usually better to store a set of values /// on the host (for example, in a \c std::vector) and then transfer them /// in bulk using the \c insert() method or the copy() algorithm. - void push_back(const T &value, command_queue &queue) + void push_back(const T &value, command_queue &queue = system::default_queue()) { insert(end(), value, queue); } - /// \overload - void push_back(const T &value) - { - command_queue queue = default_queue(); - push_back(value, queue); - queue.finish(); - } - - void pop_back(command_queue &queue) + void pop_back(command_queue &queue = system::default_queue()) { resize(size() - 1, queue); } - void pop_back() - { - command_queue queue = default_queue(); - pop_back(queue); - queue.finish(); - } - - iterator insert(iterator position, const T &value, command_queue &queue) + iterator insert(iterator position, + const T &value, + command_queue &queue = system::default_queue()) { if(position == end()){ resize(m_size + 1, queue); @@ -559,14 +509,6 @@ class vector return position + 1; } - iterator insert(iterator position, const T &value) - { - command_queue queue = default_queue(); - iterator iter = insert(position, value, queue); - queue.finish(); - return iter; - } - void insert(iterator position, size_type count, const T &value, @@ -586,20 +528,13 @@ class vector ); } - void insert(iterator position, size_type count, const T &value) - { - command_queue queue = default_queue(); - insert(position, count, value, queue); - queue.finish(); - } - /// Inserts the values in the range [\p first, \p last) into the vector at /// \p position using \p queue. template void insert(iterator position, InputIterator first, InputIterator last, - command_queue &queue) + command_queue &queue = system::default_queue()) { ::boost::compute::vector tmp(position, end(), queue); @@ -617,29 +552,12 @@ class vector ); } - /// \overload - template - void insert(iterator position, InputIterator first, InputIterator last) - { - command_queue queue = default_queue(); - insert(position, first, last, queue); - queue.finish(); - } - - iterator erase(iterator position, command_queue &queue) + iterator erase(iterator position, command_queue &queue = system::default_queue()) { return erase(position, position + 1, queue); } - iterator erase(iterator position) - { - command_queue queue = default_queue(); - iterator iter = erase(position, queue); - queue.finish(); - return iter; - } - - iterator erase(iterator first, iterator last, command_queue &queue) + iterator erase(iterator first, iterator last, command_queue &queue = system::default_queue()) { if(last != end()){ ::boost::compute::vector tmp(last, end(), queue); @@ -652,14 +570,6 @@ class vector return begin() + first.get_index() + count; } - iterator erase(iterator first, iterator last) - { - command_queue queue = default_queue(); - iterator iter = erase(first, last, queue); - queue.finish(); - return iter; - } - /// Swaps the contents of \c *this with \p other. void swap(vector &other) { @@ -685,18 +595,6 @@ class vector return m_data.get_buffer(); } - /// \internal_ - /// - /// Returns a command queue usable to issue commands for the vector's - /// memory buffer. This is used when a member function is called without - /// speicifying an existing command queue to use. - command_queue default_queue() const - { - const context &context = m_allocator.get_context(); - command_queue queue(context, context.get_device()); - return queue; - } - private: /// \internal_ BOOST_CONSTEXPR size_type _minimum_capacity() const { return 4; } diff --git a/test/test_vector.cpp b/test/test_vector.cpp index a2dccb890..f2093e4d0 100644 --- a/test/test_vector.cpp +++ b/test/test_vector.cpp @@ -69,6 +69,7 @@ BOOST_AUTO_TEST_CASE(array_operator) CHECK_RANGE_EQUAL(int, 10, vector, (42, 42, 42, 42, 42, 42, 42, 42, 42, 42)); vector[0] = 9; + bc::system::finish(); CHECK_RANGE_EQUAL(int, 10, vector, (9, 42, 42, 42, 42, 42, 42, 42, 42, 42)); } @@ -150,6 +151,7 @@ BOOST_AUTO_TEST_CASE(at) vector.push_back(1); vector.push_back(2); vector.push_back(3); + bc::system::finish(); BOOST_CHECK_EQUAL(vector.at(0), 1); BOOST_CHECK_EQUAL(vector.at(1), 2); BOOST_CHECK_EQUAL(vector.at(2), 3); @@ -230,6 +232,7 @@ BOOST_AUTO_TEST_CASE(vector_iterator) vector.push_back(4); vector.push_back(6); vector.push_back(8); + bc::system::finish(); BOOST_CHECK_EQUAL(vector.size(), size_t(4)); BOOST_CHECK_EQUAL(vector[0], 2); BOOST_CHECK_EQUAL(*vector.begin(), 2); @@ -276,6 +279,9 @@ BOOST_AUTO_TEST_CASE(swap_between_contexts) compute::context ctx1(device); compute::context ctx2(device); + compute::command_queue queue1(ctx1, device); + compute::command_queue queue2(ctx2, device); + compute::vector vec1(32, ctx1); compute::vector vec2(32, ctx2); @@ -287,8 +293,8 @@ BOOST_AUTO_TEST_CASE(swap_between_contexts) BOOST_CHECK(vec1.get_allocator().get_context() == ctx2); BOOST_CHECK(vec2.get_allocator().get_context() == ctx1); - vec1.resize(64); - vec2.resize(64); + vec1.resize(64, queue2); + vec2.resize(64, queue1); } BOOST_AUTO_TEST_CASE(assign_from_std_vector)