10d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks// This file is automatically generated from 20d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks// frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py 30d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/* 40d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * Copyright (C) 2017 The Android Open Source Project 50d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * 60d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * Licensed under the Apache License, Version 2.0 (the "License"); 70d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * you may not use this file except in compliance with the License. 80d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * You may obtain a copy of the License at 90d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * 100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * http://www.apache.org/licenses/LICENSE-2.0 110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * 120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * Unless required by applicable law or agreed to in writing, software 130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * distributed under the License is distributed on an "AS IS" BASIS, 140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * See the License for the specific language governing permissions and 160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * limitations under the License. 170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks */ 180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/* UT_reduce_backward.java is a much simpler version of this test 200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * case that exercises pragmas after the functions (backward 210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * reference), whereas this test case exercises the pragmas before 220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * the functions (forward reference). 230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks */ 240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubankspackage com.android.rs.unittest; 260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.content.Context; 280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Allocation; 290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Element; 300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Float2; 310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Int2; 320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Int3; 330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.RenderScript; 340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.ScriptIntrinsicHistogram; 350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Type; 360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.util.Log; 370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport java.util.ArrayList; 390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport java.util.Arrays; 400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport java.util.Random; 410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport static junit.framework.Assert.assertEquals; 430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport static junit.framework.Assert.assertTrue; 440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubankspublic class UT_reduce extends UnitTest { 460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static final String TAG = "reduce"; 470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public UT_reduce(Context ctx) { 490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks super("reduce", ctx); 500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static class timing { 530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks timing(long myJavaStart, long myJavaEnd, long myRsStart, 540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks long myCopyStart, long myKernelStart, long myRsEnd, 550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation... myInputs) { 560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaStart = myJavaStart; 570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaEnd = myJavaEnd; 580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks rsStart = myRsStart; 590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyStart = myCopyStart; 600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks kernelStart = myKernelStart; 610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks rsEnd = myRsEnd; 620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputBytes = 0; 640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (Allocation input : myInputs) 650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputBytes += input.getBytesSize(); 660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputCells = (myInputs.length > 0) ? myInputs[0].getType().getCount() : 0; 680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks timing(long myInputCells) { 710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputCells = myInputCells; 720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long javaStart = -1; 750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long javaEnd = -1; 760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long rsStart = -1; 770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long copyStart = -1; 780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long kernelStart = -1; 790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long rsEnd = -1; 800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long inputBytes = -1; 810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long inputCells = -1; 820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public long javaTime() { 840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return javaEnd - javaStart; 850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public long rsTime() { 880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return rsEnd - rsStart; 890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public long kernelTime() { 920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return rsEnd - kernelStart; 930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public long overheadTime() { 960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return kernelStart - rsStart; 970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public long allocationTime() { 1000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return copyStart - rsStart; 1010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public long copyTime() { 1040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return kernelStart - copyStart; 1050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public static String string(long myJavaStart, long myJavaEnd, long myRsStart, 1080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks long myCopyStart, long myKernelStart, long myRsEnd, 1090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation... myInputs) { 1100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return (new timing(myJavaStart, myJavaEnd, myRsStart, 1110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks myCopyStart, myKernelStart, myRsEnd, myInputs)).string(); 1120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public static String string(long myInputCells) { 1150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return (new timing(myInputCells)).string(); 1160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public String string() { 1190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String result; 1200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (javaStart >= 0) { 1210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result = "(java " + javaTime() + "ms, rs " + rsTime() + "ms = overhead " + 1220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks overheadTime() + "ms (alloc " + allocationTime() + "ms + copy " + 1230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTime() + "ms) + kernel+get() " + kernelTime() + "ms)"; 1240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (inputCells > 0) 1250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result += " "; 1260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } else { 1270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result = ""; 1280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (inputCells > 0) { 1300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result += "(" + fmt.format(inputCells) + " cells"; 1310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (inputBytes > 0) 1320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result += ", " + fmt.format(inputBytes) + " bytes"; 1330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result += ")"; 1340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result; 1360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static java.text.DecimalFormat fmt; 1390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks static { 1410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks fmt = new java.text.DecimalFormat("###,###"); 1420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private byte[] createInputArrayByte(int len, int seed) { 1460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks byte[] array = new byte[len]; 1470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (new Random(seed)).nextBytes(array); 1480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return array; 1490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private float[] createInputArrayFloat(int len, Random rand) { 1520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float[] array = new float[len]; 1530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < len; ++i) { 1540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float val = rand.nextFloat(); 1550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks array[i] = rand.nextBoolean() ? val : -val; 1560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return array; 1580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private float[] createInputArrayFloat(int len, int seed) { 1610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return createInputArrayFloat(len, new Random(seed)); 1620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private float[] createInputArrayFloatWithInfs(int len, int infs, int seed) { 1650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Random rand = new Random(seed); 1660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float[] array = createInputArrayFloat(len, rand); 1670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < infs; ++i) 1680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks array[rand.nextInt(len)] = (rand.nextBoolean() ? Float.POSITIVE_INFINITY : Float.NEGATIVE_INFINITY); 1690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return array; 1700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private int[] createInputArrayInt(int len, int seed) { 1730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Random rand = new Random(seed); 1740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] array = new int[len]; 1750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < len; ++i) 1760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks array[i] = rand.nextInt(); 1770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return array; 1780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private int[] createInputArrayInt(int len, int seed, int eltRange) { 1810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Random rand = new Random(seed); 1820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] array = new int[len]; 1830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < len; ++i) 1840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks array[i] = rand.nextInt(eltRange); 1850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return array; 1860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long[] intArrayToLong(final int[] input) { 1890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] output = new long[input.length]; 1900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < input.length; ++i) 1920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks output[i] = input[i]; 1930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return output; 1950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private <T extends Number> boolean result(String testName, final timing t, 1980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks T javaResult, T rsResult) { 1990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = javaResult.equals(rsResult); 2000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 2010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (success && (t != null)) 2020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks status += " " + t.string(); 2030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, testName + ": java " + javaResult + ", rs " + rsResult + ": " + status); 2040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 2050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean result(String testName, final timing t, 2080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float[] javaResult, final float[] rsResult) { 2090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (javaResult.length != rsResult.length) { 2100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, testName + ": java length " + javaResult.length + 2110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs length " + rsResult.length + ": FAILED"); 2120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return false; 2130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < javaResult.length; ++i) { 2150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (javaResult[i] != rsResult[i]) { 2160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, testName + "[" + i + "]: java " + javaResult[i] + 2170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs " + rsResult[i] + ": FAILED"); 2180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return false; 2190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String status = "PASSED"; 2220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (t != null) 2230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks status += " " + t.string(); 2240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, testName + ": " + status); 2250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return true; 2260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean result(String testName, final timing t, 2290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] javaResult, final long[] rsResult) { 2300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (javaResult.length != rsResult.length) { 2310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, testName + ": java length " + javaResult.length + 2320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs length " + rsResult.length + ": FAILED"); 2330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return false; 2340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < javaResult.length; ++i) { 2360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (javaResult[i] != rsResult[i]) { 2370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, testName + "[" + i + "]: java " + javaResult[i] + 2380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs " + rsResult[i] + ": FAILED"); 2390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return false; 2400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String status = "PASSED"; 2430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (t != null) 2440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks status += " " + t.string(); 2450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, testName + ": " + status); 2460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return true; 2470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean result(String testName, final timing t, 2500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] javaResult, final int[] rsResult) { 2510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result(testName, t, intArrayToLong(javaResult), intArrayToLong(rsResult)); 2520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean result(String testName, final timing t, Int2 javaResult, Int2 rsResult) { 2550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (javaResult.x == rsResult.x) && (javaResult.y == rsResult.y); 2560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 2570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (success && (t != null)) 2580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks status += " " + t.string(); 2590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 2600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testName + 2610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ": java (" + javaResult.x + ", " + javaResult.y + ")" + 2620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs (" + rsResult.x + ", " + rsResult.y + ")" + 2630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ": " + status); 2640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 2650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean result(String testName, final timing t, Float2 javaResult, Float2 rsResult) { 2680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (javaResult.x == rsResult.x) && (javaResult.y == rsResult.y); 2690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 2700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (success && (t != null)) 2710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks status += " " + t.string(); 2720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 2730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testName + 2740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ": java (" + javaResult.x + ", " + javaResult.y + ")" + 2750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs (" + rsResult.x + ", " + rsResult.y + ")" + 2760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ": " + status); 2770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 2780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 2810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private int addint(int[] input) { 2830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int result = 0; 2840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int idx = 0; idx < input.length; ++idx) 2850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result += input[idx]; 2860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result; 2870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean addint1D_array(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 2900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] input = createInputArrayInt(size[0], seed, Integer.MAX_VALUE / size[0]); 2910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaResult = addint(input); 2930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsResult = s.reduce_addint(input).get(); 2940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result("addint1D_array", new timing(size[0]), javaResult, rsResult); 2960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean addint1D(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 2990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] inputArray = createInputArrayInt(size[0], seed, Integer.MAX_VALUE / size[0]); 3000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 3020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaResult = addint(inputArray); 3030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 3040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 3060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.I32(RS), inputArray.length); 3080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 3100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copyFrom(inputArray); 3120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 3140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsResult = s.reduce_addint(inputAllocation).get(); 3150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 3160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = 3180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result("addint1D", 3190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 3200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 3210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResult, rsResult); 3220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 3230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 3240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 3250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean addint2D(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 3270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimX = size[0]; 3280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimY = size[1]; 3290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] inputArray = createInputArrayInt(dimX * dimY, seed, Integer.MAX_VALUE / (dimX * dimY)); 3310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 3330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaResult = addint(inputArray); 3340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 3350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 3370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 3390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks typeBuilder.setX(dimX).setY(dimY); 3400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 3410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 3430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray); 3450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 3470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsResult = s.reduce_addint(inputAllocation).get(); 3480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 3490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = 3510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result("addint2D", 3520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 3530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 3540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResult, rsResult); 3550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 3560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 3570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 3580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean addint3D(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 3600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimX = size[0]; 3610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimY = size[1]; 3620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimZ = size[2]; 3630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] inputArray = createInputArrayInt(dimX * dimY * dimZ, seed, Integer.MAX_VALUE / (dimX * dimY * dimZ)); 3650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 3670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaResult = addint(inputArray); 3680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 3690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 3710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 3730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks typeBuilder.setX(dimX).setY(dimY).setZ(dimZ); 3740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 3750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 3770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copy3DRangeFrom(0, 0, 0, dimX, dimY, dimZ, inputArray); 3790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 3810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsResult = s.reduce_addint(inputAllocation).get(); 3820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 3830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = 3850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result("addint3D", 3860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 3870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 3880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResult, rsResult); 3890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 3900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 3910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 3920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks //----------------------------------------------------------------- 3940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean patternInterleavedReduce(RenderScript RS, ScriptC_reduce s) { 3960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Run two reduce operations without forcing completion between them. 3970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // We want to ensure that the driver can handle this, and that 3980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // temporary Allocations created to run the reduce operations survive 3990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // until get(). 4000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 4020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputSize = (1 << 18); 4040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] input1 = createInputArrayInt(123, Integer.MAX_VALUE / inputSize); 4060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] input2 = createInputArrayInt(456, Integer.MAX_VALUE / inputSize); 4070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaResult1 = addint(input1); 4090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaResult2 = addint(input2); 4100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final ScriptC_reduce.result_int rsResultFuture1 = s.reduce_addint(input1); 4120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final ScriptC_reduce.result_int rsResultFuture2 = s.reduce_addint(input2); 4130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= result("patternInterleavedReduce (1)", new timing(inputSize), 4150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResult1, rsResultFuture1.get()); 4160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= result("patternInterleavedReduce (2)", new timing(inputSize), 4170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResult2, rsResultFuture2.get()); 4180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 4200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 4210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks //----------------------------------------------------------------- 4230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private int[] sillySumIntoDecArray(final int[] input) { 4250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int resultScalar = addint(input); 4260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] result = new int[4]; 4270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < 4; ++i) 4280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result[i] = resultScalar / (i + 1); 4290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result; 4300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 4310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private int[] sillySumIntoIncArray(final int[] input) { 4330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int resultScalar = addint(input); 4340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] result = new int[4]; 4350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < 4; ++i) 4360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result[i] = resultScalar / (4 - i); 4370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result; 4380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 4390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean patternDuplicateAnonymousResult(RenderScript RS, ScriptC_reduce s) { 4410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Ensure that we can have two kernels with the same anonymous result type. 4420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 4440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputSize = 1000; 4460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] input = createInputArrayInt(149, Integer.MAX_VALUE / inputSize); 4470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] javaResultDec = sillySumIntoDecArray(input); 4490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] rsResultDec = s.reduce_sillySumIntoDecArray(input).get(); 4500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= result("patternDuplicateAnonymousResult (Dec)", new timing(inputSize), 4510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResultDec, rsResultDec); 4520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] javaResultInc = sillySumIntoIncArray(input); 4540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] rsResultInc = s.reduce_sillySumIntoIncArray(input).get(); 4550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= result("patternDuplicateAnonymousResult (Inc)", new timing(inputSize), 4560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResultInc, rsResultInc); 4570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 4590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 4600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 4620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private float findMinAbs(float[] input) { 4640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float accum = input[0]; 4650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int idx = 1; idx < input.length; ++idx) { 4660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float val = input[idx]; 4670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (Math.abs(val) < Math.abs(accum)) 4680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks accum = val; 4690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 4700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return accum; 4710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 4720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks static interface ReduceFindMinAbs { 4740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float run(Allocation input); 4750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 4760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinAbs(RenderScript RS, float[] inputArray, String testName, ReduceFindMinAbs reduction) { 4780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 4790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float javaResult = findMinAbs(inputArray); 4800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 4810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 4830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.F32(RS), inputArray.length); 4850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 4870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copyFrom(inputArray); 4890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 4910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float rsResult = reduction.run(inputAllocation); 4920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 4930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Note that the Java and RenderScript algorithms are not 4950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // guaranteed to find the same results -- but the results 4960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // should have the same absolute value. 4970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 4980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = 4990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result(testName, 5000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 5010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 5020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Math.abs(javaResult), Math.abs(rsResult)); 5030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 5040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 5050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinAbsBool(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return findMinAbs(RS, createInputArrayFloat(size[0], seed), "findMinAbsBool", 5090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (Allocation input) -> s.reduce_findMinAbsBool(input).get()); 5100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinAbsBoolInf(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return findMinAbs(RS, createInputArrayFloatWithInfs(size[0], 1 + size[0] / 1000, seed), "findMinAbsBoolInf", 5140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (Allocation input) -> s.reduce_findMinAbsBool(input).get()); 5150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinAbsNaN(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return findMinAbs(RS, createInputArrayFloat(size[0], seed), "findMinAbsNaN", 5190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (Allocation input) -> s.reduce_findMinAbsNaN(input).get()); 5200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinAbsNaNInf(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return findMinAbs(RS, createInputArrayFloatWithInfs(size[0], 1 + size[0] / 1000, seed), "findMinAbsNaNInf", 5240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (Allocation input) -> s.reduce_findMinAbsNaN(input).get()); 5250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 5280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private Int2 findMinAndMax(float[] input) { 5300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float minVal = Float.POSITIVE_INFINITY; 5310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int minIdx = -1; 5320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float maxVal = Float.NEGATIVE_INFINITY; 5330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int maxIdx = -1; 5340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int idx = 0; idx < input.length; ++idx) { 5360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if ((minIdx < 0) || (input[idx] < minVal)) { 5370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks minVal = input[idx]; 5380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks minIdx = idx; 5390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if ((maxIdx < 0) || (input[idx] > maxVal)) { 5410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks maxVal = input[idx]; 5420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks maxIdx = idx; 5430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return new Int2(minIdx, maxIdx); 5470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinAndMax_array(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float[] input = createInputArrayFloat(size[0], seed); 5510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 javaResult = findMinAndMax(input); 5530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 rsResult = s.reduce_findMinAndMax(input).get(); 5540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Note that the Java and RenderScript algorithms are not 5560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // guaranteed to find the same cells -- but they should 5570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // find cells of the same value. 5580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Float2 javaVal = new Float2(input[javaResult.x], input[javaResult.y]); 5590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Float2 rsVal = new Float2(input[rsResult.x], input[rsResult.y]); 5600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result("findMinAndMax_array", new timing(size[0]), javaVal, rsVal); 5620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinAndMax(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 5650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float[] inputArray = createInputArrayFloat(size[0], seed); 5660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 5680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 javaResult = findMinAndMax(inputArray); 5690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 5700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 5720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.F32(RS), inputArray.length); 5740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 5760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copyFrom(inputArray); 5780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 5800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 rsResult = s.reduce_findMinAndMax(inputAllocation).get(); 5810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 5820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Note that the Java and RenderScript algorithms are not 5840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // guaranteed to find the same cells -- but they should 5850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // find cells of the same value. 5860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Float2 javaVal = new Float2(inputArray[javaResult.x], inputArray[javaResult.y]); 5870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Float2 rsVal = new Float2(inputArray[rsResult.x], inputArray[rsResult.y]); 5880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = 5900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result("findMinAndMax", 5910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 5920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 5930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaVal, rsVal); 5940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 5950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 5960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 5970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 5980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks //----------------------------------------------------------------- 5990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean patternFindMinAndMaxInf(RenderScript RS, ScriptC_reduce s) { 6010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Run this kernel on an input consisting solely of a single infinity. 6020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float[] input = new float[1]; 6040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks input[0] = Float.POSITIVE_INFINITY; 6050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 javaResult = findMinAndMax(input); 6070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 rsResult = s.reduce_findMinAndMax(input).get(); 6080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Note that the Java and RenderScript algorithms are not 6100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // guaranteed to find the same cells -- but they should 6110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // find cells of the same value. 6120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Float2 javaVal = new Float2(input[javaResult.x], input[javaResult.y]); 6130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Float2 rsVal = new Float2(input[rsResult.x], input[rsResult.y]); 6140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result("patternFindMinAndMaxInf", new timing(1), javaVal, rsVal); 6160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 6170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 6190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Both the input and the result are linearized representations of matSize*matSize matrices. 6210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private float[] findMinMat(final float[] inputArray, final int matSize) { 6220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int matSizeSquared = matSize * matSize; 6230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float[] result = new float[matSizeSquared]; 6250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < matSizeSquared; ++i) 6260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result[i] = Float.POSITIVE_INFINITY; 6270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < inputArray.length; ++i) 6290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result[i % matSizeSquared] = Math.min(result[i % matSizeSquared], inputArray[i]); 6300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result; 6320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 6330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks static interface ReduceFindMinMat { 6350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float[] run(Allocation input); 6360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 6370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinMat(RenderScript RS, int seed, int[] inputSize, 6390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int matSize, Element matElement, ReduceFindMinMat reduction) { 6400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int length = inputSize[0]; 6410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int matSizeSquared = matSize * matSize; 6420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float[] inputArray = createInputArrayFloat(matSizeSquared * length, seed); 6440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 6460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float[] javaResult = findMinMat(inputArray, matSize); 6470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 6480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 6500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, matElement, length); 6520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 6540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copyFromUnchecked(inputArray); 6560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 6580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float[] rsResult = reduction.run(inputAllocation); 6590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 6600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = 6620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result("findMinMat" + matSize, 6630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 6640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 6650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResult, rsResult); 6660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 6670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 6680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 6690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinMat2(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 6710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return findMinMat(RS, seed, size, 2, Element.MATRIX_2X2(RS), 6720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (Allocation input) -> s.reduce_findMinMat2(input).get()); 6730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 6740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinMat4(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 6760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return findMinMat(RS, seed, size, 4, Element.MATRIX_4X4(RS), 6770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (Allocation input) -> s.reduce_findMinMat4(input).get()); 6780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 6790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 6810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private int fz(final int[] input) { 6830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < input.length; ++i) 6840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (input[i] == 0) 6850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return i; 6860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return -1; 6870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 6880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean fz_array(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 6900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputLen = size[0]; 6910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] input = createInputArrayInt(inputLen, seed + 0); 6920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // just in case we got unlucky 6930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks input[(new Random(seed + 1)).nextInt(inputLen)] = 0; 6940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsResult = s.reduce_fz(input).get(); 6960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 6970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (input[rsResult] == 0); 6980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 6990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks "fz_array: input[" + rsResult + "] == " + input[rsResult] + ": " + 7000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (success ? "PASSED " + timing.string(size[0]) : "FAILED")); 7010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 7020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 7030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean fz(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 7050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputLen = size[0]; 7060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, seed + 0); 7070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // just in case we got unlucky 7080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputArray[(new Random(seed + 1)).nextInt(inputLen)] = 0; 7090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 7110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaResult = fz(inputArray); 7120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 7130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 7150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.I32(RS), inputArray.length); 7170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 7190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copyFrom(inputArray); 7210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 7230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsResult = s.reduce_fz(inputAllocation).get(); 7240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 7250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (inputArray[rsResult] == 0); 7270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 7280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (success) 7290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks status += " " + timing.string(javaTimeStart, javaTimeEnd, rsTimeStart, 7300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation); 7310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 7320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks "fz: java input[" + javaResult + "] == " + inputArray[javaResult] + 7330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs input[" + rsResult + "] == " + inputArray[javaResult] + ": " + status); 7340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 7350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 7360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 7370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 7390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean fz2(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 7410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimX = size[0], dimY = size[1]; 7420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputLen = dimX * dimY; 7430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, seed + 0); 7450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // just in case we got unlucky 7460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputArray[(new Random(seed + 1)).nextInt(inputLen)] = 0; 7470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 7490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaResultLinear = fz(inputArray); 7500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 7510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 javaResult = new Int2(javaResultLinear % dimX, javaResultLinear / dimX); 7530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaCellVal = inputArray[javaResult.x + dimX * javaResult.y]; 7540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 7560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 7580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks typeBuilder.setX(dimX).setY(dimY); 7590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 7600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 7620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray); 7640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 7660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 rsResult = s.reduce_fz2(inputAllocation).get(); 7670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 7680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsCellVal = inputArray[rsResult.x + dimX * rsResult.y]; 7700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (rsCellVal == 0); 7710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 7720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (success) 7730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks status += " " + timing.string(javaTimeStart, javaTimeEnd, rsTimeStart, 7740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation); 7750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 7760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks "fz2: java input[" + javaResult.x + ", " + javaResult.y + "] == " + javaCellVal + 7770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs input[" + rsResult.x + ", " + rsResult.y + "] == " + rsCellVal + ": " + status); 7780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 7790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 7800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 7810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 7830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean fz3(RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 7850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimX = size[0], dimY = size[1], dimZ = size[2]; 7860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputLen = dimX * dimY * dimZ; 7870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, seed + 0); 7890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // just in case we got unlucky 7900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputArray[(new Random(seed + 1)).nextInt(inputLen)] = 0; 7910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 7930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaResultLinear = fz(inputArray); 7940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 7950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 7960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int3 javaResult = new Int3( 7970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResultLinear % dimX, 7980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (javaResultLinear / dimX) % dimY, 7990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResultLinear / (dimX * dimY)); 8000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaCellVal = inputArray[javaResult.x + dimX * javaResult.y + dimX * dimY * javaResult.z]; 8010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 8030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 8050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks typeBuilder.setX(dimX).setY(dimY).setZ(dimZ); 8060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 8070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 8090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copy3DRangeFrom(0, 0, 0, dimX, dimY, dimZ, inputArray); 8110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 8130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int3 rsResult = s.reduce_fz3(inputAllocation).get(); 8140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 8150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsCellVal = inputArray[rsResult.x + dimX * rsResult.y + dimX * dimY * rsResult.z]; 8170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (rsCellVal == 0); 8180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String status = (success ? "PASSED" : "FAILED"); 8190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (success) 8200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks status += " " + timing.string(javaTimeStart, javaTimeEnd, rsTimeStart, 8210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation); 8220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 8230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks "fz3: java input[" + javaResult.x + ", " + javaResult.y + ", " + javaResult.z + "] == " + javaCellVal + 8240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs input[" + rsResult.x + ", " + rsResult.y + ", " + rsResult.z + "] == " + rsCellVal + ": " + status); 8250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 8260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 8270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 8280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 8300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static final int histogramBucketCount = 256; 8320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long[] histogram(RenderScript RS, final byte[] inputArray) { 8340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.U8(RS), inputArray.length); 8350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copyFrom(inputArray); 8360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation outputAllocation = Allocation.createSized(RS, Element.U32(RS), histogramBucketCount); 8380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ScriptIntrinsicHistogram scriptHsg = ScriptIntrinsicHistogram.create(RS, Element.U8(RS)); 8400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks scriptHsg.setOutput(outputAllocation); 8410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks scriptHsg.forEach(inputAllocation); 8420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] outputArrayMistyped = new int[histogramBucketCount]; 8440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks outputAllocation.copyTo(outputArrayMistyped); 8450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks long[] outputArray = new long[histogramBucketCount]; 8470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < histogramBucketCount; ++i) 8480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks outputArray[i] = outputArrayMistyped[i] & (long) 0xffffffff; 8490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 8510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks outputAllocation.destroy(); 8520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks scriptHsg.destroy(); 8540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return outputArray; 8550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 8560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean histogram_array(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 8580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final byte[] inputArray = createInputArrayByte(size[0], seed); 8590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] javaResult = histogram(RS, inputArray); 8610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertEquals("javaResult length", histogramBucketCount, javaResult.length); 8620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] rsResult = s.reduce_histogram(inputArray).get(); 8630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertEquals("rsResult length", histogramBucketCount, rsResult.length); 8640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result("histogram_array", new timing(size[0]), javaResult, rsResult); 8660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 8670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean histogram(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 8690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final byte[] inputArray = createInputArrayByte(size[0], seed); 8700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 8720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] javaResult = histogram(RS, inputArray); 8730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 8740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertEquals("javaResult length", histogramBucketCount, javaResult.length); 8750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 8770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.U8(RS), inputArray.length); 8790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 8810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copyFrom(inputArray); 8830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 8850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] rsResult = s.reduce_histogram(inputAllocation).get(); 8860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 8870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertEquals("rsResult length", histogramBucketCount, rsResult.length); 8880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // NOTE: The "java time" is actually for the RenderScript histogram intrinsic 8900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = 8910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result("histogram", 8920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, 8930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks copyTimeStart, kernelTimeStart, rsTimeEnd, inputAllocation), 8940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResult, rsResult); 8950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.destroy(); 8960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 8970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 8980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 8990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks //----------------------------------------------------------------- 9000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean patternRedundantGet(RenderScript RS, ScriptC_reduce s) { 9020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Ensure that get() can be called multiple times on the same 9030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // result, and returns the same object each time. 9040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 9060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputLength = 1 << 18; 9080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final byte[] inputArray = createInputArrayByte(inputLength, 789); 9090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] javaResult = histogram(RS, inputArray); 9110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertEquals("javaResult length", histogramBucketCount, javaResult.length); 9120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final ScriptC_reduce.resultArray256_uint rsResultFuture = s.reduce_histogram(inputArray); 9140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] rsResult1 = rsResultFuture.get(); 9150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertEquals("rsResult1 length", histogramBucketCount, rsResult1.length); 9160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= result("patternRedundantGet (1)", new timing(inputLength), javaResult, rsResult1); 9170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] rsResult2 = rsResultFuture.get(); 9190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= result("patternRedundantGet (2)", new timing(inputLength), javaResult, rsResult2); 9200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (rsResult1 == rsResult2); 9220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, "patternRedundantGet (object equality): " + (success ? "PASSED" : "FAILED")); 9230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= success; 9240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 9260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 9270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks //----------------------------------------------------------------- 9290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private Int2 mode(RenderScript RS, final byte[] inputArray) { 9310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks long[] hsg = histogram(RS, inputArray); 9320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int modeIdx = 0; 9340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 1; i < hsg.length; ++i) 9350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (hsg[i] > hsg[modeIdx]) modeIdx = i; 9360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return new Int2(modeIdx, (int) hsg[modeIdx]); 9370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 9380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean mode_array(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 9400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final byte[] inputArray = createInputArrayByte(size[0], seed); 9410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 javaResult = mode(RS, inputArray); 9430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 rsResult = s.reduce_mode(inputArray).get(); 9440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result("mode", new timing(size[0]), javaResult, rsResult); 9460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 9470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 9490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long sumgcd(final int in1[], final int in2[]) { 9510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertEquals("sumgcd input lengths", in1.length, in2.length); 9520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks long sum = 0; 9540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < in1.length; ++i) { 9550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int a = in1[i], b = in2[i]; 9560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks while (b != 0) { 9580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int aNew = b; 9590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int bNew = a % b; 9600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks a = aNew; 9620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks b = bNew; 9630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 9640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks sum += a; 9660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 9670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return sum; 9680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 9690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean sumgcd(RenderScript RS, ScriptC_reduce s, int seed, int size[]) { 9710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int len = size[0]; 9720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] inputArrayA = createInputArrayInt(len, seed + 0); 9740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] inputArrayB = createInputArrayInt(len, seed + 1); 9750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeStart = java.lang.System.currentTimeMillis(); 9770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaResult = sumgcd(inputArrayA, inputArrayB); 9780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long javaTimeEnd = java.lang.System.currentTimeMillis(); 9790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeStart = java.lang.System.currentTimeMillis(); 9810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocationA = Allocation.createSized(RS, Element.I32(RS), len); 9830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocationB = Allocation.createSized(RS, Element.I32(RS), len); 9840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long copyTimeStart = java.lang.System.currentTimeMillis(); 9860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocationA.copyFrom(inputArrayA); 9880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocationB.copyFrom(inputArrayB); 9890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long kernelTimeStart = java.lang.System.currentTimeMillis(); 9910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsResult = s.reduce_sumgcd(inputAllocationA, inputAllocationB).get(); 9920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long rsTimeEnd = java.lang.System.currentTimeMillis(); 9930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 9940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = 9950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result("sumgcd", 9960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new timing(javaTimeStart, javaTimeEnd, rsTimeStart, copyTimeStart, kernelTimeStart, rsTimeEnd, 9970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocationA, inputAllocationB), 9980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks javaResult, rsResult); 9990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocationA.destroy(); 10000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocationB.destroy(); 10010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 10020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 10030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 10050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Return an array of sparse integer values from 0 to maxVal inclusive. 10070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // The array consists of all values k*sparseness (k a nonnegative integer) 10080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // that are less than maxVal, and maxVal itself. For example, if maxVal 10090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // is 20 and sparseness is 6, then the result is { 0, 6, 12, 18, 20 }; 10100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // and if maxVal is 20 and sparseness is 10, then the result is { 0, 10, 20 }. 10110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // 10120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // The elements of the array are sorted in increasing order. 10130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // 10140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // maxVal -- must be nonnegative 10150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // sparseness -- must be positive 10160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static int[] computeSizePoints(int maxVal, int sparseness) { 10170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertTrue((maxVal >= 0) && (sparseness > 0)); 10180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean maxValIsExtra = ((maxVal % sparseness) != 0); 10200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] result = new int[1 + maxVal / sparseness + (maxValIsExtra ? 1 : 0)]; 10210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i * sparseness <= maxVal; ++i) 10230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result[i] = i * sparseness; 10240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (maxValIsExtra) 10250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks result[result.length - 1] = maxVal; 10260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result; 10280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 10290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static final int maxSeedsPerTest = 10; 10310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks static interface Test { 10330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // A test execution is characterized by two properties: A seed 10340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // and a size. 10350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // 10360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // The seed is used for generating pseudorandom input data. 10370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Ideally, we use different seeds for different tests and for 10380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // different executions of the same test at different sizes. 10390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // A test with multiple blocks of input data (i.e., for a 10400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // reduction with multiple inputs) may want multiple seeds; it 10410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // may use the seeds seed..seed+maxSeedsPerTest-1. 10420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // 10430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // The size indicates the amount of input data. It is the number 10440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // of cells in a particular dimension of the iteration space. 10450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean run(RenderScript RS, ScriptC_reduce s, int seed, int[] size); 10460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 10470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks static class TestDescription { 10490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public TestDescription(String myTestName, Test myTest, int mySeed, int[] myDefSize, 10500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int myLog2MaxSize, int mySparseness) { 10510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testName = myTestName; 10520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks test = myTest; 10530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks seed = mySeed; 10540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks defSize = myDefSize; 10550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks log2MaxSize = myLog2MaxSize; 10560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks sparseness = mySparseness; 10570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 10580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public TestDescription(String myTestName, Test myTest, int mySeed, int[] myDefSize, int myLog2MaxSize) { 10600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testName = myTestName; 10610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks test = myTest; 10620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks seed = mySeed; 10630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks defSize = myDefSize; 10640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks log2MaxSize = myLog2MaxSize; 10650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks sparseness = 1; 10660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 10670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public TestDescription(String myTestName, Test myTest, int mySeed, int[] myDefSize) { 10690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testName = myTestName; 10700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks test = myTest; 10710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks seed = mySeed; 10720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks defSize = myDefSize; 10730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks log2MaxSize = -1; 10740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks sparseness = 1; 10750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 10760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public final String testName; 10780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public final Test test; 10800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // When executing the test, scale this up by maxSeedsPerTest. 10820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public final int seed; 10830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // If we're only going to run the test once, what size should 10850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // we use? The length of the array is the number of 10860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // dimensions of the input data. 10870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public final int[] defSize; 10880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // If we're going to run the test over a range of sizes, what 10900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // is the maximum size to use? (This constrains the number of 10910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // cells of the input data, not the number of cells ALONG A 10920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // PARTICULAR DIMENSION of the input data.) 10930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public final int log2MaxSize; 10940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 10950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // If we're going to run the test "exhaustively" over a range 10960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // of sizes, what is the size of a step through the range? 10970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // 10980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // For 1D, must be 1. 10990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public final int sparseness; 11000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 11010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean run(TestDescription td, RenderScript RS, ScriptC_reduce s, int seed, int[] size) { 11030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks String arrayContent = ""; 11040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < size.length; ++i) { 11050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (i != 0) 11060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks arrayContent += ", "; 11070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks arrayContent += size[i]; 11080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 11090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, "Running " + td.testName + "(seed = " + seed + ", size[] = {" + arrayContent + "})"); 11100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return td.test.run(RS, s, seed, size); 11110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 11120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private final TestDescription[] correctnessTests = { 11140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // alloc and array variants of the same test will use the same 11150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // seed, in case results need to be compared. 11160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("addint1D", this::addint1D, 0, new int[]{100000}, 20), 11180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("addint1D_array", this::addint1D_array, 0, new int[]{100000}, 20), 11190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("addint2D", this::addint2D, 1, new int[]{450, 225}, 20, 5), 11200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("addint3D", this::addint3D, 2, new int[]{37, 48, 49}, 20, 7), 11210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Bool and NaN variants of the same test will use the same 11230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // seed, in case results need to be compared. 11240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("findMinAbsBool", this::findMinAbsBool, 3, new int[]{100000}, 20), 11250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("findMinAbsNaN", this::findMinAbsNaN, 3, new int[]{100000}, 20), 11260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("findMinAbsBoolInf", this::findMinAbsBoolInf, 4, new int[]{100000}, 20), 11270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("findMinAbsNaNInf", this::findMinAbsNaNInf, 4, new int[]{100000}, 20), 11280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("findMinAndMax", this::findMinAndMax, 5, new int[]{100000}, 20), 11300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("findMinAndMax_array", this::findMinAndMax_array, 5, new int[]{100000}, 20), 11310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("findMinMat2", this::findMinMat2, 6, new int[]{25000}, 17), 11320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("findMinMat4", this::findMinMat4, 7, new int[]{10000}, 15), 11330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("fz", this::fz, 8, new int[]{100000}, 20), 11340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("fz_array", this::fz_array, 8, new int[]{100000}, 20), 11350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("fz2", this::fz2, 9, new int[]{225, 450}, 20, 5), 11360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("fz3", this::fz3, 10, new int[]{59, 48, 37}, 20, 7), 11370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("histogram", this::histogram, 11, new int[]{100000}, 20), 11380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("histogram_array", this::histogram_array, 11, new int[]{100000}, 20), 11390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // might want to add: new TestDescription("mode", this::mode, 12, new int[]{100000}, 20), 11400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("mode_array", this::mode_array, 12, new int[]{100000}, 20), 11410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("sumgcd", this::sumgcd, 13, new int[]{1 << 16}, 20) 11420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks }; 11430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean runCorrectnessQuick(RenderScript RS, ScriptC_reduce s) { 11450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 11460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (TestDescription td : correctnessTests) { 11480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= run(td, RS, s, maxSeedsPerTest * td.seed, td.defSize); 11490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 11500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 11520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 11530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // NOTE: Each test execution gets maxSeedsPerTest, and there are 11550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // up to 3 + 5*log2MaxSize test executions in the full (as opposed 11560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // to quick) correctness run of a particular test description, and 11570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // we need an additional seed for pseudorandom size generation. 11580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Assuming log2MaxSize does not exceed 32, then it should be 11590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // sufficient to reserve 1 + (3+5*32)*maxSeedsPerTest seeds per 11600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // TestDescription. 11610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // 11620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // See runCorrectness1D(). 11630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static final int seedsPerTestDescriptionCorrectness1D = 1 + (3 + 5 * 32) * maxSeedsPerTest; 11640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // NOTE: Each test execution gets maxSeedsPerTest, and there are 11660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // about 11*((log2MaxSize+1)**2) test executions in the full (as 11670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // opposed to quick) correctness run of a particular test 11680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // description, and we need a seed for pseudorandom size 11690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // generation. Assuming log2MaxSize does not exceed 32, then it 11700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // should be sufficient to reserve 1 + 11*1089*maxSeedsPerTest 11710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // seeds per TestDescription. 11720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // 11730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // See runCorrectness2D(). 11740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static final int seedsPerTestDescriptionCorrectness2D = 1 + (11 * 1089) * maxSeedsPerTest; 11750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // NOTE: Each test execution gets maxSeedsPerTest, and there are 11770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // about 27*((log2MaxSize+1)**3) + 6*((log2MaxSize+1)**2) test 11780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // executions in the full (as opposed to quick) correctness run of 11790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // a particular test description, and we need a seed for (c). 11800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Assuming log2MaxSize does not exceed 32, then it should 11810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // be sufficient to reserve 1 + (27*(33**3) + 6*(33**2))*maxSeedsPerTest 11820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // seeds per TestDescription, which can be simplified upwards to 11830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // 1 + (28*(33**3))*maxSeedsPerTest seeds per TestDescription. 11840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static final int seedsPerTestDescriptionCorrectness3D = 1 + (28 * 35937) * maxSeedsPerTest; 11850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Each test execution gets a certain number of seeds, and a full 11870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (as opposed to quick) correctness run of a particular 11880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // TestDescription consists of some number of executions (each of 11890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // which needs up to maxSeedsPerTest) and may require some 11900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // additional seeds. 11910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static final int seedsPerTestDescriptionCorrectness = 11920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Math.max(seedsPerTestDescriptionCorrectness1D, 11930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Math.max(seedsPerTestDescriptionCorrectness2D, 11940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks seedsPerTestDescriptionCorrectness3D)); 11950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean runCorrectness(RenderScript RS, ScriptC_reduce s) { 11970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 11980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 11990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (TestDescription td : correctnessTests) { 12000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks switch (td.defSize.length) { 12010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks case 1: 12020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= runCorrectness1D(td, RS, s); 12030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks break; 12040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks case 2: 12050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= runCorrectness2D(td, RS, s); 12060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks break; 12070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks case 3: 12080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= runCorrectness3D(td, RS, s); 12090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks break; 12100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks default: 12110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertTrue("unexpected defSize.length " + td.defSize.length, false); 12120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= false; 12130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks break; 12140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 12180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean runCorrectness1D(TestDescription td, RenderScript RS, ScriptC_reduce s) { 12210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertEquals(1, td.sparseness); 12220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int log2MaxSize = td.log2MaxSize; 12230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertTrue(log2MaxSize >= 0); 12240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 12260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // We will execute the test with the following sizes: 12280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (a) Each power of 2 from zero (2**0) up to log2MaxSize (2**log2MaxSize) 12290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (b) Each size from (a) +/-1 12300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (c) 2 random sizes between each pair of adjacent points in (a) 12310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] testSizes = new int[ 12320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /* a */ (1 + log2MaxSize) + 12330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /* b */ 2 * (1 + log2MaxSize) + 12340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /* c */ 2 * log2MaxSize]; 12350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // See seedsPerTestDescriptionCorrectness1D 12360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int seedForPickingTestSizes = td.seed * seedsPerTestDescriptionCorrectness; 12380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int nextTestIdx = 0; 12400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Fill in (a) and (b) 12420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i <= log2MaxSize; ++i) { 12430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int pwrOf2 = 1 << i; 12440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizes[nextTestIdx++] = pwrOf2; /* a */ 12450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizes[nextTestIdx++] = pwrOf2 - 1; /* b */ 12460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizes[nextTestIdx++] = pwrOf2 + 1; /* b */ 12470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Fill in (c) 12500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Random r = new Random(seedForPickingTestSizes); 12510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < log2MaxSize; ++i) { 12520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int lo = (1 << i) + 1; 12530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int hi = 1 << (i + 1); 12540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (lo < hi) { 12560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int j = 0; j < 2; ++j) { 12570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizes[nextTestIdx++] = r.nextInt(hi - lo) + lo; 12580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Arrays.sort(testSizes); 12630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] lastTestSizeArg = new int[]{-1}; 12650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < testSizes.length; ++i) { 12660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if ((testSizes[i] > 0) && (testSizes[i] != lastTestSizeArg[0])) { 12670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks lastTestSizeArg[0] = testSizes[i]; 12680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int seedForTestExecution = seedForPickingTestSizes + 1 + i * maxSeedsPerTest; 12690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= run(td, RS, s, seedForTestExecution, lastTestSizeArg); 12700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 12740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 12750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean runCorrectness2D(TestDescription td, RenderScript RS, ScriptC_reduce s) { 12770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int log2MaxSize = td.log2MaxSize, maxSize = 1 << log2MaxSize, sparseness = td.sparseness; 12780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertTrue((log2MaxSize >= 0) && (sparseness >= 1)); 12790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 12810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] sizePoints = computeSizePoints(log2MaxSize, sparseness); 12830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // We will execute the test with the following sizes: 12850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (a) Each dimension at a power of 2 from sizePoints[] 12860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /// such that the sum of the exponents does not exceed 12870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // log2MaxSize 12880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (b) Each size from (a) with one or both dimensions +/-1, 12890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // except where this would exceed 2**log2MaxSize 12900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (c) Approximately 2*(sizePoints.length**2) random sizes 12910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ArrayList<int[]> testSizesList = new ArrayList<int[]>(); 12920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // See seedsPerTestDescriptionCorrectness2D 12930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int seedForPickingTestSizes = td.seed * seedsPerTestDescriptionCorrectness; 12950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 12960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Fill in (a) and (b) 12970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i : sizePoints) { 12980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int iPwrOf2 = 1 << i; 12990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int iDelta = -1; iDelta <= 1; ++iDelta) { 13000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int iSize = iPwrOf2 + iDelta; 13010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int j : sizePoints) { 13020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int jPwrOf2 = 1 << j; 13030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int jDelta = -1; jDelta <= 1; ++jDelta) { 13040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int jSize = jPwrOf2 + jDelta; 13050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if ((long) iSize * (long) jSize <= maxSize) 13060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{iSize, jSize}); 13070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Fill in (c) 13130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Random r = new Random(seedForPickingTestSizes); 13140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i : sizePoints) { 13150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int j : sizePoints) { 13160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int size0 = 1 + r.nextInt(1 << i); 13170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int size1 = 1 + r.nextInt(maxSize / size0); 13180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{size0, size1}); 13200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{size1, size0}); 13210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[][] testSizes = testSizesList.toArray(new int[0][]); 13250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Arrays.sort(testSizes, 13260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (a, b) -> { 13270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int comp0 = ((Integer) a[0]).compareTo(b[0]); 13280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return (comp0 != 0 ? comp0 : ((Integer) a[1]).compareTo(b[1])); 13290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks }); 13300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] lastTestSizeArg = null; 13320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < testSizes.length; ++i) { 13330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if ((testSizes[i][0] <= 0) || (testSizes[i][1] <= 0)) 13340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks continue; 13350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if ((lastTestSizeArg != null) && 13360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (testSizes[i][0] == lastTestSizeArg[0]) && 13370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (testSizes[i][1] == lastTestSizeArg[1])) 13380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks continue; 13390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks lastTestSizeArg = testSizes[i]; 13400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int seedForTestExecution = seedForPickingTestSizes + 1 + i * maxSeedsPerTest; 13410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= run(td, RS, s, seedForTestExecution, lastTestSizeArg); 13420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 13450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean runCorrectness3D(TestDescription td, RenderScript RS, ScriptC_reduce s) { 13480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int log2MaxSize = td.log2MaxSize, maxSize = 1 << log2MaxSize, sparseness = td.sparseness; 13490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks assertTrue((log2MaxSize >= 0) && (sparseness >= 1)); 13500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 13520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] sizePoints = computeSizePoints(log2MaxSize, sparseness); 13540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // We will execute the test with the following sizes: 13560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (a) Each dimension at a power of 2 from sizePoints[] 13570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /// such that the sum of the exponents does not exceed 13580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // log2MaxSize 13590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (b) Each size from (a) with one or both dimensions +/-1, 13600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // except where this would exceed 2**log2MaxSize 13610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // (c) Approximately 6*(sizePoints.length**2) random sizes 13620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ArrayList<int[]> testSizesList = new ArrayList<int[]>(); 13630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // See seedsPerTestDescriptionCorrectness3D 13640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int seedForPickingTestSizes = td.seed * seedsPerTestDescriptionCorrectness; 13660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Fill in (a) and (b) 13680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i : sizePoints) { 13690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int iPwrOf2 = 1 << i; 13700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int iDelta = -1; iDelta <= 1; ++iDelta) { 13710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int iSize = iPwrOf2 + iDelta; 13720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int j : sizePoints) { 13730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int jPwrOf2 = 1 << j; 13740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int jDelta = -1; jDelta <= 1; ++jDelta) { 13750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int jSize = jPwrOf2 + jDelta; 13760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int k : sizePoints) { 13770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int kPwrOf2 = 1 << k; 13780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int kDelta = -1; kDelta <= 1; ++kDelta) { 13790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int kSize = kPwrOf2 + kDelta; 13800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if ((long) iSize * (long) jSize * (long) kSize <= maxSize) 13810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{iSize, jSize, kSize}); 13820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 13880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Fill in (c) 13900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Random r = new Random(seedForPickingTestSizes); 13910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i : sizePoints) { 13920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int j : sizePoints) { 13930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int size0 = 1 + r.nextInt(1 << i); 13940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int size1 = 1 + r.nextInt(Math.min(1 << j, maxSize / size0)); 13950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int size2 = 1 + r.nextInt(maxSize / (size0 * size1)); 13960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 13970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{size0, size1, size2}); 13980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{size0, size2, size1}); 13990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{size1, size0, size2}); 14000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{size1, size2, size0}); 14010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{size2, size0, size1}); 14020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testSizesList.add(new int[]{size2, size1, size0}); 14030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 14040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 14050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[][] testSizes = testSizesList.toArray(new int[0][]); 14070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Arrays.sort(testSizes, 14080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (a, b) -> { 14090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int comp = ((Integer) a[0]).compareTo(b[0]); 14100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (comp == 0) 14110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks comp = ((Integer) a[1]).compareTo(b[1]); 14120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (comp == 0) 14130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks comp = ((Integer) a[2]).compareTo(b[2]); 14140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return comp; 14150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks }); 14160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] lastTestSizeArg = null; 14180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < testSizes.length; ++i) { 14190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if ((testSizes[i][0] <= 0) || (testSizes[i][1] <= 0) || (testSizes[i][2] <= 0)) 14200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks continue; 14210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if ((lastTestSizeArg != null) && 14220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (testSizes[i][0] == lastTestSizeArg[0]) && 14230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (testSizes[i][1] == lastTestSizeArg[1]) && 14240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (testSizes[i][2] == lastTestSizeArg[2])) 14250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks continue; 14260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Apply Z-dimension limiting. 14280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // 14290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // The Z dimension is always handled specially by GPU 14300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // drivers, and a high value for this dimension can have 14310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // serious performance implications. For example, Cuda 14320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // and OpenCL encourage Z to be the smallest dimension. 14330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (testSizes[i][2] > 1024) 14340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks continue; 14350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks lastTestSizeArg = testSizes[i]; 14370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int seedForTestExecution = seedForPickingTestSizes + 1 + i * maxSeedsPerTest; 14380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= run(td, RS, s, seedForTestExecution, lastTestSizeArg); 14390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 14400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 14420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 14430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private final TestDescription[] performanceTests = { 14450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("addint1D", this::addint1D, 0, new int[]{100000 << 10}), 14460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("addint2D", this::addint2D, 1, new int[]{450 << 5, 225 << 5}), 14470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("addint3D", this::addint3D, 2, new int[]{37 << 3, 48 << 3, 49 << 3}), 14480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("findMinAndMax", this::findMinAndMax, 3, new int[]{100000 << 9}), 14490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("fz", this::fz, 4, new int[]{100000 << 10}), 14500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("fz2", this::fz2, 5, new int[]{225 << 5, 450 << 5}), 14510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("fz3", this::fz3, 6, new int[]{59 << 3, 48 << 3, 37 << 3}), 14520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("histogram", this::histogram, 7, new int[]{100000 << 10}), 14530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // might want to add: new TestDescription("mode", this::mode, 8, new int[]{100000}), 14540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks new TestDescription("sumgcd", this::sumgcd, 9, new int[]{1 << 21}) 14550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks }; 14560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean runPerformanceQuick(RenderScript RS, ScriptC_reduce s) { 14580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 14590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (TestDescription td : performanceTests) { 14610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= run(td, RS, s, maxSeedsPerTest * td.seed, td.defSize); 14620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 14630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 14650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 14660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean runCorrectnessPatterns(RenderScript RS, ScriptC_reduce s) { 14680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Test some very specific usage patterns. 14690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 14700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= patternDuplicateAnonymousResult(RS, s); 14720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= patternFindMinAndMaxInf(RS, s); 14730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= patternInterleavedReduce(RS, s); 14740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= patternRedundantGet(RS, s); 14750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return pass; 14770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 14780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public void run() { 14800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks RenderScript pRS = createRenderScript(false); 14810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ScriptC_reduce s = new ScriptC_reduce(pRS); 14820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks s.set_negInf(Float.NEGATIVE_INFINITY); 14830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks s.set_posInf(Float.POSITIVE_INFINITY); 14840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 14860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= runCorrectnessPatterns(pRS, s); 14880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= runCorrectnessQuick(pRS, s); 14890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= runCorrectness(pRS, s); 14900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // pass &= runPerformanceQuick(pRS, s); 14910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pRS.finish(); 14930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks s.destroy(); 14940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pRS.destroy(); 14950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 14960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, pass ? "PASSED" : "FAILED"); 14970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (pass) 14980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks passTest(); 14990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks else 15000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks failTest(); 15010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 15020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks} 15030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 15040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks// TODO: Add machinery for easily running fuller (i.e., non-sparse) testing. 1505