[Vector API] Scatter API intrinsic failure
Rukmannagari, Shravya
shravya.rukmannagari at intel.com
Fri Dec 7 16:37:12 UTC 2018
Hi Zhuoren,
Thanks for reporting this, I updated the patch with the fix.
Thanks,
Shravya.
-----Original Message-----
From: panama-dev [mailto:panama-dev-bounces at openjdk.java.net] On Behalf Of ??(??)
Sent: Friday, December 7, 2018 3:01 AM
To: panama-dev <panama-dev at openjdk.java.net>
Cc: 周经森(英通) <kingsum.kc at alibaba-inc.com>; 李三红(三红) <sanhong.lsh at alibaba-inc.com>; 王卓(卓仁) <zhuoren.wz at alibaba-inc.com>
Subject: [Vector API] Scatter API intrinsic failure
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