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