<div dir="ltr">Hi Paul,<div><br></div><div>Oops, my bad. I've been busy with my day work and hadn't got around to write a test case for this patch, that's what caused the delay. I can try to come up with a test case later this week if you can wait.</div>
<div><br></div><div>Best regards,</div><div>Kris</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, May 5, 2014 at 8:02 AM, Paul Sandoz <span dir="ltr"><<a href="mailto:paul.sandoz@oracle.com" target="_blank">paul.sandoz@oracle.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Hi Nils,<br><br>Any update on this?<br><br>I have been looking at this area in the context of array access for JEP 193: Enhanced Volatiles (i will send another email on that later today). But I was wanted to share some initial perf results with this patch.<div>
<br></div><div>Here are the relevant snippets of benchmark code:</div><div><br></div><div><div>    private static final int N = 1 << Integer.getInteger("N", 8);</div><div>    private static final int START = (N >> 1);</div>
<div>    private static final int END = (N >> 1) + N;</div></div><div>...</div><div><br></div><div><div>    private Value value;</div><div><br></div><div>    private Value[] receiver;</div><div><br></div><div>    @Setup</div>
<div>    public void setUp() throws Exception {</div><div>        value = new ExtendedValue(1);</div><div>        receiver = new ExtendedValue[N];</div><div>        for (int i = 0; i < receiver.length; i++) {</div><div>
            receiver[i] = value;</div><div>        }</div><div>    }</div></div><div>...</div><div><div>    @GenerateMicroBenchmark</div><div>    public int relaxed_r_aa() {</div><div>        Value[] _receiver = receiver;</div>
<div>        int sum = 0;</div><div>        for (int i = START; i < END; i++) {</div><div>            int j = i & (_receiver.length - 1);</div><div>            sum += _receiver[j].i;</div><div>        }</div><div>        return sum;</div>
<div>    }</div><div><br></div><div>    @GenerateMicroBenchmark</div><div>    public Value[] relaxed_w_aa() {</div><div>        Value[] _receiver = receiver;</div><div>        for (int i = START; i < END; i++) {</div><div>
            int j = i & (_receiver.length - 1);</div><div>            _receiver[j] = value;</div><div>        }</div><div>        return _receiver;</div><div>    }</div></div><div><br></div><div><div>    @GenerateMicroBenchmark</div>
<div>    public int relaxed_r_unsafe() {</div><div>        Value[] _receiver = receiver;</div><div>        int sum = 0;</div><div>        for (int i = START; i < END; i++) {</div><div>            int j = i & (_receiver.length - 1);</div>
<div>            Value v = (Value) UNSAFE.getObject(</div><div>                    _receiver,</div><div>                    (((long) j) << UNSAFE_ARRAY_SHIFT_V) + UNSAFE_ARRAY_OFFSET_V);</div><div>            sum += v.i;</div>
<div>        }</div><div>        return sum;</div><div>    }</div><div><br></div><div>    @GenerateMicroBenchmark</div><div>    public Value[] relaxed_w_unsafe() {</div><div>        Value[] _receiver = receiver;</div><div>
        for (int i = START; i < END; i++) {</div><div>            int j = i & (_receiver.length - 1);</div><div>            UNSAFE.putObject(_receiver,</div><div>                             (((long) j) << UNSAFE_ARRAY_SHIFT_V) + UNSAFE_ARRAY_OFFSET_V,</div>
<div>                             value);</div><div>        }</div><div>        return _receiver;</div><div>    }</div></div><div><br></div><div>Here are some results on OpenJDK 9 without the patch (times are in ns/op for N=1,8,64,512, for one thread, measured on a Dell laptop with an Intel Core i5-2520 CPU @ 2.50GHz):</div>
<div><br></div><div><font face="Courier New"><div>    Benchmark                             1        8        64        512</div><div>    relaxed_r_aa                        1.304    9.128    48.599    372.214</div><div>    relaxed_r_unsafe                    1.152    6.615    44.456    348.989</div>
<div><br></div><div>    relaxed_w_aa                        3.256   16.105    76.896    599.830</div><div>    relaxed_w_unsafe                    2.888   11.553    56.037    532.179</div><div><br></div></font>Here are the results with the patch applied to hotspot (in the dev repo):<br>
<br><font face="Courier New"><div>    Benchmark                             1        8        64        512</div><div>    relaxed_r_aa                        1.291    6.664    37.604    285.830</div><div>    relaxed_r_unsafe                    1.151    6.621    44.483    348.249</div>
<div><br></div><div>    relaxed_w_aa                        3.279   12.646    66.324    481.281</div><div>    relaxed_w_unsafe                    2.888   11.549    56.028    531.589</div><div><br></div><div><br></div></font>One has to be a little careful interpreting the results since compilation of the JMH loop measurement method can monkey around with 'em (I think from OSR'ed to complete, which might be affecting how loops are unrolled, but i would need to dive into the machine code of the compiled methods to verify). However, even so this patch looks promising.</div>
<div><div><br></div><div>Paul.<br><br>On Feb 17, 2014, at 2:07 PM, Nils Eliasson <<a href="mailto:nils.eliasson@oracle.com" target="_blank">nils.eliasson@oracle.com</a>> wrote:<br><br><blockquote type="cite">Current change passes JPRT. Running bigapps and nightly code policy as well.<br>
<br>Will wait for tests and reviewer go-ahead before pushing.<br></blockquote><br></div></div></div></blockquote></div><br></div>