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