Snap for 10447354 from 8814c20857e51230867e2a52f347413cd1364e06 to mainline-wifi-release
Change-Id: Ic79ebd662bce43301c87a1dfab779545fa5c3e69
diff --git a/build_and_run_benchmark.sh b/build_and_run_benchmark.sh
index 4e889ff..19206b0 100755
--- a/build_and_run_benchmark.sh
+++ b/build_and_run_benchmark.sh
@@ -7,9 +7,9 @@
# which is not logged.
if [[ "$OSTYPE" == "darwin"* ]]; then
- OPTS="$(getopt f:rbsm:x -- "$*")"
+ OPTS="$(getopt f:rbsm:xn: -- "$*")"
else
- OPTS="$(getopt -o f:rbsm:x -l filter-driver:,include-nnapi-reference,nnapi-reference-only,skip-build,use-nnapi-sl,filter-model,extract-nnapi-sl -- "$@")"
+ OPTS="$(getopt -o f:rbsm:xn: -l filter-driver:,include-nnapi-reference,nnapi-reference-only,skip-build,use-nnapi-sl,filter-model,extract-nnapi-sl,nnapi-sl-vendor -- "$@")"
fi
if [ $? -ne 0 ]; then
@@ -20,6 +20,7 @@
echo " -b : skip build and installation of tests"
echo " -s : use NNAPI Support Library drivers (embedded in the benchmark APK unless -x is specified)"
echo " -x : extract NNAPI Support Library drivers from the APK"
+ echo " -n <nnapi-sl-vendor> : Optional, specify which SL driver vendor is used (qc/mtk/arm), default: qc"
echo " -m <regex> : to filter the models used in the tests"
else
echo " -f <regex> | --filter-driver <regex> : to run crash tests only on the drivers (ignoring nnapi-reference) matching the specified regular expression"
@@ -28,6 +29,7 @@
echo " -b | --skip-build : skip build and installation of tests"
echo " -s | --use-nnapi-sl : use NNAPI Support Library drivers (embedded in the benchmark APK unless -x is specified)"
echo " -x | --extract-nnapi-sl : extract NNAPI Support Library drivers from the APK"
+ echo " -n <nnapi-sl-vendor> : Optional, specify which SL driver vendor is used (qc/mtk/arm), default: qc"
echo " -m <regex> : to filter the models used in the tests"
fi
exit
@@ -75,6 +77,10 @@
mkdir sl_prebuilt/assets
ls sl_prebuilt/ 2>/dev/null | grep '.so' >sl_prebuilt/assets/sl_prebuilt_filelist.txt
;;
+ -n|--nnapi-sl-vendor)
+ NNAPI_SL_VENDOR=$2
+ shift 2
+ ;;
--)
shift
break
@@ -172,6 +178,10 @@
echo "================================================================"
mv $SL_PREBUILT/Android.bp.template $SL_PREBUILT/Android.bp
fi
+ if [[ -z "$NNAPI_SL_VENDOR" ]]; then
+ NNAPI_SL_VENDOR="qc"
+ fi
+ NNAPI_SL_FILTER_OPT+=" -e nnApiSupportLibraryVendor $NNAPI_SL_VENDOR"
fi
# Build and install benchmark app
@@ -272,7 +282,7 @@
LOGDIR=$(mktemp -d)/mlts-logs
HOST_CSV=$LOGDIR/benchmark.csv
RESULT_HTML=$LOGDIR/result.html
- DEVICE_CSV=/sdcard/mlts_benchmark.csv
+ DEVICE_CSV=/storage/emulated/0/mlts_benchmark.csv
mkdir -p $LOGDIR
echo Creating logs in $LOGDIR
diff --git a/jni/Android.bp b/jni/Android.bp
index 1dc575c..d24a989 100644
--- a/jni/Android.bp
+++ b/jni/Android.bp
@@ -65,7 +65,6 @@
cc_library {
name: "librandom_graph_test_jni",
- defaults: ["neuralnetworks_float16"],
srcs: [
"random_graph_test_jni.cpp",
],
@@ -124,4 +123,4 @@
strip: {
keep_symbols: true,
},
-}
\ No newline at end of file
+}
diff --git a/jni/run_tflite.cpp b/jni/run_tflite.cpp
index 360a9ca..46d4eec 100644
--- a/jni/run_tflite.cpp
+++ b/jni/run_tflite.cpp
@@ -180,7 +180,7 @@
}
mTfliteNnapiDelegate =
nnApiSl
- ? std::make_unique<tflite::StatefulNnApiDelegate>(nnApiSl, nnapi_options)
+ ? std::make_unique<tflite::StatefulNnApiDelegate>(nnApiSl->getFL5(), nnapi_options)
: std::make_unique<tflite::StatefulNnApiDelegate>(nnapi_options);
int delegationStatus = mTfliteInterpreter->ModifyGraphWithDelegate(mTfliteNnapiDelegate.get());
*nnapiErrno = mTfliteNnapiDelegate->GetNnApiErrno();
@@ -476,7 +476,7 @@
"NNAPI SL is null pointer when running compilation caching benchmark.");
return false;
}
- delegate = std::make_unique<tflite::StatefulNnApiDelegate>(mNnApiSl, nnapi_options);
+ delegate = std::make_unique<tflite::StatefulNnApiDelegate>(mNnApiSl->getFL5(), nnapi_options);
} else {
delegate = std::make_unique<tflite::StatefulNnApiDelegate>(nnapi_options);
}
diff --git a/src/com/android/nn/benchmark/app/AcceleratorSpecificTestSupport.java b/src/com/android/nn/benchmark/app/AcceleratorSpecificTestSupport.java
index 0bdac1f..83875d6 100644
--- a/src/com/android/nn/benchmark/app/AcceleratorSpecificTestSupport.java
+++ b/src/com/android/nn/benchmark/app/AcceleratorSpecificTestSupport.java
@@ -166,6 +166,7 @@
mProcessor.setNnApiAcceleratorName(acceleratorName);
mProcessor.setUseNnApiSupportLibrary(NNTestBase.shouldUseNnApiSupportLibrary());
mProcessor.setExtractNnApiSupportLibrary(NNTestBase.shouldExtractNnApiSupportLibrary());
+ mProcessor.setNnApiSupportLibraryVendor(NNTestBase.getNnApiSupportLibraryVendor());
mTestModelEntry = testModelEntry;
}
diff --git a/src/com/android/nn/benchmark/app/BenchmarkTestBase.java b/src/com/android/nn/benchmark/app/BenchmarkTestBase.java
index 294e439..10c4254 100644
--- a/src/com/android/nn/benchmark/app/BenchmarkTestBase.java
+++ b/src/com/android/nn/benchmark/app/BenchmarkTestBase.java
@@ -95,9 +95,11 @@
if (useNNApi) {
final boolean useNnApiSupportLibrary = NNTestBase.shouldUseNnApiSupportLibrary();
final boolean extractNnApiSupportLibrary = NNTestBase.shouldExtractNnApiSupportLibrary();
+ final String nnApiSupportLibraryVendor = NNTestBase.getNnApiSupportLibraryVendor();
Log.i(NNBenchmark.TAG, "Configuring usage of NNAPI SL to " + useNnApiSupportLibrary);
mActivity.setUseNnApiSupportLibrary(useNnApiSupportLibrary);
mActivity.setExtractNnApiSupportLibrary(extractNnApiSupportLibrary);
+ mActivity.setNnApiSupportLibraryVendor(nnApiSupportLibraryVendor);
}
}
diff --git a/src/com/android/nn/benchmark/app/NNBenchmark.java b/src/com/android/nn/benchmark/app/NNBenchmark.java
index a0e6f28..93c1ec8 100644
--- a/src/com/android/nn/benchmark/app/NNBenchmark.java
+++ b/src/com/android/nn/benchmark/app/NNBenchmark.java
@@ -50,6 +50,7 @@
private boolean mUseNnApiSupportLibrary = false;
private boolean mExtractNnApiSupportLibrary = false;
+ private String mNnApiSupportLibraryVendor = "";
private Processor mProcessor;
private final ExecutorService executorService = Executors.newSingleThreadExecutor();
@@ -85,6 +86,11 @@
mProcessor.setUseNnApiSupportLibrary(mUseNnApiSupportLibrary);
}
+ public void setNnApiSupportLibraryVendor(String value) {
+ mNnApiSupportLibraryVendor = value;
+ mProcessor.setNnApiSupportLibraryVendor(mNnApiSupportLibraryVendor);
+ }
+
public void setExtractNnApiSupportLibrary(boolean value) {
mExtractNnApiSupportLibrary = value;
mProcessor.setExtractNnApiSupportLibrary(value);
@@ -145,6 +151,7 @@
mProcessor.setTfLiteBackend(!i.getBooleanExtra(EXTRA_DISABLE_NNAPI, false) ? TfLiteBackend.NNAPI : TfLiteBackend.CPU);
mProcessor.setMaxRunIterations(i.getIntExtra(EXTRA_MAX_ITERATIONS, 0));
mProcessor.setUseNnApiSupportLibrary(mUseNnApiSupportLibrary);
+ mProcessor.setNnApiSupportLibraryVendor(mNnApiSupportLibraryVendor);
mProcessor.setExtractNnApiSupportLibrary(mExtractNnApiSupportLibrary);
executorService.submit(mProcessor);
} else {
diff --git a/src/com/android/nn/benchmark/core/BenchmarkException.java b/src/com/android/nn/benchmark/core/BenchmarkException.java
index a4383dd..2149b5e 100644
--- a/src/com/android/nn/benchmark/core/BenchmarkException.java
+++ b/src/com/android/nn/benchmark/core/BenchmarkException.java
@@ -20,4 +20,4 @@
public BenchmarkException(String message) {
super(message);
}
-};
+}
diff --git a/src/com/android/nn/benchmark/core/NNTestBase.java b/src/com/android/nn/benchmark/core/NNTestBase.java
index fe0bddd..6ad84b8 100644
--- a/src/com/android/nn/benchmark/core/NNTestBase.java
+++ b/src/com/android/nn/benchmark/core/NNTestBase.java
@@ -26,6 +26,8 @@
import android.util.Pair;
import android.widget.TextView;
import androidx.test.InstrumentationRegistry;
+import com.android.nn.benchmark.core.sl.ArmSupportLibraryDriverHandler;
+import com.android.nn.benchmark.core.sl.MediaTekSupportLibraryDriverHandler;
import com.android.nn.benchmark.core.sl.QualcommSupportLibraryDriverHandler;
import com.android.nn.benchmark.core.sl.SupportLibraryDriverHandler;
import java.io.BufferedReader;
@@ -38,6 +40,8 @@
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.function.Supplier;
+import java.util.HashMap;
import java.util.List;
import java.util.Optional;
import java.util.Random;
@@ -150,9 +154,11 @@
// from the library.
private boolean mUseNnApiSupportLibrary = false;
private boolean mExtractNnApiSupportLibrary = false;
+ private String mNnApiSupportLibraryVendor = "";
static final String USE_NNAPI_SL_PROPERTY = "useNnApiSupportLibrary";
static final String EXTRACT_NNAPI_SL_PROPERTY = "extractNnApiSupportLibrary";
+ static final String NNAPI_SL_VENDOR = "nnApiSupportLibraryVendor";
private static boolean getBooleanTestParameter(String key, boolean defaultValue) {
// All instrumentation arguments are passed as String so I have to convert the value here.
@@ -168,6 +174,10 @@
return getBooleanTestParameter(EXTRACT_NNAPI_SL_PROPERTY, false);
}
+ public static String getNnApiSupportLibraryVendor() {
+ return InstrumentationRegistry.getArguments().getString(NNAPI_SL_VENDOR);
+ }
+
public NNTestBase(String modelName, String modelFile, int[] inputShape,
InferenceInOutSequence.FromAssets[] inputOutputAssets,
InferenceInOutSequence.FromDataset[] inputOutputDatasets,
@@ -210,6 +220,7 @@
public void setUseNnApiSupportLibrary(boolean value) {mUseNnApiSupportLibrary = value;}
public void setExtractNnApiSupportLibrary(boolean value) {mExtractNnApiSupportLibrary = value;}
+ public void setNnApiSupportLibraryVendor(String value) {mNnApiSupportLibraryVendor = value;}
public void setNNApiDeviceName(String value) {
if (mTfLiteBackend != TfLiteBackend.NNAPI) {
@@ -226,9 +237,18 @@
mContext = ipcxt;
long nnApiLibHandle = 0;
if (mUseNnApiSupportLibrary) {
- // TODO: support different drivers providers maybe with a flag
- QualcommSupportLibraryDriverHandler qcSlhandler = new QualcommSupportLibraryDriverHandler();
- nnApiLibHandle = qcSlhandler.getOrLoadNnApiSlHandle(mContext, mExtractNnApiSupportLibrary);
+ HashMap<String, Supplier<SupportLibraryDriverHandler>> vendors = new HashMap<>();
+ vendors.put("qc", () -> new QualcommSupportLibraryDriverHandler());
+ vendors.put("arm", () -> new ArmSupportLibraryDriverHandler());
+ vendors.put("mtk", () -> new MediaTekSupportLibraryDriverHandler());
+ Supplier<SupportLibraryDriverHandler> vendor = vendors.get(mNnApiSupportLibraryVendor);
+ if (vendor == null) {
+ throw new NnApiDelegationFailure(String
+ .format("NNAPI SL vendor is invalid '%s', expected one of %s.",
+ mNnApiSupportLibraryVendor, vendors.keySet().toString()));
+ }
+ SupportLibraryDriverHandler slHandler = vendor.get();
+ nnApiLibHandle = slHandler.getOrLoadNnApiSlHandle(mContext, mExtractNnApiSupportLibrary);
if (nnApiLibHandle == 0) {
Log.e(TAG, String
.format("Unable to find NNAPI SL entry point '%s' in embedded libraries path.",
diff --git a/src/com/android/nn/benchmark/core/Processor.java b/src/com/android/nn/benchmark/core/Processor.java
index 87a4455..1955b26 100644
--- a/src/com/android/nn/benchmark/core/Processor.java
+++ b/src/com/android/nn/benchmark/core/Processor.java
@@ -77,6 +77,7 @@
private boolean mUseNnApiSupportLibrary;
private boolean mExtractNnApiSupportLibrary;
+ private String mNnApiSupportLibraryVendor;
public Processor(Context context, Processor.Callback callback, int[] testList) {
mContext = context;
@@ -94,6 +95,7 @@
mModelFilterRegex = null;
mUseNnApiSupportLibrary = false;
mExtractNnApiSupportLibrary = false;
+ mNnApiSupportLibraryVendor = "";
}
public void setUseNNApi(boolean useNNApi) {
@@ -142,6 +144,7 @@
public void setUseNnApiSupportLibrary(boolean value) { mUseNnApiSupportLibrary = value; }
public void setExtractNnApiSupportLibrary(boolean value) { mExtractNnApiSupportLibrary = value; }
+ public void setNnApiSupportLibraryVendor(String value) { mNnApiSupportLibraryVendor = value; }
public void enableCompilationCachingBenchmarks(
float warmupTimeSeconds, float runTimeSeconds, int maxIterations) {
@@ -183,7 +186,8 @@
/*enableIntermediateTensorsDump=*/false,
/*mmapModel=*/ false,
NNTestBase.shouldUseNnApiSupportLibrary(),
- NNTestBase.shouldExtractNnApiSupportLibrary()
+ NNTestBase.shouldExtractNnApiSupportLibrary(),
+ NNTestBase.getNnApiSupportLibraryVendor()
)) {
tb.setNNApiDeviceName(acceleratorName);
return tb.setupModel(context);
@@ -210,7 +214,7 @@
oldTestBase.destroy();
}
NNTestBase tb = t.createNNTestBase(mBackend, /*enableIntermediateTensorsDump=*/false,
- mMmapModel, mUseNnApiSupportLibrary, mExtractNnApiSupportLibrary);
+ mMmapModel, mUseNnApiSupportLibrary, mExtractNnApiSupportLibrary, mNnApiSupportLibraryVendor);
if (mBackend == TfLiteBackend.NNAPI) {
tb.setNNApiDeviceName(mAcceleratorName);
}
diff --git a/src/com/android/nn/benchmark/core/TestModels.java b/src/com/android/nn/benchmark/core/TestModels.java
index d91e013..99eac1b 100644
--- a/src/com/android/nn/benchmark/core/TestModels.java
+++ b/src/com/android/nn/benchmark/core/TestModels.java
@@ -82,24 +82,25 @@
public NNTestBase createNNTestBase(TfLiteBackend tfLiteBackend, boolean enableIntermediateTensorsDump) {
return createNNTestBase(tfLiteBackend, enableIntermediateTensorsDump, /*mmapModel=*/false,
- /*useNnApiSl=*/false, /*extractNnApiSl=*/false);
+ /*useNnApiSl=*/false, /*extractNnApiSl=*/false, /*nnApiSlVendor=*/"");
}
// Used by CTS tests.
public NNTestBase createNNTestBase(boolean useNNAPI, boolean enableIntermediateTensorsDump) {
TfLiteBackend tfLiteBackend = useNNAPI ? TfLiteBackend.NNAPI : TfLiteBackend.CPU;
return createNNTestBase(tfLiteBackend, enableIntermediateTensorsDump,
- /*mmapModel=*/false, /*useNnApiSl=*/false, /*extractNnApiSl=*/false);
+ /*mmapModel=*/false, /*useNnApiSl=*/false, /*extractNnApiSl=*/false, /*nnApiSlVendor=*/"");
}
public NNTestBase createNNTestBase(TfLiteBackend tfLiteBackend, boolean enableIntermediateTensorsDump,
- boolean mmapModel, boolean useNnApiSl, boolean extractNnApiSl) {
+ boolean mmapModel, boolean useNnApiSl, boolean extractNnApiSl, String nnApiSlVendor) {
NNTestBase test = createNNTestBase();
test.setTfLiteBackend(tfLiteBackend);
test.enableIntermediateTensorsDump(enableIntermediateTensorsDump);
test.setMmapModel(mmapModel);
test.setUseNnApiSupportLibrary(useNnApiSl);
test.setExtractNnApiSupportLibrary(extractNnApiSl);
+ test.setNnApiSupportLibraryVendor(nnApiSlVendor);
return test;
}
diff --git a/src/com/android/nn/benchmark/core/UnsupportedSdkException.java b/src/com/android/nn/benchmark/core/UnsupportedSdkException.java
index f232ee2..350431b 100644
--- a/src/com/android/nn/benchmark/core/UnsupportedSdkException.java
+++ b/src/com/android/nn/benchmark/core/UnsupportedSdkException.java
@@ -20,4 +20,4 @@
public UnsupportedSdkException(String message) {
super(message);
}
-};
+}
diff --git a/src/com/android/nn/benchmark/core/sl/ArmSupportLibraryDriverHandler.java b/src/com/android/nn/benchmark/core/sl/ArmSupportLibraryDriverHandler.java
new file mode 100644
index 0000000..a8d2514
--- /dev/null
+++ b/src/com/android/nn/benchmark/core/sl/ArmSupportLibraryDriverHandler.java
@@ -0,0 +1,30 @@
+package com.android.nn.benchmark.core.sl;
+
+import android.content.Context;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.util.Log;
+import java.io.IOException;
+
+public class ArmSupportLibraryDriverHandler extends SupportLibraryDriverHandler {
+ // This environment variable is required by Arm SL driver, and is used to control
+ // different options. It is fully documented in ArmNN repository.
+ private static final String ARM_OPTIONS_VAR = "ARMNN_SL_OPTIONS";
+ // Arm SL Options:
+ // -v : Verbose logging
+ // -c GpuAcc : Use GPU backend (rather than CPU)
+ private static final String ARM_OPTIONS_VAR_VALUE = "-v -c GpuAcc";
+
+ @Override
+ public void prepareDriver(Context context, String nnSupportLibFilePath) throws IOException {
+ Log.i(TAG, "Preparing Arm NNAPI SL");
+ try {
+ Os.setenv(ARM_OPTIONS_VAR, ARM_OPTIONS_VAR_VALUE, /*overwrite=*/true);
+ Log.i(TAG, String.format("Overwritten system env variable %s with %s",
+ ARM_OPTIONS_VAR, ARM_OPTIONS_VAR_VALUE));
+ } catch (ErrnoException errnoException) {
+ throw new IOException(String.format("Unable to overwrite system env variable %s with %s",
+ ARM_OPTIONS_VAR, ARM_OPTIONS_VAR_VALUE), errnoException);
+ }
+ }
+}
diff --git a/src/com/android/nn/benchmark/core/sl/MediaTekSupportLibraryDriverHandler.java b/src/com/android/nn/benchmark/core/sl/MediaTekSupportLibraryDriverHandler.java
new file mode 100644
index 0000000..d4376f8
--- /dev/null
+++ b/src/com/android/nn/benchmark/core/sl/MediaTekSupportLibraryDriverHandler.java
@@ -0,0 +1,10 @@
+package com.android.nn.benchmark.core.sl;
+
+import android.content.Context;
+
+public class MediaTekSupportLibraryDriverHandler extends SupportLibraryDriverHandler {
+ @Override
+ public void prepareDriver(Context context, String nnSupportLibFilePath) {
+ // MediaTek SL driver has no specific preparation needed
+ }
+}
diff --git a/src/com/android/nn/benchmark/util/DumpIntermediateTensors.java b/src/com/android/nn/benchmark/util/DumpIntermediateTensors.java
index 438384a..22d7f16 100644
--- a/src/com/android/nn/benchmark/util/DumpIntermediateTensors.java
+++ b/src/com/android/nn/benchmark/util/DumpIntermediateTensors.java
@@ -96,7 +96,8 @@
try (NNTestBase testBase = modelEntry.createNNTestBase(
backend, /*enableIntermediateTensorsDump*/true, /*mmapModel*/false,
NNTestBase.shouldUseNnApiSupportLibrary(),
- NNTestBase.shouldExtractNnApiSupportLibrary())) {
+ NNTestBase.shouldExtractNnApiSupportLibrary(),
+ NNTestBase.getNnApiSupportLibraryVendor())) {
testBase.setupModel(this);
File outputDir = new File(getFilesDir() + "/" + DUMP_DIR +
"/" + modelName, useNNAPIDir);