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