20#ifndef OPM_CREATETHREADITERATORS_HEADER_INCLUDED
21#define OPM_CREATETHREADITERATORS_HEADER_INCLUDED
47 template <
class Range>
49 const std::size_t num_elem,
50 const std::size_t num_chunks)
53 throw std::logic_error(
"createChunkIterators() must create at least one chunk.");
55 std::vector<
decltype(std::begin(r))> chunk_iterators;
56 auto it = std::begin(r);
57 const auto end = std::end(r);
58 if (num_chunks == 1) {
59 chunk_iterators.push_back(it);
60 chunk_iterators.push_back(end);
62 const auto chunk_size = std::max(num_elem / num_chunks, 1ul);
63 chunk_iterators.reserve(num_chunks + 1);
66 for (std::size_t count = 0, num_pushed = 0; it != end; ++it, ++count) {
67 if (count % chunk_size == 0) {
68 chunk_iterators.push_back(it);
70 if (num_pushed == num_chunks) {
79 for (std::size_t extra = chunk_iterators.size(); extra < num_chunks + 1; ++extra) {
80 chunk_iterators.push_back(end);
82 assert(chunk_iterators.size() == num_chunks + 1);
84 return chunk_iterators;
105 template <
class Range>
107 const std::size_t num_elem,
108 const std::size_t num_threads,
109 const std::size_t max_chunk_size,
112 if (num_threads < 1) {
113 throw std::logic_error(
"createThreadIterators() called with num_threads arguments = "
114 + std::to_string(num_threads));
116 std::vector<
decltype(std::begin(r))> chunk_iterators;
117 auto it = std::begin(r);
118 const auto end = std::end(r);
119 if (num_threads == 1) {
120 chunk_iterators.push_back(it);
121 chunk_iterators.push_back(end);
123 chunk_size =
static_cast<int>(std::clamp(num_elem / num_threads, 1ul, max_chunk_size));
124 chunk_iterators.reserve(num_elem / chunk_size + 2);
125 for (
int count = 0; it != end; ++it, ++count) {
126 if (count % chunk_size == 0) {
127 chunk_iterators.push_back(it);
130 chunk_iterators.push_back(end);
132 return chunk_iterators;
138 template <
class Gr
idView>
140 const std::size_t num_threads,
141 const std::size_t max_chunk_size,
Holds the implementation of the CpGrid as a pimple.
Definition: CellQuadrature.hpp:26
auto createChunkIterators(const Range &r, const std::size_t num_elem, const std::size_t num_chunks)
Definition: createThreadIterators.hpp:48
auto createThreadIterators(const Range &r, const std::size_t num_elem, const std::size_t num_threads, const std::size_t max_chunk_size, int &chunk_size)
Definition: createThreadIterators.hpp:106