GRASS 8 Programmer's Manual  8.5.0dev(2025)-c070206eb1
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 int G_set_omp_num_threads(struct Option *opt)
25 {
26  /* make sure Option is not null */
27  if (opt == NULL)
28  G_fatal_error(_("Option is NULL."));
29  else if (opt->key == NULL)
30  G_fatal_error(_("Option key is NULL."));
31 
32  int threads = atoi(opt->answer);
33 #if defined(_OPENMP)
34  if (threads == 0) {
35  threads = omp_get_max_threads();
36  }
37  else {
38  int num_logic_procs = omp_get_num_procs();
39  if (threads < 1) {
40  threads += num_logic_procs;
41  threads = (threads < 1) ? 1 : threads;
42  }
43  omp_set_num_threads(threads);
44  }
45  G_verbose_message(n_("One thread is set up for parallel computing.",
46  "%d threads are set up for parallel computing.",
47  threads),
48  threads);
49 #else
50  if (!(threads == 0 || threads == 1)) {
51  G_warning(_("GRASS is not compiled with OpenMP support, parallel "
52  "computation is disabled. Only one thread will be used."));
53  }
54  threads = 1;
55 #endif
56  return threads;
57 }
#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:24
Structure that stores option information.
Definition: gis.h:563
const char * key
Definition: gis.h:564
char * answer
Definition: gis.h:577