Пример #1
0
        // requires traits::is_future<Future>
    std::size_t auto_chunk_size_idx(
        std::vector<Future>& workitems, F1 && f1,
        std::size_t& base_idx, FwdIter& first, std::size_t& count)
    {
        std::size_t test_chunk_size = count / 100;
        if (0 == test_chunk_size) return 0;

        boost::uint64_t t = hpx::util::high_resolution_clock::now();
        add_ready_future_idx(workitems, f1, base_idx, first, test_chunk_size);

        t = (hpx::util::high_resolution_clock::now() - t) / test_chunk_size;

        base_idx += test_chunk_size;
        std::advance(first, test_chunk_size);
        count -= test_chunk_size;

        // return chunk size which will create 80 microseconds of work
        return t == 0 ? 0 : (std::min)(count, (std::size_t)(80000 / t));
    }
Пример #2
0
        // requires traits::is_future<Future>
    std::vector<hpx::util::tuple<std::size_t, FwdIter, std::size_t > >
    get_bulk_iteration_shape_idx(
        ExPolicy policy, std::vector<Future>& workitems, F1 && f1,
        std::size_t& base_idx, FwdIter& first, std::size_t& count,
        std::size_t chunk_size)
    {
        typedef typename ExPolicy::executor_parameters_type parameters_type;
        typedef executor_parameter_traits<parameters_type> traits;
        typedef hpx::util::tuple<std::size_t, FwdIter, std::size_t> tuple_type;

        bool variable_chunk_sizes = traits::variable_chunk_size(
            policy.parameters(), policy.executor());

        std::vector<tuple_type> shape;

        if (!variable_chunk_sizes || chunk_size != 0)
        {
            if (chunk_size == 0)
            {
                auto test_function =
                    [&]() -> std::size_t
                    {
                        std::size_t test_chunk_size = count / 100;
                        if (test_chunk_size == 0)
                            return 0;

                        add_ready_future_idx(workitems, f1, base_idx, first,
                            test_chunk_size);

                        base_idx += test_chunk_size;
                        std::advance(first, test_chunk_size);
                        count -= test_chunk_size;

                        return test_chunk_size;
                    };

                chunk_size = traits::get_chunk_size(policy.parameters(),
                    policy.executor(), test_function, count);
            }

            shape.reserve(count / (chunk_size + 1));
            while (count != 0)
            {
                std::size_t chunk = (std::min)(chunk_size, count);

                shape.push_back(hpx::util::make_tuple(base_idx, first, chunk));

                count -= chunk;
                std::advance(first, chunk);
                base_idx += chunk;
            }
        }
        else
        {
            while (count != 0)
            {
                chunk_size = traits::get_chunk_size(
                    policy.parameters(), policy.executor(),
                    [](){ return 0; }, count);

                std::size_t chunk = (std::min)(chunk_size, count);

                shape.push_back(hpx::util::make_tuple(base_idx, first, chunk));
                count -= chunk;
                std::advance(first, chunk);
                base_idx += chunk;
            }
        }

        return shape;
    }