11a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks/* 21a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Copyright (C) 2017 The Android Open Source Project 31a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * 41a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Licensed under the Apache License, Version 2.0 (the "License"); 51a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * you may not use this file except in compliance with the License. 61a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * You may obtain a copy of the License at 71a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * 81a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * http://www.apache.org/licenses/LICENSE-2.0 91a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * 101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Unless required by applicable law or agreed to in writing, software 111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * distributed under the License is distributed on an "AS IS" BASIS, 121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * See the License for the specific language governing permissions and 141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * limitations under the License. 151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks */ 161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks/* This is a much simpler version of UT_reduce.java that 181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * exercises pragmas after the functions (backward reference), 191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * whereas the other test case exercises the pragmas before the 201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * functions (forward reference). 211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks */ 221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubankspackage com.android.rs.unittest; 241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.content.Context; 261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Allocation; 271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Element; 281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Float2; 291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Int2; 301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Int3; 311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.RenderScript; 321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.ScriptIntrinsicHistogram; 331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Type; 341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.util.Log; 351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport java.util.Random; 371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubankspublic class UT_reduce_backward extends UnitTest { 391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static final String TAG = "reduce_backward"; 401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public UT_reduce_backward(Context ctx) { 421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks super("reduce_backward", ctx); 431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private byte[] createInputArrayByte(int len, int seed) { 461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks byte[] array = new byte[len]; 471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (new Random(seed)).nextBytes(array); 481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return array; 491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private float[] createInputArrayFloat(int len, int seed) { 521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Random rand = new Random(seed); 531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float[] array = new float[len]; 541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < len; ++i) 551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks array[i] = rand.nextFloat(); 561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return array; 571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private int[] createInputArrayInt(int len, int seed) { 601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Random rand = new Random(seed); 611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] array = new int[len]; 621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < len; ++i) 631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks array[i] = rand.nextInt(); 641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return array; 651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private int[] createInputArrayInt(int len, int seed, int eltRange) { 681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Random rand = new Random(seed); 691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] array = new int[len]; 701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < len; ++i) 711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks array[i] = rand.nextInt(eltRange); 721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return array; 731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private <T extends Number> boolean result(String testName, T javaRslt, T rsRslt) { 761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = javaRslt.equals(rsRslt); 771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testName + ": java " + javaRslt + ", rs " + rsRslt + ": " + 791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (success ? "PASSED" : "FAILED")); 801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean result(String testName, Float2 javaRslt, Float2 rsRslt) { 841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (javaRslt.x == rsRslt.x) && (javaRslt.y == rsRslt.y); 851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testName + 871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ": java (" + javaRslt.x + ", " + javaRslt.y + ")" + 881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs (" + rsRslt.x + ", " + rsRslt.y + ")" + 891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ": " + (success ? "PASSED" : "FAILED")); 901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean result(String testName, Int2 javaRslt, Int2 rsRslt) { 941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (javaRslt.x == rsRslt.x) && (javaRslt.y == rsRslt.y); 951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks testName + 971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ": java (" + javaRslt.x + ", " + javaRslt.y + ")" + 981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ", rs (" + rsRslt.x + ", " + rsRslt.y + ")" + 991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ": " + (success ? "PASSED" : "FAILED")); 1001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 1011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 1041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private int addint(int[] input) { 1061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int rslt = 0; 1071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int idx = 0; idx < input.length; ++idx) 1081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks rslt += input[idx]; 1091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return rslt; 1101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean addint1D(RenderScript RS, ScriptC_reduce_backward s) { 1131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] input = createInputArrayInt(100000, 0, 1 << 13); 1141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaRslt = addint(input); 1161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsRslt = s.reduce_addint(input).get(); 1171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result("addint1D", javaRslt, rsRslt); 1191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean addint2D(RenderScript RS, ScriptC_reduce_backward s) { 1221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimX = 450, dimY = 225; 1231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int[] inputArray = createInputArrayInt(dimX * dimY, 1, 1 << 13); 1251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 1261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks typeBuilder.setX(dimX).setY(dimY); 1271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 1281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray); 1291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int javaRslt = addint(inputArray); 1311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsRslt = s.reduce_addint(inputAllocation).get(); 1321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result("addint2D", javaRslt, rsRslt); 1341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 1371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private Int2 findMinAndMax(float[] input) { 1391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float minVal = Float.POSITIVE_INFINITY; 1401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int minIdx = -1; 1411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks float maxVal = Float.NEGATIVE_INFINITY; 1421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int maxIdx = -1; 1431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int idx = 0; idx < input.length; ++idx) { 1451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (input[idx] < minVal) { 1461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks minVal = input[idx]; 1471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks minIdx = idx; 1481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (input[idx] > maxVal) { 1501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks maxVal = input[idx]; 1511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks maxIdx = idx; 1521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return new Int2(minIdx, maxIdx); 1561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean findMinAndMax(RenderScript RS, ScriptC_reduce_backward s) { 1591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final float[] input = createInputArrayFloat(100000, 4); 1601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 javaRslt = findMinAndMax(input); 1621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 rsRslt = s.reduce_findMinAndMax(input).get(); 1631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // Note that the Java and RenderScript algorithms are not 1651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // guaranteed to find the same cells -- but they should 1661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // find cells of the same value. 1671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Float2 javaVal = new Float2(input[javaRslt.x], input[javaRslt.y]); 1681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Float2 rsVal = new Float2(input[rsRslt.x], input[rsRslt.y]); 1691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result("findMinAndMax", javaVal, rsVal); 1711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 1741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean fz(RenderScript RS, ScriptC_reduce_backward s) { 1761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputLen = 100000; 1771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] input = createInputArrayInt(inputLen, 5); 1781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // just in case we got unlucky 1791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks input[(new Random(6)).nextInt(inputLen)] = 0; 1801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int rsRslt = s.reduce_fz(input).get(); 1821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (input[rsRslt] == 0); 1841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 1851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks "fz: input[" + rsRslt + "] == " + input[rsRslt] + ": " + 1861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (success ? "PASSED" : "FAILED")); 1871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 1881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 1891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 1911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean fz2(RenderScript RS, ScriptC_reduce_backward s) { 1931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimX = 225, dimY = 450; 1941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputLen = dimX * dimY; 1951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 1961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, 7); 1971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // just in case we got unlucky 1981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputArray[(new Random(8)).nextInt(inputLen)] = 0; 1991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 2011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks typeBuilder.setX(dimX).setY(dimY); 2021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 2031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray); 2041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 rsRslt = s.reduce_fz2(inputAllocation).get(); 2061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int cellVal = inputArray[rsRslt.x + dimX * rsRslt.y]; 2081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (cellVal == 0); 2091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 2101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks "fz2: input[" + rsRslt.x + ", " + rsRslt.y + "] == " + cellVal + ": " + 2111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (success ? "PASSED" : "FAILED")); 2121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 2131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 2161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean fz3(RenderScript RS, ScriptC_reduce_backward s) { 2181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int dimX = 59, dimY = 48, dimZ = 37; 2191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int inputLen = dimX * dimY * dimZ; 2201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] inputArray = createInputArrayInt(inputLen, 9); 2221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks // just in case we got unlucky 2231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputArray[(new Random(10)).nextInt(inputLen)] = 0; 2241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS)); 2261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks typeBuilder.setX(dimX).setY(dimY).setZ(dimZ); 2271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create()); 2281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copy3DRangeFrom(0, 0, 0, dimX, dimY, dimZ, inputArray); 2291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int3 rsRslt = s.reduce_fz3(inputAllocation).get(); 2311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final int cellVal = inputArray[rsRslt.x + dimX * rsRslt.y + dimX * dimY * rsRslt.z]; 2331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final boolean success = (cellVal == 0); 2341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 2351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks "fz3: input[" + rsRslt.x + ", " + rsRslt.y + ", " + rsRslt.z + "] == " + cellVal + ": " + 2361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks (success ? "PASSED" : "FAILED")); 2371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return success; 2381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 2411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private static final int histogramBucketCount = 256; 2431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private long[] histogram(RenderScript RS, final byte[] inputArray) { 2451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation inputAllocation = Allocation.createSized(RS, Element.U8(RS), inputArray.length); 2461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks inputAllocation.copyFrom(inputArray); 2471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Allocation outputAllocation = Allocation.createSized(RS, Element.U32(RS), histogramBucketCount); 2491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ScriptIntrinsicHistogram scriptHsg = ScriptIntrinsicHistogram.create(RS, Element.U8(RS)); 2511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks scriptHsg.setOutput(outputAllocation); 2521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks scriptHsg.forEach(inputAllocation); 2531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int[] outputArrayMistyped = new int[histogramBucketCount]; 2551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks outputAllocation.copyTo(outputArrayMistyped); 2561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks long[] outputArray = new long[histogramBucketCount]; 2581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < histogramBucketCount; ++i) 2591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks outputArray[i] = outputArrayMistyped[i] & (long) 0xffffffff; 2601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return outputArray; 2611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean histogram(RenderScript RS, ScriptC_reduce_backward s) { 2641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final byte[] inputArray = createInputArrayByte(100000, 11); 2651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] javaRslt = histogram(RS, inputArray); 2671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks _RS_ASSERT("javaRslt unexpected length: " + javaRslt.length, javaRslt.length == histogramBucketCount); 2681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final long[] rsRslt = s.reduce_histogram(inputArray).get(); 2691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks _RS_ASSERT("rsRslt unexpected length: " + rsRslt.length, rsRslt.length == histogramBucketCount); 2701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 0; i < histogramBucketCount; ++i) { 2721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (javaRslt[i] != rsRslt[i]) { 2731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, 2741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks "histogram[" + i + "]: java " + javaRslt[i] + ", rs " + rsRslt[i] + ": FAILED"); 2751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return false; 2761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, "histogram: PASSED"); 2801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return true; 2811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks //----------------------------------------------------------------- 2841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private Int2 mode(RenderScript RS, final byte[] inputArray) { 2861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks long[] hsg = histogram(RS, inputArray); 2871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks int modeIdx = 0; 2891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks for (int i = 1; i < hsg.length; ++i) 2901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (hsg[i] > hsg[modeIdx]) modeIdx = i; 2911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return new Int2(modeIdx, (int) hsg[modeIdx]); 2921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 2931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks private boolean mode(RenderScript RS, ScriptC_reduce_backward s) { 2951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final byte[] inputArray = createInputArrayByte(100000, 12); 2961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 2971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 javaRslt = mode(RS, inputArray); 2981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks final Int2 rsRslt = s.reduce_mode(inputArray).get(); 2991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks return result("mode", javaRslt, rsRslt); 3011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 3021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks /////////////////////////////////////////////////////////////////// 3041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks public void run() { 3064cad330154b7df7c3adf126b9f4b2665191a23a4Arthur Eubanks RenderScript pRS = createRenderScript(false); 3071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks ScriptC_reduce_backward s = new ScriptC_reduce_backward(pRS); 3081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks s.set_negInf(Float.NEGATIVE_INFINITY); 3091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks s.set_posInf(Float.POSITIVE_INFINITY); 3101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks boolean pass = true; 3121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= addint1D(pRS, s); 3131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= addint2D(pRS, s); 3141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= findMinAndMax(pRS, s); 3151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= fz(pRS, s); 3161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= fz2(pRS, s); 3171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= fz3(pRS, s); 3181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= histogram(pRS, s); 3191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pass &= mode(pRS, s); 3201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pRS.finish(); 3221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks pRS.destroy(); 3231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks 3241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks Log.i(TAG, pass ? "PASSED" : "FAILED"); 3251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks if (pass) 3261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks passTest(); 3271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks else 3281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks failTest(); 3291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks } 3301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks} 331