This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[PATCH][libstdc++-v3 parallel mode] Correct part lengths calculation for parallel partial_sum
- From: Johannes Singler <singler at kit dot edu>
- To: libstdc++ <libstdc++ at gcc dot gnu dot org>, gcc-patches at gcc dot gnu dot org
- Date: Tue, 08 Jun 2010 09:21:56 +0200
- Subject: [PATCH][libstdc++-v3 parallel mode] Correct part lengths calculation for parallel partial_sum
This patch corrects the calculation of the part lengths for parallel
partial_sum, leading to the expected behavior for
partial_sum_dilation!=1, and thus better performance.
Tested x86_64-unknown-linux-gnu: No regressions.
Please approve for mainline.
2010-06-08 Johannes Singler <singler@kit.edu>
* include/parallel/partial_sum.h
(__parallel_partial_sum_linear):
Correctly calculate part lengths for partial_sum_dilation!=1.
Johannes
Index: include/parallel/partial_sum.h
===================================================================
--- include/parallel/partial_sum.h (revision 160253)
+++ include/parallel/partial_sum.h (working copy)
@@ -127,10 +127,12 @@
equally_split(__n, __num_threads + 1, __borders);
else
{
- _DifferenceType __chunk_length =
- ((double)__n
- / ((double)__num_threads + __s.partial_sum_dilation)),
- __borderstart = __n - __num_threads * __chunk_length;
+ _DifferenceType
+ __first_part_length = std::max<_DifferenceType>(1,
+ (float)__n /
+ (1.0 + __s.partial_sum_dilation * (float)__num_threads)),
+ __chunk_length = (__n - __first_part_length) / __num_threads,
+ __borderstart = __n - __num_threads * __chunk_length;
__borders[0] = 0;
for (_ThreadIndex __i = 1; __i < (__num_threads + 1); ++__i)
{