Optimization question
Krystal Mok
rednaxelafx at gmail.com
Thu Dec 24 01:33:06 UTC 2015
Hi Vitaly,
For 2), there's this bug [1] which isn't really fixed, but rather, the
"skip zeroing of an array fully covered by a Arrays.fill()" optimization
was turned off for the moment.
For 1), if all methods are inlined as expected, I believe it's because of
HotSpot C2's order of optimizations: escape analysis / scalar replacement
happens before loop optimizations. The latter can fully unroll your loop in
mean(double[] array, double[] weights) if the input array is a constant
like the one you tested, but it's too late -- the former cannot scalar
replace an array if there are stores to it with unknown indices. See [2]
for more details.
- Kris
[1]: https://bugs.openjdk.java.net/browse/JDK-7196857
[2]: ConnectionGraph::adjust_scalar_replaceable_state() in opto/escape.cpp
// 3. An object is not scalar replaceable if it has a field with unknown
// offset (array's element is accessed in loop).
On Wed, Dec 23, 2015 at 4:56 PM, Vitaly Davidovich <vitalyd at gmail.com>
wrote:
> Hi guys,
>
> Consider code like this:
>
> static double mean(double[] array, double[] weights) {
> if (array.length != weights.length) throw ...;
> double sum = 0;
> double wsum = 0;
> for(int i = 0; i < array.length; i++) {
> sum += array[i] * weights[i];
> wsum += weights[i];
> }
> return sum / wsum;
> }
>
> static double mean(double[] array) {
> return mean(array, allOnes(array.length));
> }
>
> static double[] allOnes(int n) {
> double[] d = new double[n];
> Arrays.fill(d, 1);
> return d;
> }
>
> Now suppose I call mean(double[]) overload like this:
>
> double[] d = {1,2,3,4};
>
> Using 8u51 with C2 compiler:
>
> 1) it looks like the array allocation from allOnes isn't eliminated.
> 2) moreover it looked like array was zeroed (rep stosd with rax holding
> zero). Unless I misread the asm, I thought an allocation followed by
> Arrays.fill skips the zeroing?
> 3) ideally, this case would reduce to code that just does a plain
> unweighted mean with no multiplication by the weight and no summation for the
> weighted sum (weight sum is just array length). Is this simply too much
> analysis to ask for?
>
> Thanks
>
>
> --
> Sent from my phone
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20151223/70335a44/attachment.html>
More information about the hotspot-compiler-dev
mailing list