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