[Vector API] Scatter API intrinsic failure

王卓(卓仁) zhuoren.wz at alibaba-inc.com
Fri Dec 7 11:00:35 UTC 2018


Hi, I saw gather/scatter APIs pushed in to dev branch. These API are very useful to Alibaba, I am looking forward to it for a long time!

However, when I use scatter API, an intrinsic failure is found.
It failed here: share/opto/library_call.cpp:6841
Node* LibraryCallKit::unbox_vector(Node* v, const TypeInstPtr* vbox_type, BasicType elem_bt, int num_elem) {
  const TypeInstPtr* vbox_type_v = gvn().type(v)->is_instptr();
if (vbox_type->klass() != vbox_type_v->klass()) {  <======= Failed here
    return NULL; // arguments don't agree on vector shapes
  }

This patch may fix this failure, please be noted that I only fixes java files for Int, but it seems all types are affected by this failure.

diff -r 644c7a4f2ac3 src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int128Vector.java
--- a/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int128Vector.java     Thu Dec 06 08:11:36 2018 -0800
+++ b/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int128Vector.java     Fri Dec 07 18:52:39 2018 +0800
@@ -699,7 +699,7 @@
         vecInd = VectorIntrinsics.checkIndex(vecInd, a.length);

         VectorIntrinsics.storeWithMap(Int128Vector.class, int.class, LENGTH,
-                               a, Unsafe.ARRAY_INT_BASE_OFFSET, vecInd, intSpec.getClass(),
+                               a, Unsafe.ARRAY_INT_BASE_OFFSET, vecInd, vecInd.getClass(),
                                this,
                                a, ix, b, iy,
                                (arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e));
diff -r 644c7a4f2ac3 src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int256Vector.java
--- a/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int256Vector.java     Thu Dec 06 08:11:36 2018 -0800
+++ b/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int256Vector.java     Fri Dec 07 18:52:39 2018 +0800
@@ -699,7 +699,7 @@
         vecInd = VectorIntrinsics.checkIndex(vecInd, a.length);

         VectorIntrinsics.storeWithMap(Int256Vector.class, int.class, LENGTH,
-                               a, Unsafe.ARRAY_INT_BASE_OFFSET, vecInd, intSpec.getClass(),
+                               a, Unsafe.ARRAY_INT_BASE_OFFSET, vecInd, vecInd.getClass(),
                                this,
                                a, ix, b, iy,
                                (arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e));
diff -r 644c7a4f2ac3 src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int512Vector.java
--- a/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int512Vector.java     Thu Dec 06 08:11:36 2018 -0800
+++ b/src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int512Vector.java     Fri Dec 07 18:52:39 2018 +0800
@@ -699,7 +699,7 @@
         vecInd = VectorIntrinsics.checkIndex(vecInd, a.length);

         VectorIntrinsics.storeWithMap(Int512Vector.class, int.class, LENGTH,
-                               a, Unsafe.ARRAY_INT_BASE_OFFSET, vecInd, intSpec.getClass(),
+                               a, Unsafe.ARRAY_INT_BASE_OFFSET, vecInd, vecInd.getClass(),
                                this,
                                a, ix, b, iy,
                                (arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e));

These failure can be reproduced by the following test. VectorMatrixGatherInt.java . The results of vecTest and normalTest are not same, please focus on performance.

import jdk.incubator.vector.*;
import java.util.Arrays;
import java.util.Random;
import java.io.File;
import java.lang.reflect.Field;
import java.io.IOException;
import sun.misc.Unsafe;
import jdk.incubator.vector.Vector.Mask;
import jdk.incubator.vector.Vector.Shape;
public class VectorMatrixGatherInt
{

    public static int size = 1024 * 16;
    static Random random = new Random();
    private static IntVector.IntSpecies species128 = IntVector.species(Shape.S_256_BIT);;
    static int[] result0 = new int[size << 1];
    static int[] result1 = new int[size << 1];
    static int[] input0 = new int[size];
    static int[] pos = new int[size << 1];
    public static void main(String[] args) throws  NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException {
        long start0 = System.currentTimeMillis();
        long start1 = System.currentTimeMillis();
        long normalTime = 0;
        long vecTime = 0;
        int i = 0;
        for (i = 0; i < size; i++) {
            result0[i] = 0;
            result1[i] = 0;
            pos[i] = random.nextInt(size);
            input0[i] = random.nextInt();
        }
        for (i = 0; i < (size << 1); i++) {
            result0[i] = 0;
            result1[i] = 0;
            pos[i] = random.nextInt(size);
        }
        for (i = 0; i < 20000; i++) {
            normalTest();
        }
        for (i = 0; i < 20000; i++) {
            vecTest();
        }
        System.out.println("begin test");
        start0 = System.currentTimeMillis();
        for (i = 0; i < 10000; i++) {
            normalTest();
        }
        normalTime = System.currentTimeMillis() - start0;
        System.out.println("normal  time used:" + normalTime);
        start1 = System.currentTimeMillis();
        for (i = 0; i < 10000; i++) {
            vecTest();
        }
        vecTime = System.currentTimeMillis() - start1;
        System.out.println("vector time used:" + vecTime);
    }
    static void normalTest() {
        for (int i = 0; i < size; i++) {
            result0[i + pos[i]] = input0[i];
        }
        return;
    }
    static void vecTest() {
        IntVector v0;
        int i = 0;
        v0 = species128.fromArray(input0, i);
        for (i = 0; i + (species128.length()) <= size; i += species128.length()) {
            v0.intoArray(result1, 0, pos, 0);
        }
        return;
    }
}

Please check this.

Regards,
Zhuoren



More information about the panama-dev mailing list