summaryrefslogtreecommitdiff
path: root/inference-engine/thirdparty/clDNN/common/boost/1.64.0/include/boost-1_64/boost/mpi/nonblocking.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'inference-engine/thirdparty/clDNN/common/boost/1.64.0/include/boost-1_64/boost/mpi/nonblocking.hpp')
-rw-r--r--inference-engine/thirdparty/clDNN/common/boost/1.64.0/include/boost-1_64/boost/mpi/nonblocking.hpp738
1 files changed, 0 insertions, 738 deletions
diff --git a/inference-engine/thirdparty/clDNN/common/boost/1.64.0/include/boost-1_64/boost/mpi/nonblocking.hpp b/inference-engine/thirdparty/clDNN/common/boost/1.64.0/include/boost-1_64/boost/mpi/nonblocking.hpp
deleted file mode 100644
index 1fc1ecd03..000000000
--- a/inference-engine/thirdparty/clDNN/common/boost/1.64.0/include/boost-1_64/boost/mpi/nonblocking.hpp
+++ /dev/null
@@ -1,738 +0,0 @@
-// Copyright (C) 2006 Douglas Gregor <doug.gregor -at- gmail.com>.
-
-// Use, modification and distribution is subject to 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)
-
-/** @file nonblocking.hpp
- *
- * This header defines operations for completing non-blocking
- * communication requests.
- */
-#ifndef BOOST_MPI_NONBLOCKING_HPP
-#define BOOST_MPI_NONBLOCKING_HPP
-
-#include <boost/mpi/config.hpp>
-#include <vector>
-#include <iterator> // for std::iterator_traits
-#include <boost/optional.hpp>
-#include <utility> // for std::pair
-#include <algorithm> // for iter_swap, reverse
-#include <boost/static_assert.hpp>
-#include <boost/mpi/request.hpp>
-#include <boost/mpi/status.hpp>
-#include <boost/mpi/exception.hpp>
-
-namespace boost { namespace mpi {
-
-/**
- * @brief Wait until any non-blocking request has completed.
- *
- * This routine takes in a set of requests stored in the iterator
- * range @c [first,last) and waits until any of these requests has
- * been completed. It provides functionality equivalent to
- * @c MPI_Waitany.
- *
- * @param first The iterator that denotes the beginning of the
- * sequence of request objects.
- *
- * @param last The iterator that denotes the end of the sequence of
- * request objects. This may not be equal to @c first.
- *
- * @returns A pair containing the status object that corresponds to
- * the completed operation and the iterator referencing the completed
- * request.
- */
-template<typename ForwardIterator>
-std::pair<status, ForwardIterator>
-wait_any(ForwardIterator first, ForwardIterator last)
-{
- using std::advance;
-
- BOOST_ASSERT(first != last);
-
- typedef typename std::iterator_traits<ForwardIterator>::difference_type
- difference_type;
-
- bool all_trivial_requests = true;
- difference_type n = 0;
- ForwardIterator current = first;
- while (true) {
- // Check if we have found a completed request. If so, return it.
- if (current->m_requests[0] != MPI_REQUEST_NULL &&
- (current->m_requests[1] != MPI_REQUEST_NULL ||
- current->m_handler)) {
- if (optional<status> result = current->test())
- return std::make_pair(*result, current);
- }
-
- // Check if this request (and all others before it) are "trivial"
- // requests, e.g., they can be represented with a single
- // MPI_Request.
- all_trivial_requests =
- all_trivial_requests
- && !current->m_handler
- && current->m_requests[1] == MPI_REQUEST_NULL;
-
- // Move to the next request.
- ++n;
- if (++current == last) {
- // We have reached the end of the list. If all requests thus far
- // have been trivial, we can call MPI_Waitany directly, because
- // it may be more efficient than our busy-wait semantics.
- if (all_trivial_requests) {
- std::vector<MPI_Request> requests;
- requests.reserve(n);
- for (current = first; current != last; ++current)
- requests.push_back(current->m_requests[0]);
-
- // Let MPI wait until one of these operations completes.
- int index;
- status stat;
- BOOST_MPI_CHECK_RESULT(MPI_Waitany,
- (n, &requests[0], &index, &stat.m_status));
-
- // We don't have a notion of empty requests or status objects,
- // so this is an error.
- if (index == MPI_UNDEFINED)
- boost::throw_exception(exception("MPI_Waitany", MPI_ERR_REQUEST));
-
- // Find the iterator corresponding to the completed request.
- current = first;
- advance(current, index);
- current->m_requests[0] = requests[index];
- return std::make_pair(stat, current);
- }
-
- // There are some nontrivial requests, so we must continue our
- // busy waiting loop.
- n = 0;
- current = first;
- all_trivial_requests = true;
- }
- }
-
- // We cannot ever get here
- BOOST_ASSERT(false);
-}
-
-/**
- * @brief Test whether any non-blocking request has completed.
- *
- * This routine takes in a set of requests stored in the iterator
- * range @c [first,last) and tests whether any of these requests has
- * been completed. This routine is similar to @c wait_any, but will
- * not block waiting for requests to completed. It provides
- * functionality equivalent to @c MPI_Testany.
- *
- * @param first The iterator that denotes the beginning of the
- * sequence of request objects.
- *
- * @param last The iterator that denotes the end of the sequence of
- * request objects.
- *
- * @returns If any outstanding requests have completed, a pair
- * containing the status object that corresponds to the completed
- * operation and the iterator referencing the completed
- * request. Otherwise, an empty @c optional<>.
- */
-template<typename ForwardIterator>
-optional<std::pair<status, ForwardIterator> >
-test_any(ForwardIterator first, ForwardIterator last)
-{
- while (first != last) {
- // Check if we have found a completed request. If so, return it.
- if (optional<status> result = first->test()) {
- return std::make_pair(*result, first);
- }
- ++first;
- }
-
- // We found nothing
- return optional<std::pair<status, ForwardIterator> >();
-}
-
-/**
- * @brief Wait until all non-blocking requests have completed.
- *
- * This routine takes in a set of requests stored in the iterator
- * range @c [first,last) and waits until all of these requests have
- * been completed. It provides functionality equivalent to
- * @c MPI_Waitall.
- *
- * @param first The iterator that denotes the beginning of the
- * sequence of request objects.
- *
- * @param last The iterator that denotes the end of the sequence of
- * request objects.
- *
- * @param out If provided, an output iterator through which the
- * status of each request will be emitted. The @c status objects are
- * emitted in the same order as the requests are retrieved from
- * @c [first,last).
- *
- * @returns If an @p out parameter was provided, the value @c out
- * after all of the @c status objects have been emitted.
- */
-template<typename ForwardIterator, typename OutputIterator>
-OutputIterator
-wait_all(ForwardIterator first, ForwardIterator last, OutputIterator out)
-{
- typedef typename std::iterator_traits<ForwardIterator>::difference_type
- difference_type;
-
- using std::distance;
-
- difference_type num_outstanding_requests = distance(first, last);
-
- std::vector<status> results(num_outstanding_requests);
- std::vector<bool> completed(num_outstanding_requests);
-
- while (num_outstanding_requests > 0) {
- bool all_trivial_requests = true;
- difference_type idx = 0;
- for (ForwardIterator current = first; current != last; ++current, ++idx) {
- if (!completed[idx]) {
- if (optional<status> stat = current->test()) {
- // This outstanding request has been completed. We're done.
- results[idx] = *stat;
- completed[idx] = true;
- --num_outstanding_requests;
- all_trivial_requests = false;
- } else {
- // Check if this request (and all others before it) are "trivial"
- // requests, e.g., they can be represented with a single
- // MPI_Request.
- all_trivial_requests =
- all_trivial_requests
- && !current->m_handler
- && current->m_requests[1] == MPI_REQUEST_NULL;
- }
- }
- }
-
- // If we have yet to fulfill any requests and all of the requests
- // are trivial (i.e., require only a single MPI_Request to be
- // fulfilled), call MPI_Waitall directly.
- if (all_trivial_requests
- && num_outstanding_requests == (difference_type)results.size()) {
- std::vector<MPI_Request> requests;
- requests.reserve(num_outstanding_requests);
- for (ForwardIterator current = first; current != last; ++current)
- requests.push_back(current->m_requests[0]);
-
- // Let MPI wait until all of these operations completes.
- std::vector<MPI_Status> stats(num_outstanding_requests);
- BOOST_MPI_CHECK_RESULT(MPI_Waitall,
- (num_outstanding_requests, &requests[0],
- &stats[0]));
-
- for (std::vector<MPI_Status>::iterator i = stats.begin();
- i != stats.end(); ++i, ++out) {
- status stat;
- stat.m_status = *i;
- *out = stat;
- }
-
- return out;
- }
-
- all_trivial_requests = false;
- }
-
- return std::copy(results.begin(), results.end(), out);
-}
-
-/**
- * \overload
- */
-template<typename ForwardIterator>
-void
-wait_all(ForwardIterator first, ForwardIterator last)
-{
- typedef typename std::iterator_traits<ForwardIterator>::difference_type
- difference_type;
-
- using std::distance;
-
- difference_type num_outstanding_requests = distance(first, last);
-
- std::vector<bool> completed(num_outstanding_requests);
-
- while (num_outstanding_requests > 0) {
- bool all_trivial_requests = true;
-
- difference_type idx = 0;
- for (ForwardIterator current = first; current != last; ++current, ++idx) {
- if (!completed[idx]) {
- if (optional<status> stat = current->test()) {
- // This outstanding request has been completed.
- completed[idx] = true;
- --num_outstanding_requests;
- all_trivial_requests = false;
- } else {
- // Check if this request (and all others before it) are "trivial"
- // requests, e.g., they can be represented with a single
- // MPI_Request.
- all_trivial_requests =
- all_trivial_requests
- && !current->m_handler
- && current->m_requests[1] == MPI_REQUEST_NULL;
- }
- }
- }
-
- // If we have yet to fulfill any requests and all of the requests
- // are trivial (i.e., require only a single MPI_Request to be
- // fulfilled), call MPI_Waitall directly.
- if (all_trivial_requests
- && num_outstanding_requests == (difference_type)completed.size()) {
- std::vector<MPI_Request> requests;
- requests.reserve(num_outstanding_requests);
- for (ForwardIterator current = first; current != last; ++current)
- requests.push_back(current->m_requests[0]);
-
- // Let MPI wait until all of these operations completes.
- BOOST_MPI_CHECK_RESULT(MPI_Waitall,
- (num_outstanding_requests, &requests[0],
- MPI_STATUSES_IGNORE));
-
- // Signal completion
- num_outstanding_requests = 0;
- }
- }
-}
-
-/**
- * @brief Tests whether all non-blocking requests have completed.
- *
- * This routine takes in a set of requests stored in the iterator
- * range @c [first,last) and determines whether all of these requests
- * have been completed. However, due to limitations of the underlying
- * MPI implementation, if any of the requests refers to a
- * non-blocking send or receive of a serialized data type, @c
- * test_all will always return the equivalent of @c false (i.e., the
- * requests cannot all be finished at this time). This routine
- * performs the same functionality as @c wait_all, except that this
- * routine will not block. This routine provides functionality
- * equivalent to @c MPI_Testall.
- *
- * @param first The iterator that denotes the beginning of the
- * sequence of request objects.
- *
- * @param last The iterator that denotes the end of the sequence of
- * request objects.
- *
- * @param out If provided and all requests hav been completed, an
- * output iterator through which the status of each request will be
- * emitted. The @c status objects are emitted in the same order as
- * the requests are retrieved from @c [first,last).
- *
- * @returns If an @p out parameter was provided, the value @c out
- * after all of the @c status objects have been emitted (if all
- * requests were completed) or an empty @c optional<>. If no @p out
- * parameter was provided, returns @c true if all requests have
- * completed or @c false otherwise.
- */
-template<typename ForwardIterator, typename OutputIterator>
-optional<OutputIterator>
-test_all(ForwardIterator first, ForwardIterator last, OutputIterator out)
-{
- std::vector<MPI_Request> requests;
- for (; first != last; ++first) {
- // If we have a non-trivial request, then no requests can be
- // completed.
- if (first->m_handler || first->m_requests[1] != MPI_REQUEST_NULL)
- return optional<OutputIterator>();
-
- requests.push_back(first->m_requests[0]);
- }
-
- int flag = 0;
- int n = requests.size();
- std::vector<MPI_Status> stats(n);
- BOOST_MPI_CHECK_RESULT(MPI_Testall, (n, &requests[0], &flag, &stats[0]));
- if (flag) {
- for (int i = 0; i < n; ++i, ++out) {
- status stat;
- stat.m_status = stats[i];
- *out = stat;
- }
- return out;
- } else {
- return optional<OutputIterator>();
- }
-}
-
-/**
- * \overload
- */
-template<typename ForwardIterator>
-bool
-test_all(ForwardIterator first, ForwardIterator last)
-{
- std::vector<MPI_Request> requests;
- for (; first != last; ++first) {
- // If we have a non-trivial request, then no requests can be
- // completed.
- if (first->m_handler || first->m_requests[1] != MPI_REQUEST_NULL)
- return false;
-
- requests.push_back(first->m_requests[0]);
- }
-
- int flag = 0;
- int n = requests.size();
- BOOST_MPI_CHECK_RESULT(MPI_Testall,
- (n, &requests[0], &flag, MPI_STATUSES_IGNORE));
- return flag != 0;
-}
-
-/**
- * @brief Wait until some non-blocking requests have completed.
- *
- * This routine takes in a set of requests stored in the iterator
- * range @c [first,last) and waits until at least one of the requests
- * has completed. It then completes all of the requests it can,
- * partitioning the input sequence into pending requests followed by
- * completed requests. If an output iterator is provided, @c status
- * objects will be emitted for each of the completed requests. This
- * routine provides functionality equivalent to @c MPI_Waitsome.
- *
- * @param first The iterator that denotes the beginning of the
- * sequence of request objects.
- *
- * @param last The iterator that denotes the end of the sequence of
- * request objects. This may not be equal to @c first.
- *
- * @param out If provided, the @c status objects corresponding to
- * completed requests will be emitted through this output iterator.
-
- * @returns If the @p out parameter was provided, a pair containing
- * the output iterator @p out after all of the @c status objects have
- * been written through it and an iterator referencing the first
- * completed request. If no @p out parameter was provided, only the
- * iterator referencing the first completed request will be emitted.
- */
-template<typename BidirectionalIterator, typename OutputIterator>
-std::pair<OutputIterator, BidirectionalIterator>
-wait_some(BidirectionalIterator first, BidirectionalIterator last,
- OutputIterator out)
-{
- using std::advance;
-
- if (first == last)
- return std::make_pair(out, first);
-
- typedef typename std::iterator_traits<BidirectionalIterator>::difference_type
- difference_type;
-
- bool all_trivial_requests = true;
- difference_type n = 0;
- BidirectionalIterator current = first;
- BidirectionalIterator start_of_completed = last;
- while (true) {
- // Check if we have found a completed request.
- if (optional<status> result = current->test()) {
- using std::iter_swap;
-
- // Emit the resulting status object
- *out++ = *result;
-
- // We're expanding the set of completed requests
- --start_of_completed;
-
- if (current == start_of_completed) {
- // If we have hit the end of the list of pending
- // requests. Finish up by fixing the order of the completed
- // set to match the order in which we emitted status objects,
- // then return.
- std::reverse(start_of_completed, last);
- return std::make_pair(out, start_of_completed);
- }
-
- // Swap the request we just completed with the last request that
- // has not yet been tested.
- iter_swap(current, start_of_completed);
-
- continue;
- }
-
- // Check if this request (and all others before it) are "trivial"
- // requests, e.g., they can be represented with a single
- // MPI_Request.
- all_trivial_requests =
- all_trivial_requests
- && !current->m_handler
- && current->m_requests[1] == MPI_REQUEST_NULL;
-
- // Move to the next request.
- ++n;
- if (++current == start_of_completed) {
- if (start_of_completed != last) {
- // We have satisfied some requests. Make the order of the
- // completed requests match that of the status objects we've
- // already emitted and we're done.
- std::reverse(start_of_completed, last);
- return std::make_pair(out, start_of_completed);
- }
-
- // We have reached the end of the list. If all requests thus far
- // have been trivial, we can call MPI_Waitsome directly, because
- // it may be more efficient than our busy-wait semantics.
- if (all_trivial_requests) {
- std::vector<MPI_Request> requests;
- std::vector<int> indices(n);
- std::vector<MPI_Status> stats(n);
- requests.reserve(n);
- for (current = first; current != last; ++current)
- requests.push_back(current->m_requests[0]);
-
- // Let MPI wait until some of these operations complete.
- int num_completed;
- BOOST_MPI_CHECK_RESULT(MPI_Waitsome,
- (n, &requests[0], &num_completed, &indices[0],
- &stats[0]));
-
- // Translate the index-based result of MPI_Waitsome into a
- // partitioning on the requests.
- int current_offset = 0;
- current = first;
- for (int index = 0; index < num_completed; ++index, ++out) {
- using std::iter_swap;
-
- // Move "current" to the request object at this index
- advance(current, indices[index] - current_offset);
- current_offset = indices[index];
-
- // Emit the status object
- status stat;
- stat.m_status = stats[index];
- *out = stat;
-
- // Finish up the request and swap it into the "completed
- // requests" partition.
- current->m_requests[0] = requests[indices[index]];
- --start_of_completed;
- iter_swap(current, start_of_completed);
- }
-
- // We have satisfied some requests. Make the order of the
- // completed requests match that of the status objects we've
- // already emitted and we're done.
- std::reverse(start_of_completed, last);
- return std::make_pair(out, start_of_completed);
- }
-
- // There are some nontrivial requests, so we must continue our
- // busy waiting loop.
- n = 0;
- current = first;
- }
- }
-
- // We cannot ever get here
- BOOST_ASSERT(false);
-}
-
-/**
- * \overload
- */
-template<typename BidirectionalIterator>
-BidirectionalIterator
-wait_some(BidirectionalIterator first, BidirectionalIterator last)
-{
- using std::advance;
-
- if (first == last)
- return first;
-
- typedef typename std::iterator_traits<BidirectionalIterator>::difference_type
- difference_type;
-
- bool all_trivial_requests = true;
- difference_type n = 0;
- BidirectionalIterator current = first;
- BidirectionalIterator start_of_completed = last;
- while (true) {
- // Check if we have found a completed request.
- if (optional<status> result = current->test()) {
- using std::iter_swap;
-
- // We're expanding the set of completed requests
- --start_of_completed;
-
- // If we have hit the end of the list of pending requests, we're
- // done.
- if (current == start_of_completed)
- return start_of_completed;
-
- // Swap the request we just completed with the last request that
- // has not yet been tested.
- iter_swap(current, start_of_completed);
-
- continue;
- }
-
- // Check if this request (and all others before it) are "trivial"
- // requests, e.g., they can be represented with a single
- // MPI_Request.
- all_trivial_requests =
- all_trivial_requests
- && !current->m_handler
- && current->m_requests[1] == MPI_REQUEST_NULL;
-
- // Move to the next request.
- ++n;
- if (++current == start_of_completed) {
- // If we have satisfied some requests, we're done.
- if (start_of_completed != last)
- return start_of_completed;
-
- // We have reached the end of the list. If all requests thus far
- // have been trivial, we can call MPI_Waitsome directly, because
- // it may be more efficient than our busy-wait semantics.
- if (all_trivial_requests) {
- std::vector<MPI_Request> requests;
- std::vector<int> indices(n);
- requests.reserve(n);
- for (current = first; current != last; ++current)
- requests.push_back(current->m_requests[0]);
-
- // Let MPI wait until some of these operations complete.
- int num_completed;
- BOOST_MPI_CHECK_RESULT(MPI_Waitsome,
- (n, &requests[0], &num_completed, &indices[0],
- MPI_STATUSES_IGNORE));
-
- // Translate the index-based result of MPI_Waitsome into a
- // partitioning on the requests.
- int current_offset = 0;
- current = first;
- for (int index = 0; index < num_completed; ++index) {
- using std::iter_swap;
-
- // Move "current" to the request object at this index
- advance(current, indices[index] - current_offset);
- current_offset = indices[index];
-
- // Finish up the request and swap it into the "completed
- // requests" partition.
- current->m_requests[0] = requests[indices[index]];
- --start_of_completed;
- iter_swap(current, start_of_completed);
- }
-
- // We have satisfied some requests, so we are done.
- return start_of_completed;
- }
-
- // There are some nontrivial requests, so we must continue our
- // busy waiting loop.
- n = 0;
- current = first;
- }
- }
-
- // We cannot ever get here
- BOOST_ASSERT(false);
-}
-
-/**
- * @brief Test whether some non-blocking requests have completed.
- *
- * This routine takes in a set of requests stored in the iterator
- * range @c [first,last) and tests to see if any of the requests has
- * completed. It completes all of the requests it can, partitioning
- * the input sequence into pending requests followed by completed
- * requests. If an output iterator is provided, @c status objects
- * will be emitted for each of the completed requests. This routine
- * is similar to @c wait_some, but does not wait until any requests
- * have completed. This routine provides functionality equivalent to
- * @c MPI_Testsome.
- *
- * @param first The iterator that denotes the beginning of the
- * sequence of request objects.
- *
- * @param last The iterator that denotes the end of the sequence of
- * request objects. This may not be equal to @c first.
- *
- * @param out If provided, the @c status objects corresponding to
- * completed requests will be emitted through this output iterator.
-
- * @returns If the @p out parameter was provided, a pair containing
- * the output iterator @p out after all of the @c status objects have
- * been written through it and an iterator referencing the first
- * completed request. If no @p out parameter was provided, only the
- * iterator referencing the first completed request will be emitted.
- */
-template<typename BidirectionalIterator, typename OutputIterator>
-std::pair<OutputIterator, BidirectionalIterator>
-test_some(BidirectionalIterator first, BidirectionalIterator last,
- OutputIterator out)
-{
- BidirectionalIterator current = first;
- BidirectionalIterator start_of_completed = last;
- while (current != start_of_completed) {
- // Check if we have found a completed request.
- if (optional<status> result = current->test()) {
- using std::iter_swap;
-
- // Emit the resulting status object
- *out++ = *result;
-
- // We're expanding the set of completed requests
- --start_of_completed;
-
- // Swap the request we just completed with the last request that
- // has not yet been tested.
- iter_swap(current, start_of_completed);
-
- continue;
- }
-
- // Move to the next request.
- ++current;
- }
-
- // Finish up by fixing the order of the completed set to match the
- // order in which we emitted status objects, then return.
- std::reverse(start_of_completed, last);
- return std::make_pair(out, start_of_completed);
-}
-
-/**
- * \overload
- */
-template<typename BidirectionalIterator>
-BidirectionalIterator
-test_some(BidirectionalIterator first, BidirectionalIterator last)
-{
- BidirectionalIterator current = first;
- BidirectionalIterator start_of_completed = last;
- while (current != start_of_completed) {
- // Check if we have found a completed request.
- if (optional<status> result = current->test()) {
- using std::iter_swap;
-
- // We're expanding the set of completed requests
- --start_of_completed;
-
- // Swap the request we just completed with the last request that
- // has not yet been tested.
- iter_swap(current, start_of_completed);
-
- continue;
- }
-
- // Move to the next request.
- ++current;
- }
-
- return start_of_completed;
-}
-
-} } // end namespace boost::mpi
-
-
-#endif // BOOST_MPI_NONBLOCKING_HPP