12c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang/*
22c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * Copyright (C) 2015 The Android Open Source Project
32c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang *
42c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * Licensed under the Apache License, Version 2.0 (the "License");
52c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * you may not use this file except in compliance with the License.
62c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * You may obtain a copy of the License at
72c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang *
82c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang *      http://www.apache.org/licenses/LICENSE-2.0
92c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang *
102c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * Unless required by applicable law or agreed to in writing, software
112c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * distributed under the License is distributed on an "AS IS" BASIS,
122c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * See the License for the specific language governing permissions and
142c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * limitations under the License.
152c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang */
162c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
172c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangpackage com.example.android.rs.blasbenchmark;
182c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
192c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.app.Activity;
202c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
212c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.content.Intent;
222c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.os.Bundle;
232c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.os.Handler;
242c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.os.Message;
252c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.widget.AdapterView;
262c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.widget.ArrayAdapter;
272c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.widget.TextView;
282c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.view.View;
292c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.graphics.Point;
302c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.view.WindowManager;
312c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.text.method.ScrollingMovementMethod;
322c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
332c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.util.Log;
342c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.renderscript.ScriptC;
352c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.renderscript.RenderScript;
362c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.renderscript.Type;
372c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.renderscript.Allocation;
382c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.renderscript.Element;
392c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.renderscript.Script;
402c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
412c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangpublic class BlasBenchmark extends Activity {
422c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
432c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
442c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private final String TAG = "BLAS";
452c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    public final String RESULT_FILE = "blas_benchmark_result.csv";
462c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
472c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private int mTestList[];
482c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private float mTestResults[];
492c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private String mTestInfo[];
502c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
512c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private TextView mTextView;
522c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private boolean mToggleLong;
532c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private boolean mTogglePause;
542c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private boolean mDemoMode;
552c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
562c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    // In demo mode this is used to count updates in the pipeline.  It's
572c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    // incremented when work is submitted to RS and decremented when invalidate is
582c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    // called to display a result.
592c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
602c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    // Message processor to handle notifications for when kernel completes
612c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private class MessageProcessor extends RenderScript.RSMessageHandler {
622c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        MessageProcessor() {
632c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
642c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
652c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        public void run() {
662c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            synchronized(mProcessor) {
672c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                mProcessor.notifyAll();
682c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            }
692c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
702c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
712c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
722c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
732c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    /////////////////////////////////////////////////////////////////////////
742c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    // Processor is a helper thread for running the work without
752c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    // blocking the UI thread.
762c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    class Processor extends Thread {
772c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        RenderScript mRS;
782c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
792c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        private float mLastResult;
802c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        private boolean mRun = true;
812c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        private boolean mDoingBenchmark;
822c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        private TestBase mTest;
832c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
842c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        private boolean mBenchmarkMode;
852c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
862c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        void runTest() {
872c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mTest.runTest();
882c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
892c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
902c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        Processor(RenderScript rs, boolean benchmarkMode) {
912c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mRS = rs;
922c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mRS.setMessageHandler(new MessageProcessor());
932c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mBenchmarkMode = benchmarkMode;
942c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            start();
952c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
962c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
972c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        class Result {
982c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            float totalTime;
992c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            int iterations;
1002c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            String testInfo;
1012c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
1022c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1032c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        // Run one loop of kernels for at least the specified minimum time.
1042c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        // The function returns the average time in ms for the test run
1052c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        private Result runBenchmarkLoop(float minTime) {
1062c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            Result r = new Result();
1072c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            long t = java.lang.System.currentTimeMillis();
1082c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1092c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            r.testInfo = mTest.getTestInfo();
1102c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            do {
1112c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                // Run the kernel
1122c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                mTest.runTest();
1132c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                r.iterations ++;
1142c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                // Send our RS message handler a message so we know when this work has completed
1152c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                mRS.sendMessage(0, null);
1162c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1172c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                long t2 = java.lang.System.currentTimeMillis();
1182c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                r.totalTime += (t2 - t) / 1000.f;
1192c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                t = t2;
1202c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            } while (r.totalTime < minTime);
1212c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1222c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            // Wait for any stray operations to complete and update the final time
1232c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mRS.finish();
1242c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            long t2 = java.lang.System.currentTimeMillis();
1252c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            r.totalTime += (t2 - t) / 1000.f;
1262c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            t = t2;
1272c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            return r;
1282c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
1292c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1302c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1312c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        // Get a benchmark result for a specific test
1322c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        private Result getBenchmark() {
1332c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mDoingBenchmark = true;
1342c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1352c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            long result = 0;
1362c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            float runtime = 1.f;
1372c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            if (mToggleLong) {
1382c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                runtime = 10.f;
1392c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            }
1402c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1412c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            // We run a short bit of work before starting the actual test
1422c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            // this is to let any power management do its job and respond
1432c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            runBenchmarkLoop(0.3f);
1442c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1452c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            // Run the actual benchmark
1462c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            Result r = runBenchmarkLoop(runtime);
1472c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1482c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            Log.v("rs", "Test: time=" + r.totalTime +"s,  iterations=" + r.iterations +
1492c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                  ", avg=" + r.totalTime / r.iterations * 1000.f);
1502c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1512c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mDoingBenchmark = false;
1522c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            return r;
1532c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
1542c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1552c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        public void run() {
1562c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            while (mRun) {
1572c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                // Our loop for launching tests or benchmarks
1582c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                synchronized(this) {
1592c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    // We may have been asked to exit while waiting
1602c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    if (!mRun) return;
1612c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                }
1622c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1632c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                if (mBenchmarkMode) {
1642c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    // Loop over the tests we want to benchmark
1652c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    for (int ct=0; (ct < mTestList.length) && mRun; ct++) {
1662c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1672c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        // For reproducibility we wait a short time for any sporadic work
1682c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        // created by the user touching the screen to launch the test to pass.
1692c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        // Also allows for things to settle after the test changes.
1702c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        mRS.finish();
1712c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        try {
1722c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                            sleep(250);
1732c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        } catch(InterruptedException e) {
1742c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        }
1752c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1762c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        // If we just ran a test, we destroy it here to relieve some memory pressure
1772c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        if (mTest != null) {
1782c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                            mTest.destroy();
1792c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        }
1802c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1812c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        // Select the next test
1822c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        mTest = changeTest(mTestList[ct], false);
1832c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        // If the user selected the "long pause" option, wait
1842c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        if (mTogglePause) {
1852c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                            for (int i=0; (i < 100) && mRun; i++) {
1862c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                                try {
1872c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                                    sleep(100);
1882c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                                } catch(InterruptedException e) {
1892c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                                }
1902c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                            }
1912c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        }
1922c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
1932c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        // Run the test
1942c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        Result r = getBenchmark();
1952c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        mTestResults[ct] = r.totalTime / r.iterations * 1000.f;
1962c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                        mTestInfo[ct] = r.testInfo;
1972c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    }
1982c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    onBenchmarkFinish(mRun);
1992c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                } else {
2002c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    // Run the kernel
2012c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    runTest();
2022c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    // Send our RS message handler a message so we know when this work has completed
2032c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                    mRS.sendMessage(0, null);
2042c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                }
2052c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            }
2062c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2072c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
2082c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2092c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        public void exit() {
2102c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mRun = false;
2112c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2122c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            synchronized(this) {
2132c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                notifyAll();
2142c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            }
2152c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2162c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            try {
2172c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                this.join();
2182c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            } catch(InterruptedException e) {
2192c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            }
2202c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2212c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            if (mTest != null) {
2222c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                mTest.destroy();
2232c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang                mTest = null;
2242c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            }
2252c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mRS.destroy();
2262c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mRS = null;
2272c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
2282c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
2292c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2302c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2312c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    private boolean mDoingBenchmark;
2322c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    public Processor mProcessor;
2332c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2342c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    TestBase changeTest(BlasTestList.TestName t, boolean setupUI) {
2352c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        TestBase tb = BlasTestList.newTest(t);
2362c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        tb.createBaseTest(this);
2372c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        return tb;
2382c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
2392c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2402c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    TestBase changeTest(int id, boolean setupUI) {
2412c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        BlasTestList.TestName t = BlasTestList.TestName.values()[id];
2422c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        return changeTest(t, setupUI);
2432c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
2442c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2452c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    @Override
2462c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    protected void onCreate(Bundle savedInstanceState) {
2472c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        super.onCreate(savedInstanceState);
2482c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        TextView textView = new TextView(this);
2492c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        textView.setTextSize(20);
2502c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        textView.setText("BLAS BenchMark Running.");
2512c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        setContentView(textView);
2522c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
2532c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2542c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    @Override
2552c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    protected void onPause() {
2562c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        super.onPause();
2572c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        mProcessor.exit();
2582c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
2592c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2602c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    public void onBenchmarkFinish(boolean ok) {
2612c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        if (ok) {
2622c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            Intent intent = new Intent();
2632c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            intent.putExtra("tests", mTestList);
2642c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            intent.putExtra("results", mTestResults);
2652c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            intent.putExtra("testinfo", mTestInfo);
2662c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            setResult(RESULT_OK, intent);
2672c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        } else {
2682c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            setResult(RESULT_CANCELED);
2692c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
2702c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        finish();
2712c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
2722c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2732c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2742c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    void startProcessor() {
2752c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        mProcessor = new Processor(RenderScript.create(this), !mDemoMode);
2762c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        if (mDemoMode) {
2772c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang            mProcessor.mTest = changeTest(mTestList[0], true);
2782c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        }
2792c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
2802c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2812c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    @Override
2822c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    protected void onResume() {
2832c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        super.onResume();
2842c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        Intent i = getIntent();
2852c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        mTestList = i.getIntArrayExtra("tests");
2862c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2872c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        mToggleLong = i.getBooleanExtra("enable long", false);
2882c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        mTogglePause = i.getBooleanExtra("enable pause", false);
2892c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        mDemoMode = i.getBooleanExtra("demo", false);
2902c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2912c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        mTestResults = new float[mTestList.length];
2922c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        mTestInfo = new String[mTestList.length];
2932c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2942c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        startProcessor();
2952c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
2962c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang
2972c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    protected void onDestroy() {
2982c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang        super.onDestroy();
2992c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang    }
3002c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang}
301