218 lines
5.8 KiB
Plaintext
218 lines
5.8 KiB
Plaintext
//---------------------------------------------------------------------------//
|
|
// Copyright (c) 2013-2014 Kyle Lutz <kyle.r.lutz@gmail.com>
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0
|
|
// See accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt
|
|
//
|
|
// See http://boostorg.github.com/compute for more information.
|
|
//---------------------------------------------------------------------------//
|
|
|
|
#ifndef BOOST_COMPUTE_UTILITY_WAIT_LIST_HPP
|
|
#define BOOST_COMPUTE_UTILITY_WAIT_LIST_HPP
|
|
|
|
#include <vector>
|
|
|
|
#include <boost/compute/config.hpp>
|
|
|
|
#ifndef BOOST_COMPUTE_NO_HDR_INITIALIZER_LIST
|
|
#include <initializer_list>
|
|
#endif
|
|
|
|
#include <boost/compute/event.hpp>
|
|
|
|
namespace boost {
|
|
namespace compute {
|
|
|
|
template<class T> class future;
|
|
|
|
/// \class wait_list
|
|
/// \brief Stores a list of events.
|
|
///
|
|
/// The wait_list class stores a set of event objects and can be used to
|
|
/// specify dependencies for OpenCL operations or to wait on the host until
|
|
/// all of the events have completed.
|
|
///
|
|
/// This class also provides convenience functions for interacting with
|
|
/// OpenCL APIs which typically accept event dependencies as a \c cl_event*
|
|
/// pointer and a \c cl_uint size. For example:
|
|
/// \code
|
|
/// wait_list events = ...;
|
|
///
|
|
/// clEnqueueNDRangeKernel(..., events.get_event_ptr(), events.size(), ...);
|
|
/// \endcode
|
|
///
|
|
/// \see event, \ref future "future<T>"
|
|
class wait_list
|
|
{
|
|
public:
|
|
typedef std::vector<event>::iterator iterator;
|
|
typedef std::vector<event>::const_iterator const_iterator;
|
|
|
|
/// Creates an empty wait-list.
|
|
wait_list()
|
|
{
|
|
}
|
|
|
|
/// Creates a wait-list containing \p event.
|
|
wait_list(const event &event)
|
|
{
|
|
insert(event);
|
|
}
|
|
|
|
/// Creates a new wait-list as a copy of \p other.
|
|
wait_list(const wait_list &other)
|
|
: m_events(other.m_events)
|
|
{
|
|
}
|
|
|
|
#ifndef BOOST_COMPUTE_NO_HDR_INITIALIZER_LIST
|
|
/// Creates a wait-list from \p events
|
|
wait_list(std::initializer_list<event> events)
|
|
: m_events(events)
|
|
{
|
|
}
|
|
#endif // BOOST_COMPUTE_NO_HDR_INITIALIZER_LIST
|
|
|
|
/// Copies the events in the wait-list from \p other.
|
|
wait_list& operator=(const wait_list &other)
|
|
{
|
|
if(this != &other){
|
|
m_events = other.m_events;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
#ifndef BOOST_COMPUTE_NO_RVALUE_REFERENCES
|
|
/// Move-constructs a new wait list object from \p other.
|
|
wait_list(wait_list&& other)
|
|
: m_events(std::move(other.m_events))
|
|
{
|
|
}
|
|
|
|
/// Move-assigns the wait list from \p other to \c *this.
|
|
wait_list& operator=(wait_list&& other)
|
|
{
|
|
m_events = std::move(other.m_events);
|
|
|
|
return *this;
|
|
}
|
|
#endif // BOOST_COMPUTE_NO_RVALUE_REFERENCES
|
|
|
|
/// Destroys the wait-list.
|
|
~wait_list()
|
|
{
|
|
}
|
|
|
|
/// Returns \c true if the wait-list is empty.
|
|
bool empty() const
|
|
{
|
|
return m_events.empty();
|
|
}
|
|
|
|
/// Returns the number of events in the wait-list.
|
|
uint_ size() const
|
|
{
|
|
return static_cast<uint_>(m_events.size());
|
|
}
|
|
|
|
/// Removes all of the events from the wait-list.
|
|
void clear()
|
|
{
|
|
m_events.clear();
|
|
}
|
|
|
|
/// Returns a cl_event pointer to the first event in the wait-list.
|
|
/// Returns \c 0 if the wait-list is empty.
|
|
///
|
|
/// This can be used to pass the wait-list to OpenCL functions which
|
|
/// expect a \c cl_event pointer to refer to a list of events.
|
|
const cl_event* get_event_ptr() const
|
|
{
|
|
if(empty()){
|
|
return 0;
|
|
}
|
|
|
|
return reinterpret_cast<const cl_event *>(&m_events[0]);
|
|
}
|
|
|
|
/// Reserves a minimum length of storage for the wait list object.
|
|
void reserve(size_t new_capacity) {
|
|
m_events.reserve(new_capacity);
|
|
}
|
|
|
|
/// Inserts \p event into the wait-list.
|
|
void insert(const event &event)
|
|
{
|
|
m_events.push_back(event);
|
|
}
|
|
|
|
/// Inserts the event from \p future into the wait-list.
|
|
template<class T>
|
|
void insert(const future<T> &future)
|
|
{
|
|
insert(future.get_event());
|
|
}
|
|
|
|
/// Blocks until all of the events in the wait-list have completed.
|
|
///
|
|
/// Does nothing if the wait-list is empty.
|
|
void wait() const
|
|
{
|
|
if(!empty()){
|
|
BOOST_COMPUTE_ASSERT_CL_SUCCESS(
|
|
clWaitForEvents(size(), get_event_ptr())
|
|
);
|
|
}
|
|
}
|
|
|
|
/// Returns a reference to the event at specified location \p pos.
|
|
const event& operator[](size_t pos) const {
|
|
return m_events[pos];
|
|
}
|
|
|
|
/// Returns a reference to the event at specified location \p pos.
|
|
event& operator[](size_t pos) {
|
|
return m_events[pos];
|
|
}
|
|
|
|
/// Returns an iterator to the first element of the wait-list.
|
|
iterator begin() {
|
|
return m_events.begin();
|
|
}
|
|
|
|
/// Returns an iterator to the first element of the wait-list.
|
|
const_iterator begin() const {
|
|
return m_events.begin();
|
|
}
|
|
|
|
/// Returns an iterator to the first element of the wait-list.
|
|
const_iterator cbegin() const {
|
|
return m_events.begin();
|
|
}
|
|
|
|
/// Returns an iterator to the element following the last element of the wait-list.
|
|
iterator end() {
|
|
return m_events.end();
|
|
}
|
|
|
|
/// Returns an iterator to the element following the last element of the wait-list.
|
|
const_iterator end() const {
|
|
return m_events.end();
|
|
}
|
|
|
|
/// Returns an iterator to the element following the last element of the wait-list.
|
|
const_iterator cend() const {
|
|
return m_events.end();
|
|
}
|
|
|
|
private:
|
|
std::vector<event> m_events;
|
|
};
|
|
|
|
} // end compute namespace
|
|
} // end boost namespace
|
|
|
|
#endif // BOOST_COMPUTE_UTILITY_WAIT_LIST_HPP
|