1#ifndef STOCHTREE_OPENMP_UTILS_H
2#define STOCHTREE_OPENMP_UTILS_H
4#include <stochtree/common.h>
12#define STOCHTREE_HAS_OPENMP 1
15inline int get_max_threads() {
16 return omp_get_max_threads();
19inline int get_thread_num() {
20 return omp_get_thread_num();
23inline int get_num_threads() {
24 return omp_get_num_threads();
27inline void set_num_threads(
int num_threads) {
28 omp_set_num_threads(num_threads);
31#define STOCHTREE_PARALLEL_FOR(num_threads) \
32 _Pragma("omp parallel for num_threads(num_threads)")
34#define STOCHTREE_REDUCTION_ADD(var) \
35 _Pragma("omp reduction(+:var)")
37#define STOCHTREE_CRITICAL \
38 _Pragma("omp critical")
41#define STOCHTREE_HAS_OPENMP 0
43inline int get_max_threads() {
return 1;}
45inline int get_thread_num() {
return 0;}
47inline int get_num_threads() {
return 1;}
49inline void set_num_threads(
int num_threads) {}
51#define STOCHTREE_PARALLEL_FOR(num_threads)
53#define STOCHTREE_REDUCTION_ADD(var)
55#define STOCHTREE_CRITICAL
59static int GetMaxThreads() {
60 return get_max_threads();
63static int GetCurrentThreadNum() {
64 return get_thread_num();
67static int GetNumThreads() {
68 return get_num_threads();
71static void SetNumThreads(
int num_threads) {
72 set_num_threads(num_threads);
75static bool IsOpenMPAvailable() {
76 return STOCHTREE_HAS_OPENMP;
79static int GetOptimalThreadCount(
int workload_size,
int min_work_per_thread = 1000) {
80 if (!IsOpenMPAvailable()) {
84 int max_threads = GetMaxThreads();
85 int optimal_threads = workload_size / min_work_per_thread;
87 return std::min(optimal_threads, max_threads);
91template<
typename Func>
92void ParallelFor(
int start,
int end,
int num_threads, Func func) {
93 if (num_threads <= 0) {
94 num_threads = GetOptimalThreadCount(end - start);
97 if (num_threads == 1 || !STOCHTREE_HAS_OPENMP) {
99 for (
int i = start; i < end; ++i) {
104 STOCHTREE_PARALLEL_FOR(num_threads)
105 for (
int i = start; i < end; ++i) {
Definition category_tracker.h:36