aGrUM 3.1.1
a C++ library for (probabilistic) graphical models
threads.cpp
Go to the documentation of this file.
1/****************************************************************************
2 * This file is part of the aGrUM/pyAgrum library. *
3 * *
4 * Copyright (c) 2005-2026 by *
5 * - Pierre-Henri WUILLEMIN(_at_LIP6) *
6 * - Christophe GONZALES(_at_AMU) *
7 * *
8 * The aGrUM/pyAgrum library is free software; you can redistribute it *
9 * and/or modify it under the terms of either : *
10 * *
11 * - the GNU Lesser General Public License as published by *
12 * the Free Software Foundation, either version 3 of the License, *
13 * or (at your option) any later version, *
14 * - the MIT license (MIT), *
15 * - or both in dual license, as here. *
16 * *
17 * (see https://agrum.gitlab.io/articles/dual-licenses-lgplv3mit.html) *
18 * *
19 * This aGrUM/pyAgrum library is distributed in the hope that it will be *
20 * useful, but WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, *
21 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES MERCHANTABILITY or FITNESS *
22 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
26 * OTHER DEALINGS IN THE SOFTWARE. *
27 * *
28 * See LICENCES for more details. *
29 * *
30 * SPDX-FileCopyrightText: Copyright 2005-2026 *
31 * - Pierre-Henri WUILLEMIN(_at_LIP6) *
32 * - Christophe GONZALES(_at_AMU) *
33 * SPDX-License-Identifier: LGPL-3.0-or-later OR MIT *
34 * *
35 * Contact : info_at_agrum_dot_org *
36 * homepage : http://agrum.gitlab.io *
37 * gitlab : https://gitlab.com/agrumery/agrum *
38 * *
39 ****************************************************************************/
40
41
47
48#include <agrum/agrum.h>
49
51
52namespace gum {
53
54 // Set the number of threads to be used in the next parallel region
55 void setNumberOfThreads(unsigned int number) {
56 if (number == 0) { number = 1; }
57
59
60#ifdef _OPENMP
62#endif
63 }
64
65 // indicates whether aGrUM uses openMP or STL threads
66 bool isOMP() {
67#ifdef GUM_THREADS_USE_OMP
68 return true;
69#else
70 return false;
71#endif
72 }
73
74 // returns a vector equally splitting elements of a range among threads
75 std::vector< std::pair< Idx, Idx > >
76 dispatchRangeToThreads(const Idx beg, const Idx end, const unsigned int nb_threads) {
77 // there should always be at least one thread
78 const auto real_nb_threads
79 = nb_threads < 1 ? static_cast< Idx >(1) : static_cast< Idx >(nb_threads);
80 const Idx range_size = end - beg;
81 std::vector< std::pair< Idx, Idx > > result;
82 result.reserve(real_nb_threads);
83
84 // if the number of elements in the range is lower than or equal to the
85 // number of threads, assign only one element per thread
86 if (range_size <= real_nb_threads) {
87 for (Idx i = static_cast< Idx >(0); i < range_size; ++i) {
88 result.emplace_back(i, i + 1);
89 }
90 for (Idx i = range_size; i < real_nb_threads; ++i) {
91 result.emplace_back(range_size, range_size);
92 }
93 } else {
94 // here there are more elements in the range than threads. So try to balance
95 // the number of elements among the threads
96 Idx nb_elts_par_thread = range_size / real_nb_threads;
97 Idx rest_elts = range_size - nb_elts_par_thread * real_nb_threads;
98
99 Idx begin_index = beg;
100 for (Idx i = static_cast< Idx >(0); i < real_nb_threads; ++i) {
101 Idx end_index = begin_index + nb_elts_par_thread;
102 if (rest_elts != static_cast< Idx >(0)) {
103 ++end_index;
104 --rest_elts;
105 }
106 result.emplace_back(begin_index, end_index);
107 begin_index = end_index;
108 }
109 }
110
111 return result;
112 }
113
114} // namespace gum
void setNumberOfThreads(unsigned int number)
Set the max number of threads to be used when entering the next parallel region.
Definition threads.cpp:55
void setNumberOfThreads(unsigned int number)
Set the max number of threads to be used when entering the next parallel region.
void setNumberOfThreads(unsigned int number)
Set the number of threads to be used when entering the next parallel region.
Size Idx
Type for indexes.
Definition types.h:79
gum is the global namespace for all aGrUM entities
Definition agrum.h:46
bool isOMP()
indicates whether aGrUM uses openMP or STL threads
Definition threads.cpp:66
std::vector< std::pair< Idx, Idx > > dispatchRangeToThreads(const Idx beg, const Idx end, const unsigned int nb_threads)
returns a vector equally splitting elements of a range among threads
Definition threads.cpp:76
Utility functions used for exploiting OpenMP/STL parallelism.