1#ifndef STOCHTREE_OPENMP_UTILS_H
2#define STOCHTREE_OPENMP_UTILS_H
4#include <stochtree/common.h>
9#ifdef STOCHTREE_OPENMP_AVAILABLE
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
44inline int get_max_threads() {
return 1;}
46inline int get_thread_num() {
return 0;}
48inline int get_num_threads() {
return 1;}
50inline void set_num_threads(
int num_threads) {}
52#define STOCHTREE_PARALLEL_FOR(num_threads)
54#define STOCHTREE_REDUCTION_ADD(var)
56#define STOCHTREE_CRITICAL
60static int GetMaxThreads() {
61 return get_max_threads();
64static int GetCurrentThreadNum() {
65 return get_thread_num();
68static int GetNumThreads() {
69 return get_num_threads();
72static void SetNumThreads(
int num_threads) {
73 set_num_threads(num_threads);
76static bool IsOpenMPAvailable() {
77 return STOCHTREE_HAS_OPENMP;
80static int GetOptimalThreadCount(
int workload_size,
int min_work_per_thread = 1000) {
81 if (!IsOpenMPAvailable()) {
85 int max_threads = GetMaxThreads();
86 int optimal_threads = workload_size / min_work_per_thread;
88 return std::min(optimal_threads, max_threads);
92template<
typename Func>
93void ParallelFor(
int start,
int end,
int num_threads, Func func) {
94 if (num_threads <= 0) {
95 num_threads = GetOptimalThreadCount(end - start);
98 if (num_threads == 1 || !STOCHTREE_HAS_OPENMP) {
100 for (
int i = start; i < end; ++i) {
105 STOCHTREE_PARALLEL_FOR(num_threads)
106 for (
int i = start; i < end; ++i) {
Definition category_tracker.h:36