Integrated: 8314618: RISC-V: -XX:MaxVectorSize does not work as expected
Gui Cao
gcao at openjdk.org
Tue Aug 22 02:50:42 UTC 2023
On Mon, 21 Aug 2023 02:01:35 GMT, Gui Cao <gcao at openjdk.org> wrote:
> Hi all, we found that when the specified -XX:MaxVectorSize=16 no bigger than the detected _initial_vector_length=32, it causes the MaxVectorSize to be set incorrectly.
>
> MaxVectorSize is updated in src/hotspot/cpu/riscv/vm_version_riscv.cpp#VM_Version::c2_initialize().
>
>
> if (UseRVV) {
> if (FLAG_IS_DEFAULT(MaxVectorSize)) {
> MaxVectorSize = _initial_vector_length;
> } else if (MaxVectorSize < 16) {
> warning("RVV does not support vector length less than 16 bytes. Disabling RVV.");
> UseRVV = false;
> } else if (is_power_of_2(MaxVectorSize)) {
> if (MaxVectorSize > _initial_vector_length) {
> warning("Current system only supports max RVV vector length %d. Set MaxVectorSize to %d",
> _initial_vector_length, _initial_vector_length);
> }
> MaxVectorSize = _initial_vector_length;
> } else {
> vm_exit_during_initialization(err_msg("Unsupported MaxVectorSize: %d", (int)MaxVectorSize));
> }
> }
>
>
> It's that RISC-V only supports max-width vectorization at first, so it's unconditionally set to hardware max-width here. However, after https://github.com/openjdk/jdk/commit/43c71ddf923d442499449948f4bf8a7c79249af0, vectors with small widths are supported, so here it needs to be adjusted accordingly. The correct should be If MaxVectorSize is less than _initial_vector_length, then MaxVectorSize should be used as the final value.
>
> This issue affects C2 autovectorization and some specific Vector API interfaces such as VectorSupport.getMaxLaneCount.
>
> We can verify the problem using the following test case:
>
>
> import jdk.internal.vm.vector.VectorSupport;
>
> public class GetMaxVectorSizeTest {
> public static void main(String[] args) {
> final int maxLaneCount = VectorSupport.getMaxLaneCount(byte.class);
> System.out.println("maxLaneCount:" + maxLaneCount);
> }
> }
>
>
> The compile command is as follows:
>
>
> javac --add-exports java.base/jdk.internal.vm.vector=ALL-UNNAMED GetMaxVectorSizeTest.java
>
>
> RISC-V without the -XX:MaxVectorSize=16 has the following execution results(risc-v rvv vector length is set 256 bit):
>
> zifeihan at plct-c8:~/jdk-rvv/build/linux-riscv64-server-fastdebug/jdk/bin$ ./java -XX:+UnlockExperimentalVMOptions -XX:+UseRVV --add-exports java.base/jdk.internal.vm.vector=ALL-UNNAMED GetMaxVectorSizeTest
> maxLaneCount:32
>
>
> RISC-V using the -XX:MaxVectorSize=16 results in the following(risc-v rvv vector length is set 256 bit):
>
>
> zifeihan at plct-c8:~/jdk-rvv/build/linux-riscv64-server-fastdebug/jdk/bin...
This pull request has now been integrated.
Changeset: a66b5df1
Author: Gui Cao <gcao at openjdk.org>
Committer: Fei Yang <fyang at openjdk.org>
URL: https://git.openjdk.org/jdk/commit/a66b5df14a163d2990e6dd746906942367e4fdb2
Stats: 4 lines in 2 files changed: 1 ins; 1 del; 2 mod
8314618: RISC-V: -XX:MaxVectorSize does not work as expected
Reviewed-by: fyang, dzhang
-------------
PR: https://git.openjdk.org/jdk/pull/15356
More information about the hotspot-dev
mailing list