Subject: Re: [boost] [threadpool] version 22 with default pool
From: vicente.botet (vicente.botet_at_[hidden])
Date: 2009-03-08 17:29:10


----- Original Message -----
From: "Edouard A." <edouard_at_[hidden]>
To: <boost_at_[hidden]>
Sent: Sunday, March 08, 2009 7:48 PM
Subject: Re: [boost] [threadpool] version 22 with default pool

>
> I have implemented a parallel_sort that is a bit slower than tbb with
> threadpool (see below for the code).
>
> Benchmark results:
>
> std::fill 0..1000000 ok : 1 elapsed: 0.01
> tbb::parallel_for fill 0..1000000 ok : 1 elapsed: 0.01
> std::sort reverse 0..1000000 ok : 1 elapsed: 0.11
> tbb::parallel_sort reverse 0..1000000 ok : 1 elapsed: 0.037
> boost::tp::sort reverse 0..1000000 ok : 1 elapsed: 0.048
>
> Machine: Q6600 - 4 GiB Ram - Running Vista 64 - x64 release build with full
> optimizations.
>
> Some remarks:
>
> * shutdown() renders the thread pool unusable (marks it terminated). This
> is not what I was looking for. Ideally, a wait() method that just waits for
> the pool to have no tasks left to process would be better. I would find it
> cumbersome to manually wait for the result of each task. My 2c.
> * It's difficult to properly benchmark the two on my development machine
> that is probably using one core to do things background work
> * Instrumentation seems to show that the _entry method of the pool is
> extremely slow. I have not investigated further.
> * boost::tp::sort benchmark includes thread destruction... Probably eats up
> some micro secs
> * My code is probably sub-optimal
>
> The code:
>
> template <typename RandomIterator>
> RandomIterator pivot_partition(RandomIterator first, RandomIterator last)
> {
> typedef RandomIterator iterator_type;
> typedef typename iterator_type::difference_type difference_type;
> typedef typename iterator_type::value_type value_type;
>
> iterator_type pivot = first + std::distance(first, last) / 2;
>
> // we partition
> value_type pivot_value = *pivot;
>
> // we "save" the pivot in putting it to the first place
> std::iter_swap(first, pivot);
>
> // we skip the pivot otherwise the partitioning won't work as
> expected
> iterator_type par_start = first + 1;
>
> std::less<value_type> pred;
>
> pivot = std::partition(par_start, last, std::bind2nd(pred,
> pivot_value));
>
> // we restore the pivot
> std::iter_swap(--pivot, first);
>
> return pivot;
> }
>
> template <typename RandomIterator, typename Pool>
> void rec_pivot_partition(RandomIterator first, RandomIterator last, Pool &
> p)
> {
> if (std::distance(first, last) > 1000)
> {
> RandomIterator pivot = pivot_partition(first, last);
> rec_pivot_partition(first, pivot, p);
> rec_pivot_partition(pivot, last, p);
> }
> else
> {
> p.submit(boost::bind(&std::sort<iterator_type>, first,
> last));
> }
>
> };

Hi,

I don't see when the merge is done. Have you tested that the result is ordered?
Could you attach the complete file?

Thanks,
Vicente