RFR 8003981: Support Parallel Array Sorting - JEP 103
Chris Hegarty
chris.hegarty at oracle.com
Fri Dec 21 16:49:05 UTC 2012
Updated webrev/specdiff:
http://cr.openjdk.java.net/~chegar/8003981/ver.01/
I also included 'webrev_diffAgainstVer00', so you can easily see the
differences against the last webrev.
Note: I remove any reference to the threshold,MIN_ARRAY_SORT_GRAN, in
the API, given the other comments on this change.
Remi,
Thank you for the detailed review.
> in Arrays.parallelSort(TYPE[] a, int fromIndex, int toIndex),
> there is no need to have the two supplementary local variable origin and
> fence,
Agreed, and changed.
> ws is not a great better name (workspaceArray?), I had to read the code
> of ArraySortHelpers to understand.
changed to 'workspace', and removed local variable where suitable.
> ArraySortHelpers should be renamed to ArrayParallelSortHelpers.
Agreed, changed to ArraysParallelSortHelpers
> In ArraySortHelpers, all Sorter, Merger, etc. should declare only one
> field by line, currently, the formatting of the fields is weird.
Yes, formatting is a little funny since the code is very vertically
verbose. I played with a few different styles, mainly lining up multiple
declarations per line vertically, but eventually settled on the standard
vertical style. I'm not too fussed either way, but I think what we have
now is easier to read.
> In all Sorter, instead of calling Arrays.sort(), you should call
> DualPivotQuicksort.sort to avoid unnecessary range checks.
Yes, I see your point. The implementation note in the spec says
Arrays.sort, but I think this suggestion is good. I made the change, and
since DualPivotQuicksort.sort is inclusive of toIndex/right -1 from
toIndex/right.
> In compute() of Sorter and Merger, you should copy a and w in local
> variables (a = this.a) to help the VM to figure out that they never
> changed,
> it will also reduce the bytecode size.
Yes final local variable where possible.
> In Sorter.compute, n should be loaded in a local field,
> int l = origin;
> int g = gran;
> int n = this.n;
same as above.
> In Merger.compute, the sequence of inits before the second while
should be:
> int l = lo;
> int lFence = l + nleft; // instead of lo + nleft
> int r = ro;
> int rFence = r + nright; // instead of ro + nright
> int k = wo;
> it should not changed the performance but it's more inline with the
> coding style of the rest of the code IMO.
Agreed, and changed.
-Chris.
On 12/21/2012 11:19 AM, Remi Forax wrote:
> On 12/20/2012 06:31 PM, Chris Hegarty wrote:
>> This is a review request for the addition of utility methods to
>> java.util.Arrays that provide sorting of arrays in parallel, JEP 103 [1].
>>
>> Webrev:
>> http://cr.openjdk.java.net/~chegar/8003981/ver.00/
>>
>> Current sorting implementations provided by the Java Collections
>> Framework (Collections.sort and Arrays.sort) all perform the sorting
>> operation sequentially in the calling thread. This enhancement will
>> offer the same set of sorting operations currently provided by the
>> Arrays class, but with a parallel implementation that utilizes the
>> Fork/Join framework. These new API’s are still synchronous with regard
>> to the calling thread as it will not proceed past the sorting
>> operation until the parallel sort is complete.
>>
>> The actual sorting API this proposal adds will leverage the
>> ForkJoinPool.commonPool (default Fork/Join pool defined as part of JEP
>> 155). The sorting algorithm is that used in Doug Lea’s ParallelArray
>> implementation.
>>
>> This work was originally done over in the lambda/lambda repo by David
>> Holmes, and is now being cleaned up and brought into jdk8.
>>
>> Open issues/differences from version in lambda:
>> 1) Is is necessary for MIN_ARRAY_SORT_GRAN to be in the public API?
>> It is an implementation detail (easy to remove).
>> 2) The use of FJP.commonPool is an implementation detail, not
>> part of the spec. Should not be a problem, just worth pointing
>> out, as it differs from what is in lambda/lambda.
>>
>> -Chris.
>>
>> [1] http://openjdk.java.net/jeps/103
>
> Hi Chris,
> in Arrays.parallelSort(TYPE[] a, int fromIndex, int toIndex),
> there is no need to have the two supplementary local variable origin and
> fence,
> ws is not a great better name (workspaceArray?), I had to read the code
> of ArraySortHelpers to understand.
>
> ArraySortHelpers should be renamed to ArrayParallelSortHelpers.
>
> In ArraySortHelpers, all Sorter, Merger, etc. should declare only one
> field by line, currently, the formatting of the fields is weird.
>
> In all Sorter, instead of calling Arrays.sort(), you should call
> DualPivotQuicksort.sort to avoid unnecessary range checks.
>
> In compute() of Sorter and Merger, you should copy a and w in local
> variables (a = this.a) to help the VM to figure out that they never
> changed,
> it will also reduce the bytecode size.
>
> In Sorter.compute, n should be loaded in a local field,
> int l = origin;
> int g = gran;
> int n = this.n;
>
> In Merger.compute, the sequence of inits before the second while should be:
> int l = lo;
> int lFence = l + nleft; // instead of lo + nleft
> int r = ro;
> int rFence = r + nright; // instead of ro + nright
> int k = wo;
> it should not changed the performance but it's more inline with the
> coding style of the rest of the code IMO.
>
> cheers,
> Rémi
>
More information about the core-libs-dev
mailing list