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 Wang 202c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.os.Bundle; 212c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.util.Log; 222c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 232c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport com.example.android.rs.blasbenchmark.BlasTestList.TestName; 242c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport com.example.android.rs.blasbenchmark.BlasTestRunner; 252c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 262c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.test.ActivityInstrumentationTestCase2; 272c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangimport android.test.suitebuilder.annotation.LargeTest; 282c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 292c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang/** 302c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * BLAS benchmark test. 312c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * To run the test, please use command 322c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * 332c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * adb shell am instrument -e iteration <n> -w com.example.android.rs.blasbenchmark/.BlasTestRunner 342c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang * 352c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang */ 362c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wangpublic class BlasTest extends ActivityInstrumentationTestCase2<BlasBenchmark> { 372c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private final String TAG = "BLAS Test"; 382c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private final String TEST_NAME = "Testname"; 392c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private final String ITERATIONS = "Iterations"; 402c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private final String BENCHMARK = "Benchmark"; 412c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private static int INSTRUMENTATION_IN_PROGRESS = 2; 422c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private int mIteration; 432c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang private BlasBenchmark mActivity; 442c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 452c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public BlasTest() { 462c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang super(BlasBenchmark.class); 472c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 482c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 492c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @Override 502c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void setUp() throws Exception { 512c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang super.setUp(); 522c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang setActivityInitialTouchMode(false); 532c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mActivity = getActivity(); 542c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang BlasTestRunner mRunner = (BlasTestRunner) getInstrumentation(); 552c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mIteration = mRunner.mIteration; 562c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang assertTrue("please enter a valid iteration value", mIteration > 0); 572c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 582c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 592c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @Override 602c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void tearDown() throws Exception { 612c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang super.tearDown(); 622c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 632c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 642c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang class TestAction implements Runnable { 652c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestName mTestName; 662c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang float mResult; 672c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public TestAction(TestName testName) { 682c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mTestName = testName; 692c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 702c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void run() { 712c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mActivity.changeTest(mTestName, false); 722c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang //mResult = mActivity.getBenchmark(); 732c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang Log.v(TAG, "Benchmark for test \"" + mTestName.toString() + "\" is: " + mResult); 742c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang synchronized(this) { 752c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang this.notify(); 762c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 772c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 782c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public float getBenchmark() { 792c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang return mResult; 802c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 812c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 822c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 832c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Set the benchmark thread to run on ui thread 842c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Synchronized the thread such that the test will wait for the benchmark thread to finish 852c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void runOnUiThread(Runnable action) { 862c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang synchronized(action) { 872c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang mActivity.runOnUiThread(action); 882c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang try { 892c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang action.wait(); 902c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } catch (InterruptedException e) { 912c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang Log.v(TAG, "waiting for action running on UI thread is interrupted: " + 922c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang e.toString()); 932c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 942c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 952c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 962c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 972c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void runTest(TestAction ta, String testName) { 982c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang float sum = 0; 992c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang for (int i = 0; i < mIteration; i++) { 1002c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang runOnUiThread(ta); 1012c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang float bmValue = ta.getBenchmark(); 1022c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang Log.v(TAG, "results for iteration " + i + " is " + bmValue); 1032c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang sum += bmValue; 1042c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 1052c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang float avgResult = sum/mIteration; 1062c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 1072c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // post result to INSTRUMENTATION_STATUS 1082c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang Bundle results = new Bundle(); 1092c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang results.putString(TEST_NAME, testName); 1102c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang results.putInt(ITERATIONS, mIteration); 1112c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang results.putFloat(BENCHMARK, avgResult); 1122c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, results); 1132c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 1142c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 1152c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Test case 0: SGEMM Test Small 1162c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @LargeTest 1172c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void testSGEMMSmall() { 1182c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestAction ta = new TestAction(TestName.SGEMM_SMALL); 1192c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang runTest(ta, TestName.SGEMM_SMALL.name()); 1202c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 1212c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 1222c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Test case 1: SGEMM Test Medium 1232c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @LargeTest 1242c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void testSGEMMedium() { 1252c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestAction ta = new TestAction(TestName.SGEMM_MEDIUM); 1262c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang runTest(ta, TestName.SGEMM_MEDIUM.name()); 1272c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 1282c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 1292c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Test case 2: SGEMM Test Large 1302c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @LargeTest 1312c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void testSGEMMLarge() { 1322c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestAction ta = new TestAction(TestName.SGEMM_LARGE); 1332c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang runTest(ta, TestName.SGEMM_LARGE.name()); 1342c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 1352c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 1362c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Test case 3: 8Bit GEMM Test Small 1372c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @LargeTest 1382c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void testBNNMSmall() { 1392c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestAction ta = new TestAction(TestName.BNNM_SMALL); 1402c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang runTest(ta, TestName.BNNM_SMALL.name()); 1412c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 1422c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 1432c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Test case 4: 8Bit GEMM Test Medium 1442c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @LargeTest 1452c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void testBNNMMMedium() { 1462c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestAction ta = new TestAction(TestName.BNNM_MEDIUM); 1472c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang runTest(ta, TestName.BNNM_MEDIUM.name()); 1482c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 1492c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang 1502c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang // Test case 5: 8Bit GEMM Test Large 1512c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang @LargeTest 1522c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang public void testBNNMLarge() { 1532c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang TestAction ta = new TestAction(TestName.BNNM_LARGE); 1542c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang runTest(ta, TestName.BNNM_LARGE.name()); 1552c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang } 1562c9b10f9b72ebec0b1861532e4ccb6e68ac769a4Miao Wang} 157