GRASS GIS 8 Programmer's Manual  8.5.0dev(2025)-93f69d1f13
omp_threads.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 
5 #if defined(_OPENMP)
6 #include <omp.h>
7 #endif
8 
9 #include <grass/gis.h>
10 #include <grass/glocale.h>
11 
12 /*! \brief Set the number of threads for OpenMP
13  The intended usage is at the beginning of a C tool when parameters are
14  processed, namely the G_OPT_M_NPROCS standard option.
15 
16  If \em nprocs is set to 0, default OpenMP internal logic is used.
17  If \em nprocs is a positive number, specified number of threads is used.
18  If \em nprocs is a negative number, then <em>maximum threads - number</em>
19  is used instead (e.g. to keep \em number of cores free for other use.
20 
21  \param opt A nprocs Option struct to specify the number of threads
22  \return the number of threads set up for OpenMP parallel computing
23 */
24 
25 int G_set_omp_num_threads(struct Option *opt)
26 {
27  /* make sure Option is not null */
28  if (opt == NULL)
29  G_fatal_error(_("Option is NULL."));
30  else if (opt->key == NULL)
31  G_fatal_error(_("Option key is NULL."));
32 
33  int threads = atoi(opt->answer);
34 #if defined(_OPENMP)
35  if (threads == 0) {
36  threads = omp_get_max_threads();
37  }
38  else {
39  int num_logic_procs = omp_get_num_procs();
40  if (threads < 1) {
41  threads += num_logic_procs;
42  threads = (threads < 1) ? 1 : threads;
43  }
44  omp_set_num_threads(threads);
45  }
46  G_verbose_message(n_("One thread is set up for parallel computing.",
47  "%d threads are set up for parallel computing.",
48  threads),
49  threads);
50 #else
51  if (!(threads == 0 || threads == 1)) {
52  G_warning(_("GRASS is not compiled with OpenMP support, parallel "
53  "computation is disabled. Only one thread will be used."));
54  }
55  threads = 1;
56 #endif
57  return threads;
58 }
#define NULL
Definition: ccmath.h:32
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
void G_warning(const char *,...) __attribute__((format(printf
void void G_verbose_message(const char *,...) __attribute__((format(printf
#define n_(strs, strp, num)
Definition: glocale.h:11
#define _(str)
Definition: glocale.h:10
int G_set_omp_num_threads(struct Option *opt)
Set the number of threads for OpenMP The intended usage is at the beginning of a C tool when paramete...
Definition: omp_threads.c:25
Structure that stores option information.
Definition: gis.h:563
const char * key
Definition: gis.h:564
char * answer
Definition: gis.h:577