nnapi: set android_sdk_version for non-Android platforms

When running on Linux where libneuralnetworks.so is available, set the
android_sdk_version to match the loaded libneuralnetworks.so.

This change will allow Tensorflow to use NNAPI in ChromeOS.

PiperOrigin-RevId: 322073469
Change-Id: Ica6ee5f00ead5a547e5a19f9b7001266a4d09f70
This commit is contained in:
A. Unique TensorFlower 2020-07-19 20:58:34 -07:00 committed by TensorFlower Gardener
parent da51cb0dc8
commit 2fd3f75f05

View File

@ -76,6 +76,31 @@ int ASharedMemory_create(const char* name, size_t size) {
}
return fd;
}
// Determine the NnApi version from loaded entry points
uint32_t CalculateAndroidSdkVersion(NnApi const& nnapi) {
// Test for specific NNAPI 1.0, 1.1, 1.2 and 1.3 functions
bool has_10 = nnapi.ANeuralNetworksMemory_createFromFd != nullptr;
bool has_11 =
nnapi.ANeuralNetworksModel_relaxComputationFloat32toFloat16 != nullptr;
bool has_12 = nnapi.ANeuralNetworks_getDeviceCount != nullptr;
bool has_13 = nnapi.ANeuralNetworksCompilation_setTimeout != nullptr;
uint32_t sdk_version = 0;
if (has_10) {
sdk_version = 27;
}
if (sdk_version == 27 && has_11) {
sdk_version = 28;
}
if (sdk_version == 28 && has_12) {
sdk_version = 29;
}
if (sdk_version == 29 && has_13) {
sdk_version = 30;
}
return sdk_version;
}
#endif // __ANDROID__
#define LOAD_FUNCTION(handle, name) \
@ -244,6 +269,15 @@ const NnApi LoadNnApi() {
LOAD_FUNCTION_OPTIONAL(libneuralnetworks,
ANeuralNetworksExecution_startComputeWithDependencies);
#ifndef __ANDROID__
// If libneuralnetworks.so is loaded, but android_sdk_version is not set,
// then determine android_sdk_version by testing which functions are
// available.
if (nnapi.nnapi_exists && nnapi.android_sdk_version == 0) {
nnapi.android_sdk_version = CalculateAndroidSdkVersion(nnapi);
}
#endif // __ANDROID__
return nnapi;
}