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