32 #ifndef VSMC_THREAD_THREAD_NUM_HPP
33 #define VSMC_THREAD_THREAD_NUM_HPP
58 std::size_t old_num = thread_num_;
64 template <
typename Range>
65 std::vector<Range>
partition (
const Range &range)
const
67 typedef typename Range::const_iterator size_type;
68 size_type N = range.end() - range.begin();
69 size_type tn =
static_cast<size_type
>(
thread_num());
70 size_type block_size = 0;
75 block_size = N / tn + 1;
79 std::vector<Range> range_vec;
81 size_type B = range.begin();
83 size_type next = N < block_size ? N : block_size;
84 range_vec.push_back(Range(B, B + next));
94 std::size_t thread_num_;
97 static_cast<
std::size_t>(1) >
98 static_cast<
std::size_t>(
std::thread::hardware_concurrency()) ?
99 static_cast<
std::size_t>(1) :
100 static_cast<
std::size_t>(
std::thread::hardware_concurrency()))
103 #pragma warning(push)
104 #pragma warning(disable:4996)
106 const char *num_str = std::getenv(
"VSMC_THREAD_NUM");
111 int num = std::atoi(num_str);
112 thread_num_ = num > 0 ?
static_cast<std::size_t
>(num) : 1;
116 ThreadNum (
const ThreadNum &) =
delete;
117 ThreadNum &operator= (
const ThreadNum &) =
delete;
122 #endif // VSMC_THREAD_THREAD_NUM_HPP
std::size_t thread_num(std::size_t num)
Set a new number of threads, return the old number.
std::vector< Range > partition(const Range &range) const
std::size_t thread_num() const
Number of threads used by algorithms.
static ThreadNum & instance()