libstdc++
for_each.h
Go to the documentation of this file.
1// -*- C++ -*-
2
3// Copyright (C) 2007-2021 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the terms
7// of the GNU General Public License as published by the Free Software
8// Foundation; either version 3, or (at your option) any later
9// version.
10
11// This library is distributed in the hope that it will be useful, but
12// WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14// General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file parallel/for_each.h
26 * @brief Main interface for embarrassingly parallel functions.
27 *
28 * The explicit implementation are in other header files, like
29 * workstealing.h, par_loop.h, omp_loop.h, and omp_loop_static.h.
30 * This file is a GNU parallel extension to the Standard C++ Library.
31 */
32
33// Written by Felix Putze.
34
35#ifndef _GLIBCXX_PARALLEL_FOR_EACH_H
36#define _GLIBCXX_PARALLEL_FOR_EACH_H 1
37
38#include <parallel/settings.h>
39#include <parallel/par_loop.h>
40#include <parallel/omp_loop.h>
42
43namespace __gnu_parallel
44{
45 /** @brief Chose the desired algorithm by evaluating @c __parallelism_tag.
46 * @param __begin Begin iterator of input sequence.
47 * @param __end End iterator of input sequence.
48 * @param __user_op A user-specified functor (comparator, predicate,
49 * associative operator,...)
50 * @param __functionality functor to @a process an element with
51 * __user_op (depends on desired functionality, e. g. accumulate,
52 * for_each,...
53 * @param __reduction Reduction functor.
54 * @param __reduction_start Initial value for reduction.
55 * @param __output Output iterator.
56 * @param __bound Maximum number of elements processed.
57 * @param __parallelism_tag Parallelization method */
58 template<typename _IIter, typename _UserOp,
59 typename _Functionality, typename _Red, typename _Result>
60 _UserOp
61 __for_each_template_random_access(_IIter __begin, _IIter __end,
62 _UserOp __user_op,
63 _Functionality& __functionality,
64 _Red __reduction,
65 _Result __reduction_start,
66 _Result& __output, typename
68 difference_type __bound,
69 _Parallelism __parallelism_tag)
70 {
71 if (__parallelism_tag == parallel_unbalanced)
73 (__begin, __end, __user_op, __functionality, __reduction,
74 __reduction_start, __output, __bound);
75 else if (__parallelism_tag == parallel_omp_loop)
77 (__begin, __end, __user_op, __functionality, __reduction,
78 __reduction_start, __output, __bound);
79 else if (__parallelism_tag == parallel_omp_loop_static)
81 (__begin, __end, __user_op, __functionality, __reduction,
82 __reduction_start, __output, __bound);
83 else //e. g. parallel_balanced
85 (__begin, __end, __user_op, __functionality, __reduction,
86 __reduction_start, __output, __bound);
87 }
88}
89
90#endif /* _GLIBCXX_PARALLEL_FOR_EACH_H */
Runtime settings and tuning parameters, heuristics to decide whether to use parallelized algorithms.
Parallelization of embarrassingly parallel execution by means of an OpenMP for loop....
Parallelization of embarrassingly parallel execution by means of work-stealing.
Parallelization of embarrassingly parallel execution by means of equal splitting. This file is a GNU ...
GNU parallel code for public use.
_UserOp __for_each_template_random_access(_IIter __begin, _IIter __end, _UserOp __user_op, _Functionality &__functionality, _Red __reduction, _Result __reduction_start, _Result &__output, typename std::iterator_traits< _IIter >::difference_type __bound, _Parallelism __parallelism_tag)
Chose the desired algorithm by evaluating __parallelism_tag.
Definition for_each.h:61
_Op __for_each_template_random_access_ed(_RAIter __begin, _RAIter __end, _Op __o, _Fu &__f, _Red __r, _Result __base, _Result &__output, typename std::iterator_traits< _RAIter >::difference_type __bound)
Embarrassingly parallel algorithm for random access iterators, using hand-crafted parallelization by ...
Definition par_loop.h:67
_Op __for_each_template_random_access_workstealing(_RAIter __begin, _RAIter __end, _Op __op, _Fu &__f, _Red __r, _Result __base, _Result &__output, typename std::iterator_traits< _RAIter >::difference_type __bound)
Work stealing algorithm for random access iterators.
_Op __for_each_template_random_access_omp_loop(_RAIter __begin, _RAIter __end, _Op __o, _Fu &__f, _Red __r, _Result __base, _Result &__output, typename std::iterator_traits< _RAIter >::difference_type __bound)
Embarrassingly parallel algorithm for random access iterators, using an OpenMP for loop.
Definition omp_loop.h:67
_Parallelism
Run-time equivalents for the compile-time tags.
Definition types.h:45
@ parallel_omp_loop_static
Parallel with OpenMP static load-balancing.
Definition types.h:59
@ parallel_unbalanced
Parallel unbalanced (equal-sized chunks).
Definition types.h:50
@ parallel_omp_loop
Parallel with OpenMP dynamic load-balancing.
Definition types.h:56