Skip to content

Commit 6844a63

Browse files
[BAEL-6090] vector api examples (#14274)
Co-authored-by: Bhaskar <bhaskar.dastidar@freshworks.com>
1 parent 68f6c19 commit 6844a63

File tree

3 files changed

+149
-0
lines changed

3 files changed

+149
-0
lines changed

core-java-modules/core-java-19/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<source>19</source>
2222
<target>19</target>
2323
<compilerArgs>--enable-preview</compilerArgs>
24+
<compilerArgs>--add-modules=jdk.incubator.vector</compilerArgs>
2425
</configuration>
2526
</plugin>
2627
</plugins>
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package com.baeldung.vectors;
2+
3+
import jdk.incubator.vector.FloatVector;
4+
import jdk.incubator.vector.IntVector;
5+
import jdk.incubator.vector.VectorOperators;
6+
import jdk.incubator.vector.VectorSpecies;
7+
8+
/**
9+
* This class contains examples of the Vector API in Java, more specifically the fourth incubator to the Vector API.
10+
* There are scalar and vector methods written here and the method names will specify the type.
11+
* Note that, the code is written without any benchmarking done and without any assumption of it being run on
12+
* a SIMD processor, or any specific compiler.
13+
*/
14+
public class VectorAPIExamples {
15+
16+
static final VectorSpecies<Integer> SPECIES = IntVector.SPECIES_PREFERRED;
17+
static final VectorSpecies<Float> PREFERRED_SPECIES = FloatVector.SPECIES_PREFERRED;
18+
19+
public int[] addTwoScalarArrays(int[] arr1, int[] arr2) {
20+
int[] result = new int[arr1.length];
21+
for (int i = 0; i < arr1.length; i++) {
22+
result[i] = arr1[i] + arr2[i];
23+
}
24+
return result;
25+
}
26+
27+
public int[] addTwoVectorArrays(int[] arr1, int[] arr2) {
28+
var v1 = IntVector.fromArray(SPECIES, arr1, 0);
29+
var v2 = IntVector.fromArray(SPECIES, arr2, 0);
30+
var result = v1.add(v2);
31+
return result.toArray();
32+
}
33+
34+
public int[] addTwoVectorsWIthHigherShape(int[] arr1, int[] arr2) {
35+
int[] finalResult = new int[arr1.length];
36+
for (int i = 0; i < arr1.length; i += SPECIES.length()) {
37+
var v1 = IntVector.fromArray(SPECIES, arr1, i);
38+
var v2 = IntVector.fromArray(SPECIES, arr2, i);
39+
var result = v1.add(v2);
40+
result.intoArray(finalResult, i);
41+
}
42+
return finalResult;
43+
}
44+
45+
public int[] addTwoVectorsWithMasks(int[] arr1, int[] arr2) {
46+
int[] finalResult = new int[arr1.length];
47+
int i = 0;
48+
for (; i < SPECIES.loopBound(arr1.length); i += SPECIES.length()) {
49+
var mask = SPECIES.indexInRange(i, arr1.length);
50+
var v1 = IntVector.fromArray(SPECIES, arr1, i, mask);
51+
var v2 = IntVector.fromArray(SPECIES, arr2, i, mask);
52+
var result = v1.add(v2, mask);
53+
result.intoArray(finalResult, i, mask);
54+
}
55+
56+
// tail cleanup loop
57+
for (; i < arr1.length; i++) {
58+
finalResult[i] = arr1[i] + arr2[i];
59+
}
60+
return finalResult;
61+
}
62+
63+
public float[] scalarNormOfTwoArrays(float[] arr1, float[] arr2) {
64+
float[] finalResult = new float[arr1.length];
65+
for (int i = 0; i < arr1.length; i++) {
66+
finalResult[i] = (arr1[i] * arr1[i] + arr2[i] * arr2[i]) * -1.0f;
67+
}
68+
return finalResult;
69+
}
70+
71+
public float[] vectorNormalForm(float[] arr1, float[] arr2) {
72+
float[] finalResult = new float[arr1.length];
73+
int i = 0;
74+
int upperBound = SPECIES.loopBound(arr1.length);
75+
for (; i < upperBound; i += SPECIES.length()) {
76+
var va = FloatVector.fromArray(PREFERRED_SPECIES, arr1, i);
77+
var vb = FloatVector.fromArray(PREFERRED_SPECIES, arr2, i);
78+
var vc = va.mul(va)
79+
.add(vb.mul(vb))
80+
.neg();
81+
vc.intoArray(finalResult, i);
82+
}
83+
84+
// tail cleanup
85+
for (; i < arr1.length; i++) {
86+
finalResult[i] = (arr1[i] * arr1[i] + arr2[i] * arr2[i]) * -1.0f;
87+
}
88+
return finalResult;
89+
}
90+
91+
public double averageOfaVector(int[] arr) {
92+
double sum = 0;
93+
for (int i = 0; i < arr.length; i += SPECIES.length()) {
94+
var mask = SPECIES.indexInRange(i, arr.length);
95+
var V = IntVector.fromArray(SPECIES, arr, i, mask);
96+
sum += V.reduceLanes(VectorOperators.ADD, mask);
97+
}
98+
return sum / arr.length;
99+
}
100+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.baeldung.vectors;
2+
3+
import static org.junit.Assert.assertArrayEquals;
4+
5+
import org.junit.Test;
6+
import org.junit.jupiter.api.Assertions;
7+
8+
public class VectorAPIUnitTest {
9+
VectorAPIExamples vector = new VectorAPIExamples();
10+
11+
@Test
12+
public void whenTwoArraysProvided_thenVerifyScalarAdd() {
13+
int[] arr1 = { 1, 2, 3, 4 };
14+
int[] arr2 = { 100, 200, 300, 400 };
15+
int[] result = { 101, 202, 303, 404 };
16+
assertArrayEquals(result, vector.addTwoScalarArrays(arr1, arr2));
17+
}
18+
19+
@Test
20+
public void whenTwoArraysProvided_thenVerifyVectorAdd() {
21+
int[] arr1 = { 1, 2, 3, 4 };
22+
int[] arr2 = { 100, 200, 300, 400 };
23+
int[] result = { 101, 202, 303, 404 };
24+
assertArrayEquals(result, vector.addTwoVectorsWithMasks(arr1, arr2));
25+
}
26+
27+
@Test
28+
public void whenTwoValuesProvided_thenComputeScalarNorm() {
29+
float[] arr1 = { 1, 2.3f };
30+
float[] arr2 = { 1.3f, 2.0f };
31+
float[] result = { -2.6899998f, -9.29f };
32+
Assertions.assertArrayEquals(result, vector.scalarNormOfTwoArrays(arr1, arr2));
33+
}
34+
35+
@Test
36+
public void whenTwoValuesProvided_thenComputeVectorNorm() {
37+
float[] arr1 = { 1, 2.3f };
38+
float[] arr2 = { 1.3f, 2.0f };
39+
float[] result = { -2.6899998f, -9.29f };
40+
Assertions.assertArrayEquals(result, vector.vectorNormalForm(arr1, arr2));
41+
}
42+
43+
@Test
44+
public void whenArrayProvided_thenComputeVectorAverage() {
45+
int[] arr = { 100, 200, 300, 400 };
46+
Assertions.assertEquals(250.0, vector.averageOfaVector(arr));
47+
}
48+
}

0 commit comments

Comments
 (0)