On Mon, 21 Sep 2020 09:20:56 GMT, Andrew Dinn <ad...@openjdk.org> wrote:

>>> Can you explain where this restricted effect is documented?
>> 
>> Certainly! I’ve found that determining the capability of the CPU and whether 
>> to enable AVX2 support if the chip
>> supports it is mostly controlled in: [vm_version_x86.cpp](
>> https://github.com/openjdk/jdk/blob/master/src/hotspot/cpu/x86/vm_version_x86.cpp)
>>  specifically:
>> [get_processor_features](https://github.com/openjdk/jdk/blob/master/src/hotspot/cpu/x86/vm_version_x86.cpp#L684-L755)
>> and in [generate_get_cpu_info](
>> https://github.com/openjdk/jdk/blob/master/src/hotspot/cpu/x86/vm_version_x86.cpp#L69-L611).
>>   In order to test the
>> patch comprehensively I had to track down an Intel Core i7 (I7-9750H) 
>> processor which the aforementioned code permitted
>> AVX2 instructions for (maybe this is an error and it should not be enabled 
>> for this processor though) as most of the
>> infrastructure I personally use here at AWS runs on Intel Xeon processors - 
>> I also tested on a E5-2680 which the JVM
>> does not enable AVX2 for.  However, this is just the Intel side of things. 
>> When it comes to AMD I read that the AMD Zen
>> 2 architecture, of which the current flagship: Threadripper 3990X, is based, 
>> is able to support AVX2 [without the
>> frequency scaling](
>> https://www.anandtech.com/Show/Index/14525?cPage=7&all=False&sort=0&page=9&slug=amd-zen-2-microarchitecture-analysis-ryzen-3000-and-epyc-rome)
>> which some/all(?) of the Intel chips incur. I personally don’t have access 
>> to one of these chips so I cannot confirm
>> how it is classified in the JVM.  Also, I found when investigating this that 
>> there is actually a JVM flag which can be
>> used to control what level of AVX is enabled: `-XX:UseAVX=version.`
>
>>  >    Can you explain where this restricted effect is documented?
> 
>> Certainly! I’ve found that determining the capability of the CPU and whether 
>> to enable AVX2 support if the chip
>> supports it is mostly controlled in: vm_version_x86.cpp specifically: 
>> get_processor_features and in
>> generate_get_cpu_info.
> 
> Yes, I can see what the code does. I was asking where the cpu behaviour is 
> documented independent of the code.
> 
>> In order to test the patch comprehensively I had to track down an Intel Core 
>> i7 (I7-9750H) processor which the
>> aforementioned code permitted AVX2 instructions for (maybe this is an error 
>> and it should not be enabled for this
>> processor though) as most of the infrastructure I personally use here at AWS 
>> runs on Intel Xeon processors - I also
>> tested on a E5-2680 which the JVM does not enable AVX2 for.
> 
> 'maybe'? The documentation Andrew provided mentioned Xeon E5 v3 which I 
> believe is a Skylake design. However, the code
> I pointed you at in vm_version_x86 which claims to detect 'early Skylake' 
> designs is only disabling AVX512 support. It
> still enables AVX2. Similarly, the code that generates machine code to check 
> the processor capabilities has a special
> check if use_evex is set (i.e. AVX3 is requested)  which disables AVX512 for 
> Skylake but does not disable AVX2 support.
>> However, this is just the Intel side of things. When it comes to AMD I read 
>> that the AMD Zen 2 architecture, of which
>> the current flagship: Threadripper 3990X, is based, is able to support AVX2 
>> without the frequency scaling which
>> some/all(?) of the Intel chips incur. I personally don’t have access to one 
>> of these chips so I cannot confirm how it
>> is classified in the JVM.
> 
> Well, it would be good to know where you read that and to see if that 
> confirms thar the code is avoiding the issue
> Andrew raised.
>> Also, I found when investigating this that there is actually a JVM flag 
>> which can be used to control what level of AVX
>> is enabled: -XX:UseAVX=version.
> 
> Yes, indeed. However, what I am trying to understand is whether the current 
> code is bypassing the problem Andrew
> brought up in the cases where that problem actually exists. It doesn't look 
> like it so far given that the problem
> applies to AVX2 and only AVX512 support is being disabled and, even then only 
> for some (Skylake) processors. Without
> some clear documentation of what processors suffer from this power surge 
> problem it will not be possible to decide
> whether this patch is doing the right thing or not.

Based on comment by @jatin-bhateja (Intel) frequency level switchover pointed 
by @theRealAph  is sensitive to vector
size https://github.com/openjdk/jdk/pull/144#issuecomment-692044896

By keeping vector size less or equal to 32 bytes we should avoid it. And as I 
can see this intrinsic code is using 32
bytes (chars) and 16 bytes vectors: `pbroadcastb(vec1, vec1, 
Assembler::AVX_256bit);`

Also we never had issues with AVX2. only with AVX512 regarding performance hit:
https://bugs.openjdk.java.net/browse/JDK-8221092

I would like to see performance numbers for for all values of UseAVX flag : 0, 
1, 2, 3

The usage is guarded UseSSE42Intrinsics in UseSSE42Intrinsics predicate in .ad 
file. Make sure to test with UseAVX=0 to
make sure that some avx instructions are not mixed into non avx code. And also 
with UseSSE=2 (for example) to make sure
shared code correctly recognize that intrinsics is not supported.

-------------

PR: https://git.openjdk.java.net/jdk/pull/71

Reply via email to