This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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)
 		{

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]