6 #ifndef XGBOOST_COMMON_THREADING_UTILS_H_
7 #define XGBOOST_COMMON_THREADING_UTILS_H_
9 #include <dmlc/common.h>
12 #include "xgboost/logging.h"
70 template<
typename Func>
72 for (
size_t i = 0; i < dim1; ++i) {
73 const size_t size = getter_size_dim2(i);
74 const size_t n_blocks = size/grain_size + !!(size % grain_size);
75 for (
size_t iblock = 0; iblock < n_blocks; ++iblock) {
76 const size_t begin = iblock * grain_size;
77 const size_t end = std::min(begin + grain_size, size);
78 AddBlock(i, begin, end);
85 return ranges_.size();
90 CHECK_LT(i, first_dimension_.size());
91 return first_dimension_[i];
96 CHECK_LT(i, ranges_.size());
101 void AddBlock(
size_t first_dimension,
size_t begin,
size_t end) {
102 first_dimension_.push_back(first_dimension);
103 ranges_.emplace_back(begin, end);
106 std::vector<Range1d> ranges_;
107 std::vector<size_t> first_dimension_;
112 template <
typename Func>
114 const size_t num_blocks_in_space = space.
Size();
115 nthreads = std::min(nthreads, omp_get_max_threads());
116 nthreads = std::max(nthreads, 1);
118 dmlc::OMPException exc;
119 #pragma omp parallel num_threads(nthreads)
122 size_t tid = omp_get_thread_num();
124 num_blocks_in_space / nthreads + !!(num_blocks_in_space % nthreads);
126 size_t begin = chunck_size * tid;
127 size_t end = std::min(begin + chunck_size, num_blocks_in_space);
128 for (
auto i = begin; i < end; i++) {
136 template <
typename Index,
typename Func>
138 dmlc::OMPException exc;
139 #pragma omp parallel for num_threads(nthreads) schedule(static)
140 for (
Index i = 0; i < size; ++i) {
146 template <
typename Index,
typename Func>
159 auto& threads = *p_threads;
160 int32_t nthread_original = omp_get_max_threads();
162 threads = omp_get_num_procs();
164 omp_set_num_threads(threads);
165 return nthread_original;
168 auto& threads = *p_threads;
169 int32_t nthread_original = omp_get_max_threads();
171 threads = nthread_original;
173 omp_set_num_threads(threads);
174 return nthread_original;
180 #endif // XGBOOST_COMMON_THREADING_UTILS_H_