![]() |
A parallel algorithm is a function template described by this document which
is declared in the (inline) namespace hpx::parallel::v1
.
![]() |
Note |
---|---|
For compilers which do not support inline namespaces, all of the |
All parallel algorithms are very similar in semantics to their sequential
counterarts (as defined in the namespace
std
) with a formal template parameter
named ExecutionPolicy
. The
execution policy is generally passed as the first argument to any of the
parallel algorithms and describes the manner in which the execution of these
algorithms may be parallelized and the manner in which they apply user-provided
function objects.
The applications of function objects in parallel algorithms invoked with an execution policy object of type sequential_execution_policy execute in sequential order in the calling thread.
The applications of function objects in parallel algorithms invoked with
an execution policy object of type parallel_execution_policy
or
task_execution_policy
are permitted to execute in an unordered fashion in unspecified threads,
and indeterminately sequenced within each thread.
![]() |
Important |
---|---|
It is the caller's responsibility to ensure correctness, for example that the invocation does not introduce data races or deadlocks. |
The applications of function objects in parallel algorithms invoked with
an execution policy of type parallel_vector_execution_policy
is in HPX equivalent to the use of the execution policy
parallel_execution_policy
.
Algorithms invoked with an execution policy object of type execution_policy
execute internally
as if invoked with the contained execution policy object. An exception is
when an execution_policy
contains an
execution policy of type task_execution_policy
(which
normally turns the algorithm into its asynchronous version). In this case
the execution is semantically equivalent to the case of passing a parallel_execution_policy
contained in the execution_policy
object.
During the execution of a standard parallel algorithm, if temporary memory
resources are required by any of the algorithms and no memory are available,
the algorithm throws a std::bad_alloc
exception.
During the execution of any of the parallel algorithms, if the application of a function object terminates with an uncaught exception, the behavior of the program is determined by the type of execution policy used to invoke the algorithm:
parallel_vector_execution_policy
,
hpx::terminate
shall be called.
sequential_execution_policy
,
parallel_execution_policy
,
or task_execution_policy
the
execution of the algorithm terminates with an exception_list
exception.
All uncaught exceptions thrown during the application of user-provided
function objects shall be contained in the exception_list
.
For example, the number of invocations of the user-provided function object
in for_each is unspecified. When for_each
is executed sequentially,
only one exception will be contained in the exception_list
object.
These guarantees imply that, unless the algorithm has failed to allocate
memory and terminated with std::bad_alloc
,
all exceptions thrown during the execution of the algorithm are communicated
to the caller. It is unspecified whether an algorithm implementation will
"forge ahead" after encountering and capturing a user exception.
The algorithm may terminate with the std::bad_alloc
exception even if one or more user-provided function objects have terminated
with an exception. For example, this can happen when an algorithm fails to
allocate memory while creating or adding elements to the exception_list
object.