January 2018
Intermediate to advanced
374 pages
9h 53m
English
Using std::thread::hardware_concurrency() to determine the number of supported hardware threads, a naive implementation could look like this. Note that hardware_concurrency() might return 0 if it for some reason is undetermined, and therefore it is clamped to be at least one:
template <typename SrcIt, typename DstIt, typename Func>auto par_transform_naive(SrcIt first, SrcIt last, DstIt dst, Func f) { auto n = static_cast<size_t>(std::distance(first, last)); auto num_tasks = std::max(std::thread::hardware_concurrency(), 1); auto chunk_sz = std::max(n / num_tasks, 1); auto futures = std::vector<std::future<void>>{}; futures.reserve(num_tasks); // Invoke each chunk on a separate // task, to be executed in parallel for (size_t ...