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/* This is a much simpler version of UT_reduce.java that 200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * exercises pragmas after the functions (backward reference), 210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * whereas the other test case exercises the pragmas before the 220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * 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.Random; 390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubankspublic class UT_reduce_backward extends UnitTest { 410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static final String TAG = "reduce_backward"; 420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public UT_reduce_backward(Context ctx) { 440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks super("reduce_backward", ctx); 450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private byte[] createInputArrayByte(int len, int seed) { 480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks byte[] array = new byte[len]; 490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (new Random(seed)).nextBytes(array); 500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return array; 510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private float[] createInputArrayFloat(int len, int seed) { 540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Random rand = new Random(seed); 550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float[] array = new float[len]; 560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < len; ++i) 570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks array[i] = rand.nextFloat(); 580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return array; 590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private int[] createInputArrayInt(int len, int seed) { 620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Random rand = new Random(seed); 630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] array = new int[len]; 640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < len; ++i) 650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks array[i] = rand.nextInt(); 660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return array; 670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private int[] createInputArrayInt(int len, int seed, int eltRange) { 700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Random rand = new Random(seed); 710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] array = new int[len]; 720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < len; ++i) 730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks array[i] = rand.nextInt(eltRange); 740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return array; 750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private <T extends Number> boolean result(String testName, T javaRslt, T rsRslt) { 780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = javaRslt.equals(rsRslt); 790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testName + ": java " + javaRslt + ", rs " + rsRslt + ": " + 810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (success ? "PASSED" : "FAILED")); 820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean result(String testName, Float2 javaRslt, Float2 rsRslt) { 860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (javaRslt.x == rsRslt.x) && (javaRslt.y == rsRslt.y); 870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testName + 890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ": java (" + javaRslt.x + ", " + javaRslt.y + ")" + 900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs (" + rsRslt.x + ", " + rsRslt.y + ")" + 910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ": " + (success ? "PASSED" : "FAILED")); 920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean result(String testName, Int2 javaRslt, Int2 rsRslt) { 960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (javaRslt.x == rsRslt.x) && (javaRslt.y == rsRslt.y); 970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks testName + 990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ": java (" + javaRslt.x + ", " + javaRslt.y + ")" + 1000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ", rs (" + rsRslt.x + ", " + rsRslt.y + ")" + 1010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ": " + (success ? "PASSED" : "FAILED")); 1020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 1030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 1060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private int addint(int[] input) { 1080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int rslt = 0; 1090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int idx = 0; idx < input.length; ++idx) 1100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks rslt += input[idx]; 1110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return rslt; 1120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean addint1D(RenderScript RS, ScriptC_reduce_backward s) { 1150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] input = createInputArrayInt(100000, 0, 1 << 13); 1160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaRslt = addint(input); 1180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsRslt = s.reduce_addint(input).get(); 1190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result("addint1D", javaRslt, rsRslt); 1210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean addint2D(RenderScript RS, ScriptC_reduce_backward s) { 1240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimX = 450, dimY = 225; 1250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int[] inputArray = createInputArrayInt(dimX * dimY, 1, 1 << 13); 1270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 1280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks typeBuilder.setX(dimX).setY(dimY); 1290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 1300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray); 1310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int javaRslt = addint(inputArray); 1330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsRslt = s.reduce_addint(inputAllocation).get(); 1340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result("addint2D", javaRslt, rsRslt); 1360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 1390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private Int2 findMinAndMax(float[] input) { 1410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float minVal = Float.POSITIVE_INFINITY; 1420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int minIdx = -1; 1430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks float maxVal = Float.NEGATIVE_INFINITY; 1440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int maxIdx = -1; 1450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int idx = 0; idx < input.length; ++idx) { 1470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (input[idx] < minVal) { 1480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks minVal = input[idx]; 1490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks minIdx = idx; 1500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (input[idx] > maxVal) { 1520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks maxVal = input[idx]; 1530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks maxIdx = idx; 1540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return new Int2(minIdx, maxIdx); 1580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean findMinAndMax(RenderScript RS, ScriptC_reduce_backward s) { 1610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final float[] input = createInputArrayFloat(100000, 4); 1620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 javaRslt = findMinAndMax(input); 1640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 rsRslt = s.reduce_findMinAndMax(input).get(); 1650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // Note that the Java and RenderScript algorithms are not 1670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // guaranteed to find the same cells -- but they should 1680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // find cells of the same value. 1690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Float2 javaVal = new Float2(input[javaRslt.x], input[javaRslt.y]); 1700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Float2 rsVal = new Float2(input[rsRslt.x], input[rsRslt.y]); 1710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result("findMinAndMax", javaVal, rsVal); 1730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 1760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean fz(RenderScript RS, ScriptC_reduce_backward s) { 1780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputLen = 100000; 1790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] input = createInputArrayInt(inputLen, 5); 1800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // just in case we got unlucky 1810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks input[(new Random(6)).nextInt(inputLen)] = 0; 1820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int rsRslt = s.reduce_fz(input).get(); 1840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (input[rsRslt] == 0); 1860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 1870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks "fz: input[" + rsRslt + "] == " + input[rsRslt] + ": " + 1880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (success ? "PASSED" : "FAILED")); 1890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 1900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 1910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 1930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean fz2(RenderScript RS, ScriptC_reduce_backward s) { 1950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimX = 225, dimY = 450; 1960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputLen = dimX * dimY; 1970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 1980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, 7); 1990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // just in case we got unlucky 2000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputArray[(new Random(8)).nextInt(inputLen)] = 0; 2010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 2030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks typeBuilder.setX(dimX).setY(dimY); 2040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 2050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray); 2060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 rsRslt = s.reduce_fz2(inputAllocation).get(); 2080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int cellVal = inputArray[rsRslt.x + dimX * rsRslt.y]; 2100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (cellVal == 0); 2110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 2120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks "fz2: input[" + rsRslt.x + ", " + rsRslt.y + "] == " + cellVal + ": " + 2130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (success ? "PASSED" : "FAILED")); 2140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 2150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 2180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean fz3(RenderScript RS, ScriptC_reduce_backward s) { 2200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int dimX = 59, dimY = 48, dimZ = 37; 2210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int inputLen = dimX * dimY * dimZ; 2220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, 9); 2240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks // just in case we got unlucky 2250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputArray[(new Random(10)).nextInt(inputLen)] = 0; 2260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 2280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks typeBuilder.setX(dimX).setY(dimY).setZ(dimZ); 2290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 2300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copy3DRangeFrom(0, 0, 0, dimX, dimY, dimZ, inputArray); 2310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int3 rsRslt = s.reduce_fz3(inputAllocation).get(); 2330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final int cellVal = inputArray[rsRslt.x + dimX * rsRslt.y + dimX * dimY * rsRslt.z]; 2350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final boolean success = (cellVal == 0); 2360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 2370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks "fz3: input[" + rsRslt.x + ", " + rsRslt.y + ", " + rsRslt.z + "] == " + cellVal + ": " + 2380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks (success ? "PASSED" : "FAILED")); 2390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return success; 2400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 2430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private static final int histogramBucketCount = 256; 2450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private long[] histogram(RenderScript RS, final byte[] inputArray) { 2470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.U8(RS), inputArray.length); 2480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks inputAllocation.copyFrom(inputArray); 2490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Allocation outputAllocation = Allocation.createSized(RS, Element.U32(RS), histogramBucketCount); 2510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ScriptIntrinsicHistogram scriptHsg = ScriptIntrinsicHistogram.create(RS, Element.U8(RS)); 2530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks scriptHsg.setOutput(outputAllocation); 2540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks scriptHsg.forEach(inputAllocation); 2550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int[] outputArrayMistyped = new int[histogramBucketCount]; 2570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks outputAllocation.copyTo(outputArrayMistyped); 2580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks long[] outputArray = new long[histogramBucketCount]; 2600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < histogramBucketCount; ++i) 2610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks outputArray[i] = outputArrayMistyped[i] & (long) 0xffffffff; 2620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return outputArray; 2630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean histogram(RenderScript RS, ScriptC_reduce_backward s) { 2660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final byte[] inputArray = createInputArrayByte(100000, 11); 2670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] javaRslt = histogram(RS, inputArray); 2690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks _RS_ASSERT("javaRslt unexpected length: " + javaRslt.length, javaRslt.length == histogramBucketCount); 2700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final long[] rsRslt = s.reduce_histogram(inputArray).get(); 2710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks _RS_ASSERT("rsRslt unexpected length: " + rsRslt.length, rsRslt.length == histogramBucketCount); 2720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 0; i < histogramBucketCount; ++i) { 2740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (javaRslt[i] != rsRslt[i]) { 2750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, 2760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks "histogram[" + i + "]: java " + javaRslt[i] + ", rs " + rsRslt[i] + ": FAILED"); 2770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return false; 2780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, "histogram: PASSED"); 2820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return true; 2830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks //----------------------------------------------------------------- 2860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private Int2 mode(RenderScript RS, final byte[] inputArray) { 2880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks long[] hsg = histogram(RS, inputArray); 2890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks int modeIdx = 0; 2910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks for (int i = 1; i < hsg.length; ++i) 2920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (hsg[i] > hsg[modeIdx]) modeIdx = i; 2930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return new Int2(modeIdx, (int) hsg[modeIdx]); 2940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 2950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks private boolean mode(RenderScript RS, ScriptC_reduce_backward s) { 2970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final byte[] inputArray = createInputArrayByte(100000, 12); 2980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 2990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 javaRslt = mode(RS, inputArray); 3000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks final Int2 rsRslt = s.reduce_mode(inputArray).get(); 3010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks return result("mode", javaRslt, rsRslt); 3030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 3040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks /////////////////////////////////////////////////////////////////// 3060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks public void run() { 3080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks RenderScript pRS = createRenderScript(false); 3090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks ScriptC_reduce_backward s = new ScriptC_reduce_backward(pRS); 3100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks s.set_negInf(Float.NEGATIVE_INFINITY); 3110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks s.set_posInf(Float.POSITIVE_INFINITY); 3120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks boolean pass = true; 3140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= addint1D(pRS, s); 3150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= addint2D(pRS, s); 3160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= findMinAndMax(pRS, s); 3170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= fz(pRS, s); 3180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= fz2(pRS, s); 3190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= fz3(pRS, s); 3200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= histogram(pRS, s); 3210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pass &= mode(pRS, s); 3220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pRS.finish(); 3240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks pRS.destroy(); 3250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks 3260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks Log.i(TAG, pass ? "PASSED" : "FAILED"); 3270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks if (pass) 3280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks passTest(); 3290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks else 3300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks failTest(); 3310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks } 3320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks} 333