2011-04-28 Paolo Carlini <paolo.carlini@oracle.com>
[gcc.git] / libstdc++-v3 / include / parallel / partial_sum.h
index 02404203f4e7793e7390bc26db22dee4b959e89b..425e868fe6bb699f2e41be80f8b24543f11b3312 100644 (file)
@@ -1,6 +1,6 @@
 // -*- C++ -*-
 
-// Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the terms
@@ -124,15 +124,18 @@ namespace __gnu_parallel
          __borders = new _DifferenceType[__num_threads + 2];
 
          if (__s.partial_sum_dilation == 1.0f)
-           equally_split(__n, __num_threads + 1, __borders);
+           __equally_split(__n, __num_threads + 1, __borders);
          else
            {
+             _DifferenceType __first_part_length =
+                 std::max<_DifferenceType>(1,
+                   __n / (1.0f + __s.partial_sum_dilation * __num_threads));
              _DifferenceType __chunk_length =
-               ((double)__n
-                / ((double)__num_threads + __s.partial_sum_dilation)),
-               __borderstart = __n - __num_threads * __chunk_length;
+                 (__n - __first_part_length) / __num_threads;
+             _DifferenceType __borderstart =
+                 __n - __num_threads * __chunk_length;
              __borders[0] = 0;
-             for (int __i = 1; __i < (__num_threads + 1); ++__i)
+             for (_ThreadIndex __i = 1; __i < (__num_threads + 1); ++__i)
                {
                  __borders[__i] = __borderstart;
                  __borderstart += __chunk_length;
@@ -158,7 +161,8 @@ namespace __gnu_parallel
         else
           {
             ::new(&(__sums[__iam]))
-              _ValueType(std::accumulate(__begin + __borders[__iam] + 1,
+              _ValueType(__gnu_parallel::accumulate(
+                                         __begin + __borders[__iam] + 1,
                                          __begin + __borders[__iam + 1],
                                          *(__begin + __borders[__iam]),
                                          __bin_op,