11a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks/* 21a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Copyright (C) 2017 The Android Open Source Project 31a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * 41a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Licensed under the Apache License, Version 2.0 (the "License"); 51a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * you may not use this file except in compliance with the License. 61a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * You may obtain a copy of the License at 71a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * 81a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * http://www.apache.org/licenses/LICENSE-2.0 91a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * 101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Unless required by applicable law or agreed to in writing, software 111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * distributed under the License is distributed on an "AS IS" BASIS, 121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * See the License for the specific language governing permissions and 141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * limitations under the License. 151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks */ 161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks/* UT_reduce_backward.java is a much simpler version of this test 181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * case that exercises pragmas after the functions (backward 191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * reference), whereas this test case exercises the pragmas before 201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * the functions (forward reference). 211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks */ 221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubankspackage com.android.rs.unittest; 241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.content.Context; 261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Allocation; 271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Element; 281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Float2; 291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Int2; 301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Int3; 311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.RenderScript; 321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.ScriptIntrinsicHistogram; 331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Type; 341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.util.Log; 351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport java.util.ArrayList; 371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport java.util.Arrays; 381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport java.util.Random; 391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport static junit.framework.Assert.assertEquals; 411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport static junit.framework.Assert.assertTrue; 421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubankspublic class UT_reduce extends UnitTest { 441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static final String TAG = "reduce"; 451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public UT_reduce(Context ctx) { 471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks super("reduce", ctx); 481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static class timing { 511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks timing(long myJavaStart, long myJavaEnd, long myRsStart, 521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks long myCopyStart, long myKernelStart, long myRsEnd, 531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation... myInputs) { 541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaStart = myJavaStart; 551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaEnd = myJavaEnd; 561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks rsStart = myRsStart; 571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyStart = myCopyStart; 581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks kernelStart = myKernelStart; 591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks rsEnd = myRsEnd; 601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputBytes = 0; 621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (Allocation input : myInputs) 631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputBytes += input.getBytesSize(); 641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputCells = (myInputs.length > 0) ? myInputs[0].getType().getCount() : 0; 661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks timing(long myInputCells) { 691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputCells = myInputCells; 701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long javaStart = -1; 731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long javaEnd = -1; 741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long rsStart = -1; 751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long copyStart = -1; 761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long kernelStart = -1; 771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long rsEnd = -1; 781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long inputBytes = -1; 791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long inputCells = -1; 801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public long javaTime() { 821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return javaEnd - javaStart; 831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public long rsTime() { 861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return rsEnd - rsStart; 871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public long kernelTime() { 901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return rsEnd - kernelStart; 911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public long overheadTime() { 941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return kernelStart - rsStart; 951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public long allocationTime() { 981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return copyStart - rsStart; 991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public long copyTime() { 1021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return kernelStart - copyStart; 1031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public static String string(long myJavaStart, long myJavaEnd, long myRsStart, 1061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks long myCopyStart, long myKernelStart, long myRsEnd, 1071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation... myInputs) { 1081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return (new timing(myJavaStart, myJavaEnd, myRsStart, 1091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks myCopyStart, myKernelStart, myRsEnd, myInputs)).string(); 1101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public static String string(long myInputCells) { 1131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return (new timing(myInputCells)).string(); 1141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public String string() { 1171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String result; 1181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (javaStart >= 0) { 1191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result = "(java " + javaTime() + "ms, rs " + rsTime() + "ms = overhead " + 1201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks overheadTime() + "ms (alloc " + allocationTime() + "ms + copy " + 1211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTime() + "ms) + kernel+get() " + kernelTime() + "ms)"; 1221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (inputCells > 0) 1231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result += " "; 1241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } else { 1251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result = ""; 1261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (inputCells > 0) { 1281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result += "(" + fmt.format(inputCells) + " cells"; 1291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (inputBytes > 0) 1301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result += ", " + fmt.format(inputBytes) + " bytes"; 1311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result += ")"; 1321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result; 1341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static java.text.DecimalFormat fmt; 1371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks static { 1391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks fmt = new java.text.DecimalFormat("###,###"); 1401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private byte[] createInputArrayByte(int len, int seed) { 1441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks byte[] array = new byte[len]; 1451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (new Random(seed)).nextBytes(array); 1461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return array; 1471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private float[] createInputArrayFloat(int len, Random rand) { 1501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float[] array = new float[len]; 1511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < len; ++i) { 1521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float val = rand.nextFloat(); 1531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks array[i] = rand.nextBoolean() ? val : -val; 1541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return array; 1561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private float[] createInputArrayFloat(int len, int seed) { 1591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return createInputArrayFloat(len, new Random(seed)); 1601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private float[] createInputArrayFloatWithInfs(int len, int infs, int seed) { 1631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Random rand = new Random(seed); 1641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float[] array = createInputArrayFloat(len, rand); 1651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < infs; ++i) 1661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks array[rand.nextInt(len)] = (rand.nextBoolean() ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY); 1671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return array; 1681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private int[] createInputArrayInt(int len, int seed) { 1711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Random rand = new Random(seed); 1721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] array = new int[len]; 1731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < len; ++i) 1741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks array[i] = rand.nextInt(); 1751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return array; 1761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private int[] createInputArrayInt(int len, int seed, int eltRange) { 1791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Random rand = new Random(seed); 1801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] array = new int[len]; 1811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < len; ++i) 1821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks array[i] = rand.nextInt(eltRange); 1831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return array; 1841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long[] intArrayToLong(final int[] input) { 1871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] output = new long[input.length]; 1881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < input.length; ++i) 1901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks output[i] = input[i]; 1911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return output; 1931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private <T extends Number> boolean result(String testName, final timing t, 1961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks T javaResult, T rsResult) { 1971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = javaResult.equals(rsResult); 1981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 1991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (success && (t != null)) 2001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks status += " " + t.string(); 2011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, testName + ": java " + javaResult + ", rs " + rsResult + ": " + status); 2021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 2031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean result(String testName, final timing t, 2061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float[] javaResult, final float[] rsResult) { 2071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (javaResult.length != rsResult.length) { 2081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, testName + ": java length " + javaResult.length + 2091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs length " + rsResult.length + ": FAILED"); 2101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return false; 2111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < javaResult.length; ++i) { 2131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (javaResult[i] != rsResult[i]) { 2141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, testName + "[" + i + "]: java " + javaResult[i] + 2151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs " + rsResult[i] + ": FAILED"); 2161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return false; 2171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String status = "PASSED"; 2201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (t != null) 2211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks status += " " + t.string(); 2221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, testName + ": " + status); 2231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return true; 2241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean result(String testName, final timing t, 2271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] javaResult, final long[] rsResult) { 2281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (javaResult.length != rsResult.length) { 2291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, testName + ": java length " + javaResult.length + 2301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs length " + rsResult.length + ": FAILED"); 2311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return false; 2321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < javaResult.length; ++i) { 2341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (javaResult[i] != rsResult[i]) { 2351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, testName + "[" + i + "]: java " + javaResult[i] + 2361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs " + rsResult[i] + ": FAILED"); 2371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return false; 2381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String status = "PASSED"; 2411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (t != null) 2421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks status += " " + t.string(); 2431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, testName + ": " + status); 2441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return true; 2451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean result(String testName, final timing t, 2481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] javaResult, final int[] rsResult) { 2491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result(testName, t, intArrayToLong(javaResult), intArrayToLong(rsResult)); 2501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean result(String testName, final timing t, Int2 javaResult, Int2 rsResult) { 2531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (javaResult.x == rsResult.x) && (javaResult.y == rsResult.y); 2541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 2551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (success && (t != null)) 2561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks status += " " + t.string(); 2571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 2581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testName + 2591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ": java (" + javaResult.x + ", " + javaResult.y + ")" + 2601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs (" + rsResult.x + ", " + rsResult.y + ")" + 2611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ": " + status); 2621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 2631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean result(String testName, final timing t, Float2 javaResult, Float2 rsResult) { 2661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (javaResult.x == rsResult.x) && (javaResult.y == rsResult.y); 2671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 2681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (success && (t != null)) 2691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks status += " " + t.string(); 2701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 2711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testName + 2721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ": java (" + javaResult.x + ", " + javaResult.y + ")" + 2731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs (" + rsResult.x + ", " + rsResult.y + ")" + 2741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ": " + status); 2751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 2761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 2791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private int addint(int[] input) { 2811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int result = 0; 2821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int idx = 0; idx < input.length; ++idx) 2831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result += input[idx]; 2841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result; 2851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean addint1D_array(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 2881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] input = createInputArrayInt(size[0], seed, Integer.MAX_VALUE / size[0]); 2891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaResult = addint(input); 2911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsResult = s.reduce_addint(input).get(); 2921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result("addint1D_array", new timing(size[0]), javaResult, rsResult); 2941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean addint1D(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 2971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] inputArray = createInputArrayInt(size[0], seed, Integer.MAX_VALUE / size[0]); 2981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 3001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaResult = addint(inputArray); 3011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 3021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 3041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.I32(RS), inputArray.length); 3061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 3081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copyFrom(inputArray); 3101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 3121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsResult = s.reduce_addint(inputAllocation).get(); 3131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 3141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = 3161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result("addint1D", 3171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 3181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 3191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResult, rsResult); 3201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 3211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 3221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 3231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean addint2D(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 3251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimX = size[0]; 3261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimY = size[1]; 3271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] inputArray = createInputArrayInt(dimX * dimY, seed, Integer.MAX_VALUE / (dimX * dimY)); 3291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 3311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaResult = addint(inputArray); 3321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 3331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 3351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 3371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks typeBuilder.setX(dimX).setY(dimY); 3381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 3391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 3411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray); 3431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 3451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsResult = s.reduce_addint(inputAllocation).get(); 3461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 3471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = 3491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result("addint2D", 3501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 3511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 3521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResult, rsResult); 3531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 3541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 3551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 3561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean addint3D(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 3581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimX = size[0]; 3591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimY = size[1]; 3601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimZ = size[2]; 3611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] inputArray = createInputArrayInt(dimX * dimY * dimZ, seed, Integer.MAX_VALUE / (dimX * dimY * dimZ)); 3631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 3651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaResult = addint(inputArray); 3661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 3671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 3691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 3711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks typeBuilder.setX(dimX).setY(dimY).setZ(dimZ); 3721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 3731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 3751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copy3DRangeFrom(0, 0, 0, dimX, dimY, dimZ, inputArray); 3771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 3791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsResult = s.reduce_addint(inputAllocation).get(); 3801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 3811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = 3831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result("addint3D", 3841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 3851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 3861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResult, rsResult); 3871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 3881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 3891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 3901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks //----------------------------------------------------------------- 3921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean patternInterleavedReduce(RenderScript RS, ScriptC_reduce s) { 3941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Run two reduce operations without forcing completion between them. 3951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // We want to ensure that the driver can handle this, and that 3961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // temporary Allocations created to run the reduce operations survive 3971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // until get(). 3981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 4001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputSize = (1 << 18); 4021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] input1 = createInputArrayInt(123, Integer.MAX_VALUE / inputSize); 4041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] input2 = createInputArrayInt(456, Integer.MAX_VALUE / inputSize); 4051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaResult1 = addint(input1); 4071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaResult2 = addint(input2); 4081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final ScriptC_reduce.result_int rsResultFuture1 = s.reduce_addint(input1); 4101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final ScriptC_reduce.result_int rsResultFuture2 = s.reduce_addint(input2); 4111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= result("patternInterleavedReduce (1)", new timing(inputSize), 4131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResult1, rsResultFuture1.get()); 4141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= result("patternInterleavedReduce (2)", new timing(inputSize), 4151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResult2, rsResultFuture2.get()); 4161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 4181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 4191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks //----------------------------------------------------------------- 4211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private int[] sillySumIntoDecArray(final int[] input) { 4231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int resultScalar = addint(input); 4241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] result = new int[4]; 4251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < 4; ++i) 4261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result[i] = resultScalar / (i + 1); 4271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result; 4281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 4291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private int[] sillySumIntoIncArray(final int[] input) { 4311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int resultScalar = addint(input); 4321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] result = new int[4]; 4331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < 4; ++i) 4341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result[i] = resultScalar / (4 - i); 4351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result; 4361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 4371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean patternDuplicateAnonymousResult(RenderScript RS, ScriptC_reduce s) { 4391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Ensure that we can have two kernels with the same anonymous result type. 4401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 4421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputSize = 1000; 4441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] input = createInputArrayInt(149, Integer.MAX_VALUE / inputSize); 4451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] javaResultDec = sillySumIntoDecArray(input); 4471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] rsResultDec = s.reduce_sillySumIntoDecArray(input).get(); 4481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= result("patternDuplicateAnonymousResult (Dec)", new timing(inputSize), 4491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResultDec, rsResultDec); 4501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] javaResultInc = sillySumIntoIncArray(input); 4521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] rsResultInc = s.reduce_sillySumIntoIncArray(input).get(); 4531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= result("patternDuplicateAnonymousResult (Inc)", new timing(inputSize), 4541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResultInc, rsResultInc); 4551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 4571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 4581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 4601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private float findMinAbs(float[] input) { 4621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float accum = input[0]; 4631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int idx = 1; idx < input.length; ++idx) { 4641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float val = input[idx]; 4651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (Math.abs(val) < Math.abs(accum)) 4661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks accum = val; 4671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 4681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return accum; 4691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 4701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks static interface ReduceFindMinAbs { 4721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float run(Allocation input); 4731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 4741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinAbs(RenderScript RS, float[] inputArray, String testName, ReduceFindMinAbs reduction) { 4761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 4771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float javaResult = findMinAbs(inputArray); 4781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 4791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 4811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.F32(RS), inputArray.length); 4831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 4851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copyFrom(inputArray); 4871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 4891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float rsResult = reduction.run(inputAllocation); 4901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 4911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Note that the Java and RenderScript algorithms are not 4931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // guaranteed to find the same results -- but the results 4941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // should have the same absolute value. 4951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 4961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = 4971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result(testName, 4981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 4991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 5001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Math.abs(javaResult), Math.abs(rsResult)); 5011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 5021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 5031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinAbsBool(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return findMinAbs(RS, createInputArrayFloat(size[0], seed), "findMinAbsBool", 5071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (Allocation input) -> s.reduce_findMinAbsBool(input).get()); 5081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinAbsBoolInf(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return findMinAbs(RS, createInputArrayFloatWithInfs(size[0], 1 + size[0] / 1000, seed), "findMinAbsBoolInf", 5121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (Allocation input) -> s.reduce_findMinAbsBool(input).get()); 5131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinAbsNaN(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return findMinAbs(RS, createInputArrayFloat(size[0], seed), "findMinAbsNaN", 5171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (Allocation input) -> s.reduce_findMinAbsNaN(input).get()); 5181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinAbsNaNInf(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return findMinAbs(RS, createInputArrayFloatWithInfs(size[0], 1 + size[0] / 1000, seed), "findMinAbsNaNInf", 5221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (Allocation input) -> s.reduce_findMinAbsNaN(input).get()); 5231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 5261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private Int2 findMinAndMax(float[] input) { 5281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float minVal = Float.POSITIVE_INFINITY; 5291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int minIdx = -1; 5301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float maxVal = Float.NEGATIVE_INFINITY; 5311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int maxIdx = -1; 5321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int idx = 0; idx < input.length; ++idx) { 5341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if ((minIdx < 0) || (input[idx] < minVal)) { 5351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks minVal = input[idx]; 5361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks minIdx = idx; 5371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if ((maxIdx < 0) || (input[idx] > maxVal)) { 5391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks maxVal = input[idx]; 5401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks maxIdx = idx; 5411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return new Int2(minIdx, maxIdx); 5451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinAndMax_array(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float[] input = createInputArrayFloat(size[0], seed); 5491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 javaResult = findMinAndMax(input); 5511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 rsResult = s.reduce_findMinAndMax(input).get(); 5521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Note that the Java and RenderScript algorithms are not 5541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // guaranteed to find the same cells -- but they should 5551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // find cells of the same value. 5561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Float2 javaVal = new Float2(input[javaResult.x], input[javaResult.y]); 5571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Float2 rsVal = new Float2(input[rsResult.x], input[rsResult.y]); 5581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result("findMinAndMax_array", new timing(size[0]), javaVal, rsVal); 5601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinAndMax(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float[] inputArray = createInputArrayFloat(size[0], seed); 5641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 5661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 javaResult = findMinAndMax(inputArray); 5671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 5681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 5701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.F32(RS), inputArray.length); 5721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 5741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copyFrom(inputArray); 5761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 5781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 rsResult = s.reduce_findMinAndMax(inputAllocation).get(); 5791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 5801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Note that the Java and RenderScript algorithms are not 5821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // guaranteed to find the same cells -- but they should 5831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // find cells of the same value. 5841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Float2 javaVal = new Float2(inputArray[javaResult.x], inputArray[javaResult.y]); 5851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Float2 rsVal = new Float2(inputArray[rsResult.x], inputArray[rsResult.y]); 5861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = 5881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result("findMinAndMax", 5891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 5901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 5911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaVal, rsVal); 5921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 5931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 5941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 5951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks //----------------------------------------------------------------- 5971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 5981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean patternFindMinAndMaxInf(RenderScript RS, ScriptC_reduce s) { 5991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Run this kernel on an input consisting solely of a single infinity. 6001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float[] input = new float[1]; 6021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks input[0] = Float.POSITIVE_INFINITY; 6031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 javaResult = findMinAndMax(input); 6051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 rsResult = s.reduce_findMinAndMax(input).get(); 6061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Note that the Java and RenderScript algorithms are not 6081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // guaranteed to find the same cells -- but they should 6091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // find cells of the same value. 6101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Float2 javaVal = new Float2(input[javaResult.x], input[javaResult.y]); 6111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Float2 rsVal = new Float2(input[rsResult.x], input[rsResult.y]); 6121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result("patternFindMinAndMaxInf", new timing(1), javaVal, rsVal); 6141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 6151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 6171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Both the input and the result are linearized representations of matSize*matSize matrices. 6191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private float[] findMinMat(final float[] inputArray, final int matSize) { 6201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int matSizeSquared = matSize * matSize; 6211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float[] result = new float[matSizeSquared]; 6231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < matSizeSquared; ++i) 6241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result[i] = Float.POSITIVE_INFINITY; 6251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < inputArray.length; ++i) 6271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result[i % matSizeSquared] = Math.min(result[i % matSizeSquared], inputArray[i]); 6281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result; 6301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 6311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks static interface ReduceFindMinMat { 6331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float[] run(Allocation input); 6341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 6351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinMat(RenderScript RS, int seed, int[] inputSize, 6371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int matSize, Element matElement, ReduceFindMinMat reduction) { 6381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int length = inputSize[0]; 6391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int matSizeSquared = matSize * matSize; 6401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float[] inputArray = createInputArrayFloat(matSizeSquared * length, seed); 6421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 6441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float[] javaResult = findMinMat(inputArray, matSize); 6451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 6461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 6481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, matElement, length); 6501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 6521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copyFromUnchecked(inputArray); 6541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 6561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float[] rsResult = reduction.run(inputAllocation); 6571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 6581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = 6601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result("findMinMat" + matSize, 6611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 6621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 6631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResult, rsResult); 6641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 6651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 6661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 6671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinMat2(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 6691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return findMinMat(RS, seed, size, 2, Element.MATRIX_2X2(RS), 6701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (Allocation input) -> s.reduce_findMinMat2(input).get()); 6711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 6721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinMat4(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 6741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return findMinMat(RS, seed, size, 4, Element.MATRIX_4X4(RS), 6751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (Allocation input) -> s.reduce_findMinMat4(input).get()); 6761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 6771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 6791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private int fz(final int[] input) { 6811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < input.length; ++i) 6821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (input[i] == 0) 6831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return i; 6841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return -1; 6851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 6861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean fz_array(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 6881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputLen = size[0]; 6891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] input = createInputArrayInt(inputLen, seed + 0); 6901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // just in case we got unlucky 6911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks input[(new Random(seed + 1)).nextInt(inputLen)] = 0; 6921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsResult = s.reduce_fz(input).get(); 6941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 6951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (input[rsResult] == 0); 6961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 6971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks "fz_array: input[" + rsResult + "] == " + input[rsResult] + ": " + 6981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (success ? "PASSED " + timing.string(size[0]) : "FAILED")); 6991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 7001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 7011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean fz(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 7031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputLen = size[0]; 7041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, seed + 0); 7051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // just in case we got unlucky 7061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputArray[(new Random(seed + 1)).nextInt(inputLen)] = 0; 7071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 7091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaResult = fz(inputArray); 7101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 7111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 7131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.I32(RS), inputArray.length); 7151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 7171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copyFrom(inputArray); 7191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 7211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsResult = s.reduce_fz(inputAllocation).get(); 7221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 7231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (inputArray[rsResult] == 0); 7251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 7261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (success) 7271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks status += " " + timing.string(javaTimeStart, javaTimeEnd, rsTimeStart, 7281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation); 7291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 7301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks "fz: java input[" + javaResult + "] == " + inputArray[javaResult] + 7311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs input[" + rsResult + "] == " + inputArray[javaResult] + ": " + status); 7321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 7331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 7341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 7351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 7371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean fz2(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 7391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimX = size[0], dimY = size[1]; 7401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputLen = dimX * dimY; 7411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, seed + 0); 7431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // just in case we got unlucky 7441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputArray[(new Random(seed + 1)).nextInt(inputLen)] = 0; 7451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 7471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaResultLinear = fz(inputArray); 7481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 7491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 javaResult = new Int2(javaResultLinear % dimX, javaResultLinear / dimX); 7511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaCellVal = inputArray[javaResult.x + dimX * javaResult.y]; 7521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 7541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 7561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks typeBuilder.setX(dimX).setY(dimY); 7571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 7581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 7601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray); 7621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 7641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 rsResult = s.reduce_fz2(inputAllocation).get(); 7651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 7661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsCellVal = inputArray[rsResult.x + dimX * rsResult.y]; 7681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (rsCellVal == 0); 7691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 7701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (success) 7711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks status += " " + timing.string(javaTimeStart, javaTimeEnd, rsTimeStart, 7721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation); 7731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 7741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks "fz2: java input[" + javaResult.x + ", " + javaResult.y + "] == " + javaCellVal + 7751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs input[" + rsResult.x + ", " + rsResult.y + "] == " + rsCellVal + ": " + status); 7761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 7771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 7781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 7791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 7811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean fz3(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 7831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimX = size[0], dimY = size[1], dimZ = size[2]; 7841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputLen = dimX * dimY * dimZ; 7851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, seed + 0); 7871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // just in case we got unlucky 7881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputArray[(new Random(seed + 1)).nextInt(inputLen)] = 0; 7891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 7911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaResultLinear = fz(inputArray); 7921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 7931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 7941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int3 javaResult = new Int3( 7951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResultLinear % dimX, 7961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (javaResultLinear / dimX) % dimY, 7971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResultLinear / (dimX * dimY)); 7981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaCellVal = inputArray[javaResult.x + dimX * javaResult.y + dimX * dimY * javaResult.z]; 7991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 8011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 8031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks typeBuilder.setX(dimX).setY(dimY).setZ(dimZ); 8041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 8051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 8071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copy3DRangeFrom(0, 0, 0, dimX, dimY, dimZ, inputArray); 8091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 8111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int3 rsResult = s.reduce_fz3(inputAllocation).get(); 8121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 8131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsCellVal = inputArray[rsResult.x + dimX * rsResult.y + dimX * dimY * rsResult.z]; 8151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (rsCellVal == 0); 8161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 8171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (success) 8181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks status += " " + timing.string(javaTimeStart, javaTimeEnd, rsTimeStart, 8191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation); 8201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 8211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks "fz3: java input[" + javaResult.x + ", " + javaResult.y + ", " + javaResult.z + "] == " + javaCellVal + 8221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs input[" + rsResult.x + ", " + rsResult.y + ", " + rsResult.z + "] == " + rsCellVal + ": " + status); 8231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 8241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 8251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 8261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 8281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static final int histogramBucketCount = 256; 8301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long[] histogram(RenderScript RS, final byte[] inputArray) { 8321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.U8(RS), inputArray.length); 8331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copyFrom(inputArray); 8341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation outputAllocation = Allocation.createSized(RS, Element.U32(RS), histogramBucketCount); 8361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ScriptIntrinsicHistogram scriptHsg = ScriptIntrinsicHistogram.create(RS, Element.U8(RS)); 8381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks scriptHsg.setOutput(outputAllocation); 8391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks scriptHsg.forEach(inputAllocation); 8401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] outputArrayMistyped = new int[histogramBucketCount]; 8421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks outputAllocation.copyTo(outputArrayMistyped); 8431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks long[] outputArray = new long[histogramBucketCount]; 8451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < histogramBucketCount; ++i) 8461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks outputArray[i] = outputArrayMistyped[i] & (long) 0xffffffff; 8471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 8491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks outputAllocation.destroy(); 8501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks scriptHsg.destroy(); 8521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return outputArray; 8531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 8541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean histogram_array(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 8561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final byte[] inputArray = createInputArrayByte(size[0], seed); 8571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] javaResult = histogram(RS, inputArray); 8591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertEquals("javaResult length", histogramBucketCount, javaResult.length); 8601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] rsResult = s.reduce_histogram(inputArray).get(); 8611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertEquals("rsResult length", histogramBucketCount, rsResult.length); 8621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result("histogram_array", new timing(size[0]), javaResult, rsResult); 8641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 8651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean histogram(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 8671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final byte[] inputArray = createInputArrayByte(size[0], seed); 8681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 8701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] javaResult = histogram(RS, inputArray); 8711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 8721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertEquals("javaResult length", histogramBucketCount, javaResult.length); 8731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 8751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.U8(RS), inputArray.length); 8771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 8791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copyFrom(inputArray); 8811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 8831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] rsResult = s.reduce_histogram(inputAllocation).get(); 8841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 8851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertEquals("rsResult length", histogramBucketCount, rsResult.length); 8861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // NOTE: The "java time" is actually for the RenderScript histogram intrinsic 8881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = 8891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result("histogram", 8901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 8911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 8921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResult, rsResult); 8931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.destroy(); 8941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 8951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 8961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks //----------------------------------------------------------------- 8981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 8991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean patternRedundantGet(RenderScript RS, ScriptC_reduce s) { 9001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Ensure that get() can be called multiple times on the same 9011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // result, and returns the same object each time. 9021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 9041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputLength = 1 << 18; 9061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final byte[] inputArray = createInputArrayByte(inputLength, 789); 9071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] javaResult = histogram(RS, inputArray); 9091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertEquals("javaResult length", histogramBucketCount, javaResult.length); 9101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final ScriptC_reduce.resultArray256_uint rsResultFuture = s.reduce_histogram(inputArray); 9121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] rsResult1 = rsResultFuture.get(); 9131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertEquals("rsResult1 length", histogramBucketCount, rsResult1.length); 9141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= result("patternRedundantGet (1)", new timing(inputLength), javaResult, rsResult1); 9151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] rsResult2 = rsResultFuture.get(); 9171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= result("patternRedundantGet (2)", new timing(inputLength), javaResult, rsResult2); 9181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (rsResult1 == rsResult2); 9201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, "patternRedundantGet (object equality): " + (success ? "PASSED" : "FAILED")); 9211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= success; 9221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 9241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 9251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks //----------------------------------------------------------------- 9271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private Int2 mode(RenderScript RS, final byte[] inputArray) { 9291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks long[] hsg = histogram(RS, inputArray); 9301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int modeIdx = 0; 9321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 1; i < hsg.length; ++i) 9331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (hsg[i] > hsg[modeIdx]) modeIdx = i; 9341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return new Int2(modeIdx, (int) hsg[modeIdx]); 9351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 9361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean mode_array(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 9381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final byte[] inputArray = createInputArrayByte(size[0], seed); 9391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 javaResult = mode(RS, inputArray); 9411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 rsResult = s.reduce_mode(inputArray).get(); 9421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result("mode", new timing(size[0]), javaResult, rsResult); 9441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 9451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 9471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long sumgcd(final int in1[], final int in2[]) { 9491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertEquals("sumgcd input lengths", in1.length, in2.length); 9501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks long sum = 0; 9521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < in1.length; ++i) { 9531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int a = in1[i], b = in2[i]; 9541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks while (b != 0) { 9561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int aNew = b; 9571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int bNew = a % b; 9581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks a = aNew; 9601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks b = bNew; 9611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 9621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks sum += a; 9641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 9651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return sum; 9661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 9671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean sumgcd(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 9691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int len = size[0]; 9701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] inputArrayA = createInputArrayInt(len, seed + 0); 9721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] inputArrayB = createInputArrayInt(len, seed + 1); 9731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 9751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaResult = sumgcd(inputArrayA, inputArrayB); 9761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 9771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 9791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocationA = Allocation.createSized(RS, Element.I32(RS), len); 9811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocationB = Allocation.createSized(RS, Element.I32(RS), len); 9821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 9841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocationA.copyFrom(inputArrayA); 9861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocationB.copyFrom(inputArrayB); 9871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 9891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsResult = s.reduce_sumgcd(inputAllocationA, inputAllocationB).get(); 9901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 9911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 9921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = 9931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result("sumgcd", 9941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, copyTimeStart, kernelTimeStart, rsTimeEnd, 9951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocationA, inputAllocationB), 9961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks javaResult, rsResult); 9971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocationA.destroy(); 9981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocationB.destroy(); 9991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 10001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 10011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 10031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Return an array of sparse integer values from 0 to maxVal inclusive. 10051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // The array consists of all values k*sparseness (k a nonnegative integer) 10061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // that are less than maxVal, and maxVal itself. For example, if maxVal 10071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // is 20 and sparseness is 6, then the result is { 0, 6, 12, 18, 20 }; 10081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // and if maxVal is 20 and sparseness is 10, then the result is { 0, 10, 20 }. 10091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // 10101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // The elements of the array are sorted in increasing order. 10111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // 10121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // maxVal -- must be nonnegative 10131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // sparseness -- must be positive 10141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static int[] computeSizePoints(int maxVal, int sparseness) { 10151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertTrue((maxVal >= 0) && (sparseness > 0)); 10161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean maxValIsExtra = ((maxVal % sparseness) != 0); 10181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] result = new int[1 + maxVal / sparseness + (maxValIsExtra ? 1 : 0)]; 10191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i * sparseness <= maxVal; ++i) 10211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result[i] = i * sparseness; 10221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (maxValIsExtra) 10231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks result[result.length - 1] = maxVal; 10241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result; 10261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 10271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static final int maxSeedsPerTest = 10; 10291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks static interface Test { 10311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // A test execution is characterized by two properties: A seed 10321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // and a size. 10331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // 10341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // The seed is used for generating pseudorandom input data. 10351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Ideally, we use different seeds for different tests and for 10361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // different executions of the same test at different sizes. 10371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // A test with multiple blocks of input data (i.e., for a 10381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // reduction with multiple inputs) may want multiple seeds; it 10391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // may use the seeds seed..seed+maxSeedsPerTest-1. 10401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // 10411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // The size indicates the amount of input data. It is the number 10421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // of cells in a particular dimension of the iteration space. 10431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean run(RenderScript RS, ScriptC_reduce s, int seed, int[] size); 10441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 10451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks static class TestDescription { 10471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public TestDescription(String myTestName, Test myTest, int mySeed, int[] myDefSize, 10481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int myLog2MaxSize, int mySparseness) { 10491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testName = myTestName; 10501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks test = myTest; 10511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks seed = mySeed; 10521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks defSize = myDefSize; 10531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks log2MaxSize = myLog2MaxSize; 10541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks sparseness = mySparseness; 10551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 10561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public TestDescription(String myTestName, Test myTest, int mySeed, int[] myDefSize, int myLog2MaxSize) { 10581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testName = myTestName; 10591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks test = myTest; 10601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks seed = mySeed; 10611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks defSize = myDefSize; 10621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks log2MaxSize = myLog2MaxSize; 10631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks sparseness = 1; 10641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 10651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public TestDescription(String myTestName, Test myTest, int mySeed, int[] myDefSize) { 10671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testName = myTestName; 10681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks test = myTest; 10691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks seed = mySeed; 10701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks defSize = myDefSize; 10711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks log2MaxSize = -1; 10721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks sparseness = 1; 10731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 10741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public final String testName; 10761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public final Test test; 10781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // When executing the test, scale this up by maxSeedsPerTest. 10801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public final int seed; 10811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // If we're only going to run the test once, what size should 10831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // we use? The length of the array is the number of 10841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // dimensions of the input data. 10851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public final int[] defSize; 10861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // If we're going to run the test over a range of sizes, what 10881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // is the maximum size to use? (This constrains the number of 10891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // cells of the input data, not the number of cells ALONG A 10901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // PARTICULAR DIMENSION of the input data.) 10911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public final int log2MaxSize; 10921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 10931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // If we're going to run the test "exhaustively" over a range 10941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // of sizes, what is the size of a step through the range? 10951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // 10961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // For 1D, must be 1. 10971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public final int sparseness; 10981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 10991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean run(TestDescription td, RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 11011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks String arrayContent = ""; 11021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < size.length; ++i) { 11031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (i != 0) 11041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks arrayContent += ", "; 11051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks arrayContent += size[i]; 11061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 11071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, "Running " + td.testName + "(seed = " + seed + ", size[] = {" + arrayContent + "})"); 11081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return td.test.run(RS, s, seed, size); 11091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 11101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private final TestDescription[] correctnessTests = { 11121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // alloc and array variants of the same test will use the same 11131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // seed, in case results need to be compared. 11141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("addint1D", this::addint1D, 0, new int[]{100000}, 20), 11161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("addint1D_array", this::addint1D_array, 0, new int[]{100000}, 20), 11171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("addint2D", this::addint2D, 1, new int[]{450, 225}, 20, 5), 11181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("addint3D", this::addint3D, 2, new int[]{37, 48, 49}, 20, 7), 11191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Bool and NaN variants of the same test will use the same 11211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // seed, in case results need to be compared. 11221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("findMinAbsBool", this::findMinAbsBool, 3, new int[]{100000}, 20), 11231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("findMinAbsNaN", this::findMinAbsNaN, 3, new int[]{100000}, 20), 11241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("findMinAbsBoolInf", this::findMinAbsBoolInf, 4, new int[]{100000}, 20), 11251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("findMinAbsNaNInf", this::findMinAbsNaNInf, 4, new int[]{100000}, 20), 11261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("findMinAndMax", this::findMinAndMax, 5, new int[]{100000}, 20), 11281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("findMinAndMax_array", this::findMinAndMax_array, 5, new int[]{100000}, 20), 11291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("findMinMat2", this::findMinMat2, 6, new int[]{25000}, 17), 11301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("findMinMat4", this::findMinMat4, 7, new int[]{10000}, 15), 11311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("fz", this::fz, 8, new int[]{100000}, 20), 11321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("fz_array", this::fz_array, 8, new int[]{100000}, 20), 11331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("fz2", this::fz2, 9, new int[]{225, 450}, 20, 5), 11341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("fz3", this::fz3, 10, new int[]{59, 48, 37}, 20, 7), 11351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("histogram", this::histogram, 11, new int[]{100000}, 20), 11361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("histogram_array", this::histogram_array, 11, new int[]{100000}, 20), 11371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // might want to add: new TestDescription("mode", this::mode, 12, new int[]{100000}, 20), 11381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("mode_array", this::mode_array, 12, new int[]{100000}, 20), 11391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("sumgcd", this::sumgcd, 13, new int[]{1 << 16}, 20) 11401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks }; 11411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean runCorrectnessQuick(RenderScript RS, ScriptC_reduce s) { 11431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 11441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (TestDescription td : correctnessTests) { 11461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= run(td, RS, s, maxSeedsPerTest * td.seed, td.defSize); 11471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 11481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 11501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 11511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // NOTE: Each test execution gets maxSeedsPerTest, and there are 11531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // up to 3 + 5*log2MaxSize test executions in the full (as opposed 11541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // to quick) correctness run of a particular test description, and 11551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // we need an additional seed for pseudorandom size generation. 11561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Assuming log2MaxSize does not exceed 32, then it should be 11571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // sufficient to reserve 1 + (3+5*32)*maxSeedsPerTest seeds per 11581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // TestDescription. 11591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // 11601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // See runCorrectness1D(). 11611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static final int seedsPerTestDescriptionCorrectness1D = 1 + (3 + 5 * 32) * maxSeedsPerTest; 11621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // NOTE: Each test execution gets maxSeedsPerTest, and there are 11641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // about 11*((log2MaxSize+1)**2) test executions in the full (as 11651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // opposed to quick) correctness run of a particular test 11661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // description, and we need a seed for pseudorandom size 11671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // generation. Assuming log2MaxSize does not exceed 32, then it 11681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // should be sufficient to reserve 1 + 11*1089*maxSeedsPerTest 11691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // seeds per TestDescription. 11701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // 11711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // See runCorrectness2D(). 11721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static final int seedsPerTestDescriptionCorrectness2D = 1 + (11 * 1089) * maxSeedsPerTest; 11731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // NOTE: Each test execution gets maxSeedsPerTest, and there are 11751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // about 27*((log2MaxSize+1)**3) + 6*((log2MaxSize+1)**2) test 11761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // executions in the full (as opposed to quick) correctness run of 11771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // a particular test description, and we need a seed for (c). 11781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Assuming log2MaxSize does not exceed 32, then it should 11791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // be sufficient to reserve 1 + (27*(33**3) + 6*(33**2))*maxSeedsPerTest 11801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // seeds per TestDescription, which can be simplified upwards to 11811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // 1 + (28*(33**3))*maxSeedsPerTest seeds per TestDescription. 11821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static final int seedsPerTestDescriptionCorrectness3D = 1 + (28 * 35937) * maxSeedsPerTest; 11831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Each test execution gets a certain number of seeds, and a full 11851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (as opposed to quick) correctness run of a particular 11861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // TestDescription consists of some number of executions (each of 11871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // which needs up to maxSeedsPerTest) and may require some 11881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // additional seeds. 11891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static final int seedsPerTestDescriptionCorrectness = 11901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Math.max(seedsPerTestDescriptionCorrectness1D, 11911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Math.max(seedsPerTestDescriptionCorrectness2D, 11921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks seedsPerTestDescriptionCorrectness3D)); 11931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean runCorrectness(RenderScript RS, ScriptC_reduce s) { 11951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 11961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 11971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (TestDescription td : correctnessTests) { 11981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks switch (td.defSize.length) { 11991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks case 1: 12001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= runCorrectness1D(td, RS, s); 12011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks break; 12021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks case 2: 12031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= runCorrectness2D(td, RS, s); 12041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks break; 12051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks case 3: 12061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= runCorrectness3D(td, RS, s); 12071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks break; 12081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks default: 12091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertTrue("unexpected defSize.length " + td.defSize.length, false); 12101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= false; 12111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks break; 12121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 12161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean runCorrectness1D(TestDescription td, RenderScript RS, ScriptC_reduce s) { 12191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertEquals(1, td.sparseness); 12201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int log2MaxSize = td.log2MaxSize; 12211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertTrue(log2MaxSize >= 0); 12221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 12241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // We will execute the test with the following sizes: 12261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (a) Each power of 2 from zero (2**0) up to log2MaxSize (2**log2MaxSize) 12271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (b) Each size from (a) +/-1 12281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (c) 2 random sizes between each pair of adjacent points in (a) 12291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] testSizes = new int[ 12301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /* a */ (1 + log2MaxSize) + 12311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /* b */ 2 * (1 + log2MaxSize) + 12321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /* c */ 2 * log2MaxSize]; 12331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // See seedsPerTestDescriptionCorrectness1D 12341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int seedForPickingTestSizes = td.seed * seedsPerTestDescriptionCorrectness; 12361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int nextTestIdx = 0; 12381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Fill in (a) and (b) 12401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i <= log2MaxSize; ++i) { 12411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int pwrOf2 = 1 << i; 12421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizes[nextTestIdx++] = pwrOf2; /* a */ 12431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizes[nextTestIdx++] = pwrOf2 - 1; /* b */ 12441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizes[nextTestIdx++] = pwrOf2 + 1; /* b */ 12451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Fill in (c) 12481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Random r = new Random(seedForPickingTestSizes); 12491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < log2MaxSize; ++i) { 12501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int lo = (1 << i) + 1; 12511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int hi = 1 << (i + 1); 12521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (lo < hi) { 12541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int j = 0; j < 2; ++j) { 12551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizes[nextTestIdx++] = r.nextInt(hi - lo) + lo; 12561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Arrays.sort(testSizes); 12611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] lastTestSizeArg = new int[]{-1}; 12631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < testSizes.length; ++i) { 12641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if ((testSizes[i] > 0) && (testSizes[i] != lastTestSizeArg[0])) { 12651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks lastTestSizeArg[0] = testSizes[i]; 12661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int seedForTestExecution = seedForPickingTestSizes + 1 + i * maxSeedsPerTest; 12671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= run(td, RS, s, seedForTestExecution, lastTestSizeArg); 12681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 12721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 12731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean runCorrectness2D(TestDescription td, RenderScript RS, ScriptC_reduce s) { 12751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int log2MaxSize = td.log2MaxSize, maxSize = 1 << log2MaxSize, sparseness = td.sparseness; 12761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertTrue((log2MaxSize >= 0) && (sparseness >= 1)); 12771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 12791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] sizePoints = computeSizePoints(log2MaxSize, sparseness); 12811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // We will execute the test with the following sizes: 12831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (a) Each dimension at a power of 2 from sizePoints[] 12841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /// such that the sum of the exponents does not exceed 12851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // log2MaxSize 12861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (b) Each size from (a) with one or both dimensions +/-1, 12871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // except where this would exceed 2**log2MaxSize 12881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (c) Approximately 2*(sizePoints.length**2) random sizes 12891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ArrayList<int[]> testSizesList = new ArrayList<int[]>(); 12901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // See seedsPerTestDescriptionCorrectness2D 12911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int seedForPickingTestSizes = td.seed * seedsPerTestDescriptionCorrectness; 12931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 12941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Fill in (a) and (b) 12951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i : sizePoints) { 12961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int iPwrOf2 = 1 << i; 12971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int iDelta = -1; iDelta <= 1; ++iDelta) { 12981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int iSize = iPwrOf2 + iDelta; 12991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int j : sizePoints) { 13001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int jPwrOf2 = 1 << j; 13011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int jDelta = -1; jDelta <= 1; ++jDelta) { 13021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int jSize = jPwrOf2 + jDelta; 13031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if ((long) iSize * (long) jSize <= maxSize) 13041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{iSize, jSize}); 13051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Fill in (c) 13111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Random r = new Random(seedForPickingTestSizes); 13121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i : sizePoints) { 13131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int j : sizePoints) { 13141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int size0 = 1 + r.nextInt(1 << i); 13151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int size1 = 1 + r.nextInt(maxSize / size0); 13161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{size0, size1}); 13181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{size1, size0}); 13191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[][] testSizes = testSizesList.toArray(new int[0][]); 13231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Arrays.sort(testSizes, 13241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (a, b) -> { 13251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int comp0 = ((Integer) a[0]).compareTo(b[0]); 13261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return (comp0 != 0 ? comp0 : ((Integer) a[1]).compareTo(b[1])); 13271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks }); 13281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] lastTestSizeArg = null; 13301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < testSizes.length; ++i) { 13311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if ((testSizes[i][0] <= 0) || (testSizes[i][1] <= 0)) 13321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks continue; 13331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if ((lastTestSizeArg != null) && 13341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (testSizes[i][0] == lastTestSizeArg[0]) && 13351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (testSizes[i][1] == lastTestSizeArg[1])) 13361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks continue; 13371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks lastTestSizeArg = testSizes[i]; 13381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int seedForTestExecution = seedForPickingTestSizes + 1 + i * maxSeedsPerTest; 13391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= run(td, RS, s, seedForTestExecution, lastTestSizeArg); 13401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 13431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean runCorrectness3D(TestDescription td, RenderScript RS, ScriptC_reduce s) { 13461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int log2MaxSize = td.log2MaxSize, maxSize = 1 << log2MaxSize, sparseness = td.sparseness; 13471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks assertTrue((log2MaxSize >= 0) && (sparseness >= 1)); 13481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 13501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] sizePoints = computeSizePoints(log2MaxSize, sparseness); 13521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // We will execute the test with the following sizes: 13541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (a) Each dimension at a power of 2 from sizePoints[] 13551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /// such that the sum of the exponents does not exceed 13561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // log2MaxSize 13571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (b) Each size from (a) with one or both dimensions +/-1, 13581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // except where this would exceed 2**log2MaxSize 13591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // (c) Approximately 6*(sizePoints.length**2) random sizes 13601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ArrayList<int[]> testSizesList = new ArrayList<int[]>(); 13611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // See seedsPerTestDescriptionCorrectness3D 13621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int seedForPickingTestSizes = td.seed * seedsPerTestDescriptionCorrectness; 13641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Fill in (a) and (b) 13661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i : sizePoints) { 13671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int iPwrOf2 = 1 << i; 13681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int iDelta = -1; iDelta <= 1; ++iDelta) { 13691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int iSize = iPwrOf2 + iDelta; 13701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int j : sizePoints) { 13711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int jPwrOf2 = 1 << j; 13721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int jDelta = -1; jDelta <= 1; ++jDelta) { 13731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int jSize = jPwrOf2 + jDelta; 13741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int k : sizePoints) { 13751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int kPwrOf2 = 1 << k; 13761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int kDelta = -1; kDelta <= 1; ++kDelta) { 13771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int kSize = kPwrOf2 + kDelta; 13781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if ((long) iSize * (long) jSize * (long) kSize <= maxSize) 13791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{iSize, jSize, kSize}); 13801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 13861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Fill in (c) 13881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Random r = new Random(seedForPickingTestSizes); 13891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i : sizePoints) { 13901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int j : sizePoints) { 13911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int size0 = 1 + r.nextInt(1 << i); 13921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int size1 = 1 + r.nextInt(Math.min(1 << j, maxSize / size0)); 13931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int size2 = 1 + r.nextInt(maxSize / (size0 * size1)); 13941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 13951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{size0, size1, size2}); 13961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{size0, size2, size1}); 13971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{size1, size0, size2}); 13981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{size1, size2, size0}); 13991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{size2, size0, size1}); 14001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testSizesList.add(new int[]{size2, size1, size0}); 14011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 14021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 14031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[][] testSizes = testSizesList.toArray(new int[0][]); 14051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Arrays.sort(testSizes, 14061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (a, b) -> { 14071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int comp = ((Integer) a[0]).compareTo(b[0]); 14081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (comp == 0) 14091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks comp = ((Integer) a[1]).compareTo(b[1]); 14101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (comp == 0) 14111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks comp = ((Integer) a[2]).compareTo(b[2]); 14121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return comp; 14131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks }); 14141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] lastTestSizeArg = null; 14161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < testSizes.length; ++i) { 14171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if ((testSizes[i][0] <= 0) || (testSizes[i][1] <= 0) || (testSizes[i][2] <= 0)) 14181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks continue; 14191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if ((lastTestSizeArg != null) && 14201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (testSizes[i][0] == lastTestSizeArg[0]) && 14211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (testSizes[i][1] == lastTestSizeArg[1]) && 14221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (testSizes[i][2] == lastTestSizeArg[2])) 14231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks continue; 14241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Apply Z-dimension limiting. 14261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // 14271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // The Z dimension is always handled specially by GPU 14281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // drivers, and a high value for this dimension can have 14291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // serious performance implications. For example, Cuda 14301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // and OpenCL encourage Z to be the smallest dimension. 14311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (testSizes[i][2] > 1024) 14321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks continue; 14331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks lastTestSizeArg = testSizes[i]; 14351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int seedForTestExecution = seedForPickingTestSizes + 1 + i * maxSeedsPerTest; 14361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= run(td, RS, s, seedForTestExecution, lastTestSizeArg); 14371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 14381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 14401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 14411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private final TestDescription[] performanceTests = { 14431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("addint1D", this::addint1D, 0, new int[]{100000 << 10}), 14441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("addint2D", this::addint2D, 1, new int[]{450 << 5, 225 << 5}), 14451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("addint3D", this::addint3D, 2, new int[]{37 << 3, 48 << 3, 49 << 3}), 14461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("findMinAndMax", this::findMinAndMax, 3, new int[]{100000 << 9}), 14471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("fz", this::fz, 4, new int[]{100000 << 10}), 14481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("fz2", this::fz2, 5, new int[]{225 << 5, 450 << 5}), 14491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("fz3", this::fz3, 6, new int[]{59 << 3, 48 << 3, 37 << 3}), 14501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("histogram", this::histogram, 7, new int[]{100000 << 10}), 14511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // might want to add: new TestDescription("mode", this::mode, 8, new int[]{100000}), 14521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks new TestDescription("sumgcd", this::sumgcd, 9, new int[]{1 << 21}) 14531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks }; 14541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean runPerformanceQuick(RenderScript RS, ScriptC_reduce s) { 14561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 14571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (TestDescription td : performanceTests) { 14591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= run(td, RS, s, maxSeedsPerTest * td.seed, td.defSize); 14601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 14611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 14631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 14641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean runCorrectnessPatterns(RenderScript RS, ScriptC_reduce s) { 14661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Test some very specific usage patterns. 14671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 14681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= patternDuplicateAnonymousResult(RS, s); 14701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= patternFindMinAndMaxInf(RS, s); 14711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= patternInterleavedReduce(RS, s); 14721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= patternRedundantGet(RS, s); 14731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return pass; 14751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 14761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public void run() { 14784cad330154b7df7c3adf126b9f4b2665191a23a4Arthur Eubanks RenderScript pRS = createRenderScript(false); 14791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ScriptC_reduce s = new ScriptC_reduce(pRS); 14801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks s.set_negInf(Float.NEGATIVE_INFINITY); 14811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks s.set_posInf(Float.POSITIVE_INFINITY); 14821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 14841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= runCorrectnessPatterns(pRS, s); 14861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= runCorrectnessQuick(pRS, s); 14871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= runCorrectness(pRS, s); 14881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // pass &= runPerformanceQuick(pRS, s); 14891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pRS.finish(); 14911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks s.destroy(); 14921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pRS.destroy(); 14931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 14941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, pass ? "PASSED" : "FAILED"); 14951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (pass) 14961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks passTest(); 14971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks else 14981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks failTest(); 14991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 15001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks} 15011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 15021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks// TODO: Add machinery for easily running fuller (i.e., non-sparse) testing. 1503