[9] RFR (XS): 8153340: Incorrect lower bound for AllocatePrefetchDistance with AllocatePrefetchStyle=3
Zoltán Majó
zoltan.majo at oracle.com
Fri Apr 29 06:37:35 UTC 2016
Hi Vladimir,
On 04/29/2016 01:29 AM, Vladimir Kozlov wrote:
> [...]
>> JEP-245 proposed to have ranges/constraints defined for all flags.
>> Some of these ranges/constraints are unavoidably architecture-specific.
>>
>> I agree with you that having lots of #ifdefs in shared code does not
>> improve code readability. But I'm wondering what would be a good way
>> to achieve the goals of JEP-245 without using too many
>> #ifdefs. Maybe architecture-specific constraint files (e.g.,
>> commandLineFlagConstraintsCompiler_solaris.cpp,
>> commandLineFlagConstraintsCompiler_x86.cpp, etc.)?
>
> Yes, that will work.
OK, I'll keep that in mind when addressing similar problems in the future.
> [...]
>>
>> I think using BIS with AllocatePrefetchStyle=2 is indeed the cause.
>>
>> I've executed the following on our T7 machine with b115:
>> * java -XX:AllocatePrefetchStyle=2 (uses AllocatePrefetchInstr=1 by
>> default) -> crashes
>> * java -XX:AllocatePrefetchStyle=2 -XX:AllocatePrefetchInstr=0 -> works
>>
>> With the newest webrev, both commands pass.
>>
>> Here is the newest webrev:
>> http://cr.openjdk.java.net/~zmajo/8153340/webrev.03/
>
> This looks good.
Thank you for the review!
Best regards,
Zoltan
>
> Thanks,
> Vladimir
>
>>
>> I re-did testing with JPRT, the results look OK.
>>
>> Thank you!
>>
>> Best regards,
>>
>>
>> Zoltan
>>
>>>
>>> Thanks,
>>> Vladimir
>>>
>>>>
>>>> Also, AllocatePrefetchStyle = 2 seems to work fine. But to be sure,
>>>> I've started an RBT run with all hotspot on all
>>>> platforms using AllocatePrefetchStyle=2. So far no problems have
>>>> shown up.
>>>>
>>>>> And I think Abstract_VM_Version::_reserve_for_allocation_prefetch
>>>>> should be set for all styles on all platforms to
>>>>> avoid accessing beyond heap. Prefetch instructions doc say that
>>>>> they does not trap but we should be careful.
>>>>
>>>> I agree.
>>>>
>>>> That means we initialize _reserve_for_allocation_prefetch in a
>>>> platform-independent way. So I think it would make sense
>>>> to move that field to ThreadLocalAllocBuffer, as TLAB is the only
>>>> user of that field and we don't support
>>>> platform-independent initialization of Abstract_VM_Version. I did
>>>> that in the updated webrev.
>>>>
>>>>>>
>>>>>> The updated webrev does the following (in addition to fixing the
>>>>>> original problem with AllocatePrefetchDistance):
>>>>>>
>>>>>> 1. Enforce AllocatePrefetchStyle = 3 if AllocatePrefetchInstr = 1
>>>>>> (i.e., BIS instructions are used for prefetching). As
>>>>>> far as I understand, AllocatePrefetchStyle = 3 was added to
>>>>>> support prefetching with BIS, so if BIS is enabled, we
>>>>>> should use AllocatePrefetchStyle = 3.
>>>>>
>>>>> Correct - if BIS (AllocatePrefetchInstr = 1) is used we should
>>>>> select AllocatePrefetchStyle = 3.
>>>>
>>>> OK.
>>>>
>>>>> But we should allow AllocatePrefetchStyle = 3 if normal prefetch
>>>>> instructions (or other platforms) are used.
>>>>
>>>> OK, I've removed that restriction.
>>>>
>>>>> I think we should update comment in globals.hpp to say "generate
>>>>> one prefetch per cache line" without saying BIS.
>>>>
>>>> OK.
>>>>
>>>>>
>>>>> But I agree if BIS is not available we should not use BIS
>>>>> AllocatePrefetchInstr = 1.
>>>>
>>>> OK.
>>>>
>>>>>
>>>>>>
>>>>>> 2. AllocatePrefetchStyle = 3 is SPARC-specific, so disallow it on
>>>>>> non-SPARC platforms.
>>>>>
>>>>> It could be useful on other platforms since it does one access per
>>>>> cache line.
>>>>
>>>> OK, let's keep it available then.
>>>>
>>>>>
>>>>>
>>>>>>
>>>>>> 3. Enforce that AllocatePrefetchStepSize is multiple of 8 if
>>>>>> AllocatePrefetchStyle is 3 (due to alignment requirements).
>>>>>
>>>>> That is correct since stxa requires at least 8 bytes alignment (as
>>>>> stx).
>>>>
>>>> OK.
>>>>
>>>>>
>>>>>>
>>>>>> 3. Determine the number of lines to prefetch in the same way for
>>>>>> all prefetch styles:
>>>>>> lines = (prefecth instance allocation) ?
>>>>>> AllocateInstancePrefetchLines : AllocatePrefetchLines
>>>>>
>>>>> Agree.
>>>>
>>>> OK.
>>>>
>>>>>
>>>>>>
>>>>>> Here is the updated webrev:
>>>>>> http://cr.openjdk.java.net/~zmajo/8153340/webrev.01/
>>>>>
>>>>> vm_version_sparc.cpp
>>>>> AllocatePrefetchInstr = 0 should be set for all styles (not only
>>>>> 1) when BIS is not available.
>>>>
>>>> OK. I think it is sufficient to do
>>>>
>>>> 52 if (!has_blk_init()) {
>>>> 53 if (AllocatePrefetchInstr == 1) {
>>>> 54 warning("BIS instructions required for AllocatePrefetchInstr 1
>>>> unavailable");
>>>> 55 FLAG_SET_DEFAULT(AllocatePrefetchInstr, 0);
>>>> 56 } I hope I'm not missing anything here. Here is the updated webrev:
>>>> http://cr.openjdk.java.net/~zmajo/8153340/webrev.02/ Testing: -
>>>> JPRT (incl. TestOptionsWithRanges); - local testing on
>>>> SPARC; - all hotspot tests with AllocaPrefetchStyle=2 on all
>>>> platforms. Thank you! Best regards, Zoltan
>>>>
>>>>>
>>>>> Thanks,
>>>>> Vladimir
>>>>>
>>>>>>
>>>>>> Testing:
>>>>>> - JPRT (incl. TestOptionsWithRanges)
>>>>>> - local testing on a SPARC machine.
>>>>>>
>>>>>> Thank you!
>>>>>>
>>>>>> Best regards,
>>>>>>
>>>>>>
>>>>>> Zoltan
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Vladimir
>>>>>>>
>>>>>>> On 4/21/16 4:30 AM, Zoltán Majó wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>>
>>>>>>>> please review the patch for 8153340.
>>>>>>>>
>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8153340
>>>>>>>>
>>>>>>>>
>>>>>>>> Problem: The VM crashes if AllocatePrefetchStyle==3 and
>>>>>>>> AllocatePrefetchDistance==0. The crash happens due to the way
>>>>>>>> the address for the first prefetch instruction is calculated [1]:
>>>>>>>>
>>>>>>>> If distance==0, cache_addr == old_eden_top. Then, cache_adr &=
>>>>>>>> ~(AllocatePrefetchStepSize - 1) which can zero some of
>>>>>>>> the bits of cache_adr. That result in accesses *before* the
>>>>>>>> newly allocated object.
>>>>>>>>
>>>>>>>>
>>>>>>>> Solution: Set lower limit of AllocatePrefetchDistance to
>>>>>>>> AllocatePrefetchStepSize (for AllocatePrefetchStyle == 3).
>>>>>>>> Unquarantine test.
>>>>>>>>
>>>>>>>> Webrev:
>>>>>>>> http://cr.openjdk.java.net/~zmajo/8153340/webrev.00/
>>>>>>>>
>>>>>>>> Testing:
>>>>>>>> - JPRT (incl. TestOptionsWithRanges.java)
>>>>>>>> - local testing on a SPARC machine.
>>>>>>>>
>>>>>>>> Thank you!
>>>>>>>>
>>>>>>>> Best regards,
>>>>>>>>
>>>>>>>>
>>>>>>>> Zoltan
>>>>>>>>
>>>>>>>> [1]
>>>>>>>> http://hg.openjdk.java.net/jdk9/hs-comp/hotspot/file/f27c00e6f6bf/src/share/vm/opto/macro.cpp#l1941
>>>>>>
>>>>
>>
More information about the hotspot-compiler-dev
mailing list