aGrUM 2.3.2
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-2025 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-2025 *
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(Idx beg, Idx end, unsigned int nb_threads) {
77 // there should always be at least one thread
78 const auto real_nb_threads = nb_threads < 1 ? Idx(1) : Idx(nb_threads);
79 const Idx range_size = end - beg;
80 std::vector< std::pair< Idx, Idx > > result;
81 result.reserve(real_nb_threads);
82
83 // if the number of elements in the range is lower than or equal to the
84 // number of threads, assign only one element per thread
85 if (range_size <= real_nb_threads) {
86 for (Idx i = Idx(0); i < range_size; ++i) {
87 result.emplace_back(i, i + 1);
88 }
89 for (Idx i = range_size; i < real_nb_threads; ++i)
90 result.emplace_back(range_size, range_size);
91 } else {
92 // here there are more elements in the range than threads. So try to balance
93 // the number of elements among the threads
94 Idx nb_elts_par_thread = range_size / real_nb_threads;
95 Idx rest_elts = range_size - nb_elts_par_thread * real_nb_threads;
96
97 Idx begin_index = beg;
98 for (Idx i = Idx(0); i < real_nb_threads; ++i) {
99 Idx end_index = begin_index + nb_elts_par_thread;
100 if (rest_elts != Idx(0)) {
101 ++end_index;
102 --rest_elts;
103 }
104 result.emplace_back(begin_index, end_index);
105 begin_index = end_index;
106 }
107 }
108
109 return result;
110 }
111
112} // 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(Idx beg, Idx end, 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.