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 552c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // In demo mode this is used to count updates in the pipeline. It's 562c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // incremented when work is submitted to RS and decremented when invalidate is 572c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // called to display a result. 582f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang private boolean mDemoMode; 592c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 602f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang // Initialize the parameters for Instrumentation tests. 612f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang protected void prepareInstrumentationTest() { 622f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mTestList = new int[1]; 632f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mTestResults = new float[1]; 642f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mTestInfo = new String[1]; 652f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mDemoMode = false; 662f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mProcessor = new Processor(RenderScript.create(this), !mDemoMode); 672c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 682c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 692c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 702c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang ///////////////////////////////////////////////////////////////////////// 712c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Processor is a helper thread for running the work without 722c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // blocking the UI thread. 732c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang class Processor extends Thread { 742c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang RenderScript mRS; 752c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 762c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private float mLastResult; 772c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private boolean mRun = true; 782c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private boolean mDoingBenchmark; 792c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private TestBase mTest; 802c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 812c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private boolean mBenchmarkMode; 822c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 832c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang void runTest() { 842c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mTest.runTest(); 852c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 862c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 872c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang Processor(RenderScript rs, boolean benchmarkMode) { 882c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mRS = rs; 892c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mBenchmarkMode = benchmarkMode; 902c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 912c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 922c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang class Result { 932c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang float totalTime; 942c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang int iterations; 952c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang String testInfo; 962c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 972c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 982f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang // Method to retreive benchmark results for instrumentation tests. 992f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang float getInstrumentationResult(BlasTestList.TestName t) { 1002f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mTest = changeTest(t, false); 1012f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang Result r = getBenchmark(); 1022f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang return r.totalTime / r.iterations * 1000.f; 1032f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang } 1042f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang 1052c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Run one loop of kernels for at least the specified minimum time. 1062c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // The function returns the average time in ms for the test run 1072c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private Result runBenchmarkLoop(float minTime) { 1082c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang Result r = new Result(); 1092c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang long t = java.lang.System.currentTimeMillis(); 1102c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 1112c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang r.testInfo = mTest.getTestInfo(); 1122c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang do { 1132c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Run the kernel 1142c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mTest.runTest(); 1152c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang r.iterations ++; 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 + 1492f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang ", avg=" + r.totalTime / r.iterations * 1000.f + " " + r.testInfo); 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 } 2032c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2042c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2052c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2062c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2072c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void exit() { 2082c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mRun = false; 2092c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2102c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang synchronized(this) { 2112c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang notifyAll(); 2122c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2132c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2142c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang try { 2152c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang this.join(); 2162c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } catch(InterruptedException e) { 2172c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2182c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2192c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang if (mTest != null) { 2202c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mTest.destroy(); 2212c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mTest = null; 2222c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2232c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mRS.destroy(); 2242c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mRS = null; 2252c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2262c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2272c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2282c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2292c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private boolean mDoingBenchmark; 2302c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public Processor mProcessor; 2312c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2322c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestBase changeTest(BlasTestList.TestName t, boolean setupUI) { 2332c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestBase tb = BlasTestList.newTest(t); 2342c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang tb.createBaseTest(this); 2352c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang return tb; 2362c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2372c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2382c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestBase changeTest(int id, boolean setupUI) { 2392c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang BlasTestList.TestName t = BlasTestList.TestName.values()[id]; 2402c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang return changeTest(t, setupUI); 2412c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2422c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2432c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @Override 2442c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang protected void onCreate(Bundle savedInstanceState) { 2452c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang super.onCreate(savedInstanceState); 2462c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TextView textView = new TextView(this); 2472c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang textView.setTextSize(20); 2482c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang textView.setText("BLAS BenchMark Running."); 2492c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang setContentView(textView); 2502c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2512c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2522c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @Override 2532c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang protected void onPause() { 2542c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang super.onPause(); 2552f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang if (mProcessor != null) { 2562f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mProcessor.exit(); 2572f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang } 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 @Override 2742c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang protected void onResume() { 2752c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang super.onResume(); 2762c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang Intent i = getIntent(); 2772c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mTestList = i.getIntArrayExtra("tests"); 2782c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2792c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mToggleLong = i.getBooleanExtra("enable long", false); 2802c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mTogglePause = i.getBooleanExtra("enable pause", false); 2812c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mDemoMode = i.getBooleanExtra("demo", false); 2822c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2832f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang if (mTestList != null) { 2842f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mTestResults = new float[mTestList.length]; 2852f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mTestInfo = new String[mTestList.length]; 2862f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mProcessor = new Processor(RenderScript.create(this), !mDemoMode); 2872f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang if (mDemoMode) { 2882f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mProcessor.mTest = changeTest(mTestList[0], true); 2892f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang } 2902f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang mProcessor.start(); 2912f37e26f714034ba4c8c44269a3b055c411e26aeMiao Wang } 2922c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2932c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 2942c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang protected void onDestroy() { 2952c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang super.onDestroy(); 2962c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 2972c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang} 298