[NNAPI EP] Update NNAPI headers (#11954)

Update the NNAPI headers to a more recent version (copied from TF Lite v2.9.1).
This commit is contained in:
Edward Chen 2022-06-27 18:54:06 -07:00 committed by GitHub
parent 466b2d9f3d
commit f045994389
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 867 additions and 231 deletions

View file

@ -816,7 +816,7 @@ if (onnxruntime_USE_OPENVINO)
add_dependencies(onnxruntime_providers_openvino onnxruntime_providers_shared ${onnxruntime_EXTERNAL_DEPENDENCIES})
target_include_directories(onnxruntime_providers_openvino SYSTEM PUBLIC ${ONNXRUNTIME_ROOT} ${CMAKE_CURRENT_BINARY_DIR} ${eigen_INCLUDE_DIRS} ${OpenVINO_INCLUDE_DIR} ${OPENVINO_INCLUDE_DIR_LIST} ${PYTHON_INCLUDE_DIRS} $ENV{OPENCL_INCS})
target_link_libraries(onnxruntime_providers_openvino ${ONNXRUNTIME_PROVIDERS_SHARED} ${OPENVINO_LIB_LIST} ${ABSEIL_LIBS})
target_compile_definitions(onnxruntime_providers_openvino PRIVATE VER_MAJOR=${VERSION_MAJOR_PART})
target_compile_definitions(onnxruntime_providers_openvino PRIVATE VER_MINOR=${VERSION_MINOR_PART})
target_compile_definitions(onnxruntime_providers_openvino PRIVATE VER_BUILD=${VERSION_BUILD_PART})
@ -978,45 +978,39 @@ if (onnxruntime_USE_NNAPI_BUILTIN)
add_compile_definitions(ORT_NNAPI_MAX_SUPPORTED_API_LEVEL=${onnxruntime_NNAPI_HOST_API})
endif()
file(GLOB
onnxruntime_providers_nnapi_cc_srcs_top CONFIGURE_DEPENDS
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/*.cc"
set(onnxruntime_provider_nnapi_cc_src_patterns
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/*.h"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/*.cc"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/*.h"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/*.cc"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/builders/*.h"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/builders/*.cc"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_lib/NeuralNetworksTypes.h"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_lib/NeuralNetworksWrapper.h"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_lib/NeuralNetworksWrapper.cc"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_lib/nnapi_implementation.h"
)
# On Android, use the actual NNAPI implementation.
# Otherwise, use a stub implementation to support some unit testing.
if(CMAKE_SYSTEM_NAME STREQUAL "Android")
list(APPEND onnxruntime_provider_nnapi_cc_src_patterns
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_lib/nnapi_implementation.cc")
else()
list(APPEND onnxruntime_provider_nnapi_cc_src_patterns
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_lib/nnapi_implementation_stub.cc")
endif()
# These are shared utils,
# TODO, move this to a separated lib when used by EPs other than NNAPI and CoreML
file(GLOB_RECURSE onnxruntime_providers_shared_utils_cc_srcs CONFIGURE_DEPENDS
list(APPEND onnxruntime_provider_nnapi_cc_src_patterns
"${ONNXRUNTIME_ROOT}/core/providers/shared/utils/utils.h"
"${ONNXRUNTIME_ROOT}/core/providers/shared/utils/utils.cc"
"${ONNXRUNTIME_ROOT}/core/providers/shared/node_unit/node_unit.h"
"${ONNXRUNTIME_ROOT}/core/providers/shared/node_unit/node_unit.cc"
)
if(CMAKE_SYSTEM_NAME STREQUAL "Android")
file(GLOB_RECURSE
onnxruntime_providers_nnapi_cc_srcs_nested CONFIGURE_DEPENDS
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/*.h"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/*.cc"
)
else()
file(GLOB
onnxruntime_providers_nnapi_cc_srcs_nested CONFIGURE_DEPENDS
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/model.*"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_execution_provider.h"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_execution_provider.cc"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/builders/*.h"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/builders/*.cc"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_lib/NeuralNetworksTypes.h"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_lib/NeuralNetworksWrapper.*"
"${ONNXRUNTIME_ROOT}/core/providers/nnapi/nnapi_builtin/nnapi_lib/nnapi_implementation.*"
)
endif()
set(onnxruntime_providers_nnapi_cc_srcs
${onnxruntime_providers_nnapi_cc_srcs_top}
${onnxruntime_providers_nnapi_cc_srcs_nested}
${onnxruntime_providers_shared_utils_cc_srcs}
)
file(GLOB onnxruntime_providers_nnapi_cc_srcs CONFIGURE_DEPENDS ${onnxruntime_provider_nnapi_cc_src_patterns})
source_group(TREE ${ONNXRUNTIME_ROOT}/core FILES ${onnxruntime_providers_nnapi_cc_srcs})
onnxruntime_add_static_library(onnxruntime_providers_nnapi ${onnxruntime_providers_nnapi_cc_srcs})
@ -1517,7 +1511,7 @@ if (onnxruntime_USE_XNNPACK)
"${ONNXRUNTIME_ROOT}/core/providers/shared/node_unit/node_unit.h"
"${ONNXRUNTIME_ROOT}/core/providers/shared/node_unit/node_unit.cc"
)
source_group(TREE ${REPO_ROOT} FILES ${onnxruntime_providers_xnnpack_cc_srcs})
onnxruntime_add_static_library(onnxruntime_providers_xnnpack ${onnxruntime_providers_xnnpack_cc_srcs})
onnxruntime_add_include_to_target(onnxruntime_providers_xnnpack

View file

@ -18,7 +18,7 @@
// get the actually Android system version.
// If running on an actual Android system, this value will be ignored
#ifndef ORT_NNAPI_MAX_SUPPORTED_API_LEVEL
#define ORT_NNAPI_MAX_SUPPORTED_API_LEVEL 30
#define ORT_NNAPI_MAX_SUPPORTED_API_LEVEL 31
#endif
namespace onnxruntime {

View file

@ -1,8 +1,11 @@
/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -42,12 +45,9 @@ enum {
ANEURALNETWORKS_TENSOR_QUANT16_SYMM = 7,
ANEURALNETWORKS_TENSOR_FLOAT16 = 8,
ANEURALNETWORKS_TENSOR_BOOL8 = 9,
ANEURALNETWORKS_FLOAT16 = 10,
ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL = 11,
ANEURALNETWORKS_TENSOR_QUANT16_ASYMM = 12,
ANEURALNETWORKS_TENSOR_QUANT8_SYMM = 13,
ANEURALNETWORKS_TENSOR_QUANT8_ASYMM_SIGNED = 14,
ANEURALNETWORKS_MODEL = 15,
};
/**
@ -146,6 +146,10 @@ enum {
ANEURALNETWORKS_HARD_SWISH = 99,
ANEURALNETWORKS_FILL = 100,
ANEURALNETWORKS_RANK = 101,
ANEURALNETWORKS_BATCH_MATMUL = 102,
ANEURALNETWORKS_PACK = 103,
ANEURALNETWORKS_MIRROR_PAD = 104,
ANEURALNETWORKS_REVERSE = 105,
};
/**
@ -256,6 +260,10 @@ enum {
* API releases.
*/
ANEURALNETWORKS_FEATURE_LEVEL_5 = 31,
/** Android NNAPI feature level 6 */
ANEURALNETWORKS_FEATURE_LEVEL_6 = 1000006,
/** Android NNAPI feature level 7 */
ANEURALNETWORKS_FEATURE_LEVEL_7 = 1000007,
};
/**
@ -510,6 +518,65 @@ typedef int32_t ANeuralNetworksOperationType;
*/
typedef struct ANeuralNetworksDevice ANeuralNetworksDevice;
/**
* Diagnostic result codes.
*/
typedef enum {
ANNDIAG_NO_ERROR = 0,
/**
* Failure caused by failure to load support library driver.
*/
ANNDIAG_FAILED_TO_LOAD_SL = 1,
/**
* Failure caused by failure to register HAL service.
*/
ANNDIAG_FAILED_TO_REGISTER_SERVICE = 2,
/**
* General failure.
*/
ANNDIAG_GENERAL_ERROR = 3,
/**
* Invalid argument
*/
ANNDIAG_INVALID_ARGUMENT = 4,
} ANeuralNetworksDiagnosticResultCode;
/**
* Diagnostic data class.
*/
typedef enum {
ANNDIAG_DATA_CLASS_UNKNOWN = 0,
ANNDIAG_DATA_CLASS_OTHER = 1,
ANNDIAG_DATA_CLASS_FLOAT32 = 2,
ANNDIAG_DATA_CLASS_FLOAT16 = 3,
ANNDIAG_DATA_CLASS_QUANT = 4,
ANNDIAG_DATA_CLASS_MIXED = 5
} ANeuralNetworksDiagnosticDataClass;
/**
* Diagnostic execution mode.
*/
typedef enum {
ANNDIAG_EXECUTION_MODE_UNKNOWN = 0,
ANNDIAG_EXECUTION_MODE_ASYNC = 1,
ANNDIAG_EXECUTION_MODE_SYNC = 2,
ANNDIAG_EXECUTION_MODE_BURST = 3,
ANNDIAG_EXECUTION_MODE_ASYNC_WITH_DEPS = 4,
} ANeuralNetworksDiagnosticExecutionMode;
typedef struct ANeuralNetworksDiagnosticCompilationInfo
ANeuralNetworksDiagnosticCompilationInfo;
typedef struct ANeuralNetworksDiagnosticExecutionInfo
ANeuralNetworksDiagnosticExecutionInfo;
typedef void (*ANeuralNetworksDiagnosticCompilationFinishedCallback)(
const void* context, const ANeuralNetworksDiagnosticCompilationInfo* info);
typedef void (*ANeuralNetworksDiagnosticExecutionFinishedCallback)(
const void* context, const ANeuralNetworksDiagnosticExecutionInfo* info);
// nn api function types
typedef int (*ANeuralNetworksMemory_createFromFd_fn)(
@ -757,4 +824,102 @@ typedef int (*ANeuralNetworksExecution_setReusable_fn)(
ANeuralNetworksExecution* execution, bool reusable);
typedef int64_t (*ANeuralNetworks_getRuntimeFeatureLevel_fn)();
typedef int32_t (*SL_ANeuralNetworksDiagnosticCompilationInfo_getSessionId_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef int64_t (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getNnApiVersion_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef const uint8_t* (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getModelArchHash_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef const char* (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getDeviceIds_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef int32_t (*SL_ANeuralNetworksDiagnosticCompilationInfo_getErrorCode_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef ANeuralNetworksDiagnosticDataClass (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getInputDataClass_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef ANeuralNetworksDiagnosticDataClass (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getOutputDataClass_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef uint64_t (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getCompilationTimeNanos_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef bool (*SL_ANeuralNetworksDiagnosticCompilationInfo_isCachingEnabled_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef bool (
*SL_ANeuralNetworksDiagnosticCompilationInfo_isControlFlowUsed_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef bool (
*SL_ANeuralNetworksDiagnosticCompilationInfo_areDynamicTensorsUsed_fn)(
const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo);
typedef int32_t (*SL_ANeuralNetworksDiagnosticExecutionInfo_getSessionId_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef int64_t (*SL_ANeuralNetworksDiagnosticExecutionInfo_getNnApiVersion_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef const uint8_t* (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getModelArchHash_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef const char* (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getDeviceIds_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef ANeuralNetworksDiagnosticExecutionMode (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getExecutionMode_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef ANeuralNetworksDiagnosticDataClass (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getInputDataClass_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef ANeuralNetworksDiagnosticDataClass (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getOutputDataClass_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef uint32_t (*SL_ANeuralNetworksDiagnosticExecutionInfo_getErrorCode_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef uint64_t (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getRuntimeExecutionTimeNanos_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef uint64_t (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getDriverExecutionTimeNanos_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef uint64_t (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getHardwareExecutionTimeNanos_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef bool (*SL_ANeuralNetworksDiagnosticExecutionInfo_isCachingEnabled_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef bool (*SL_ANeuralNetworksDiagnosticExecutionInfo_isControlFlowUsed_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef bool (
*SL_ANeuralNetworksDiagnosticExecutionInfo_areDynamicTensorsUsed_fn)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
typedef void (*SL_ANeuralNetworksDiagnostic_registerCallbacks_fn)(
ANeuralNetworksDiagnosticCompilationFinishedCallback compilationCallback,
ANeuralNetworksDiagnosticExecutionFinishedCallback executionCallback,
void* callbackContext);
#endif // TENSORFLOW_LITE_NNAPI_NEURALNETWORKSTYPES_H_

View file

@ -71,7 +71,6 @@ size_t OperandType::GetElementByteSize() const {
element_size = 1;
break;
case Type::TENSOR_FLOAT16:
case Type::FLOAT16:
element_size = 2;
break;
case Type::TENSOR_FLOAT32:
@ -87,7 +86,6 @@ size_t OperandType::GetElementByteSize() const {
element_size = 1;
break;
case Type::TENSOR_QUANT16_SYMM:
case Type::TENSOR_QUANT16_ASYMM:
element_size = 2;
break;
default:

View file

@ -16,14 +16,12 @@
// Provides C++ classes to more easily use the Neural Networks API.
#ifndef ANDROID_ML_NN_RUNTIME_NEURAL_NETWORKS_WRAPPER_H
#define ANDROID_ML_NN_RUNTIME_NEURAL_NETWORKS_WRAPPER_H
#include <vector>
#include <numeric>
#include <optional>
#include <vector>
#include "NeuralNetworksTypes.h"
// Move to std::optional when we switch to c++ 17
#include "core/common/optional.h"
namespace android {
namespace nn {
namespace wrapper {
@ -38,9 +36,7 @@ enum class Type {
TENSOR_QUANT16_SYMM = ANEURALNETWORKS_TENSOR_QUANT16_SYMM,
TENSOR_FLOAT16 = ANEURALNETWORKS_TENSOR_FLOAT16,
TENSOR_BOOL8 = ANEURALNETWORKS_TENSOR_BOOL8,
FLOAT16 = ANEURALNETWORKS_FLOAT16,
TENSOR_QUANT8_SYMM_PER_CHANNEL = ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL,
TENSOR_QUANT16_ASYMM = ANEURALNETWORKS_TENSOR_QUANT16_ASYMM,
TENSOR_QUANT8_ASYMM_SIGNED = ANEURALNETWORKS_TENSOR_QUANT8_ASYMM_SIGNED,
};
@ -81,8 +77,6 @@ inline std::string TypeToStr(const Type& type) {
return "TENSOR_INT32";
} else if (type == Type::TENSOR_QUANT8_ASYMM) {
return "TENSOR_QUANT8_ASYMM";
} else if (type == Type::TENSOR_QUANT16_ASYMM) {
return "TENSOR_QUANT16_ASYMM";
} else if (type == Type::TENSOR_QUANT16_SYMM) {
return "TENSOR_QUANT16_SYMM";
} else if (type == Type::BOOL) {
@ -91,8 +85,6 @@ inline std::string TypeToStr(const Type& type) {
return "TENSOR_FLOAT16";
} else if (type == Type::TENSOR_BOOL8) {
return "TENSOR_BOOL8";
} else if (type == Type::FLOAT16) {
return "FLOAT16";
} else if (type == Type::TENSOR_QUANT8_SYMM_PER_CHANNEL) {
return "TENSOR_QUANT8_SYMM_PER_CHANNEL";
} else if (type == Type::TENSOR_QUANT8_ASYMM_SIGNED) {
@ -131,7 +123,7 @@ struct OperandType {
ANeuralNetworksOperandType operandType;
Type type;
std::vector<uint32_t> dimensions;
onnxruntime::optional<SymmPerChannelQuantParams> channelQuant;
std::optional<SymmPerChannelQuantParams> channelQuant;
explicit OperandType(Type type, const std::vector<uint32_t>& d, float scale = 0.0f, int32_t zeroPoint = 0);
explicit OperandType(Type type, const std::vector<uint32_t>& d, SymmPerChannelQuantParams&& channelQuant);

View file

@ -1,8 +1,11 @@
/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -11,9 +14,6 @@ limitations under the License.
==============================================================================*/
#include "nnapi_implementation.h"
// use real implementation on Android.
// use stub on other platforms to allow unit testing model building.
#if defined(__ANDROID__)
#include <dlfcn.h>
#include <fcntl.h>
#include <sys/mman.h>
@ -201,10 +201,14 @@ const NnApi LoadNnApi() {
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksModel_finish);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksModel_addOperand);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksModel_setOperandValue);
LOAD_FUNCTION_OPTIONAL(libneuralnetworks, ANeuralNetworksModel_setOperandSymmPerChannelQuantParams);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksModel_setOperandValueFromMemory);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
ANeuralNetworksModel_setOperandSymmPerChannelQuantParams);
LOAD_FUNCTION(libneuralnetworks,
ANeuralNetworksModel_setOperandValueFromMemory);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksModel_addOperation);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksModel_identifyInputsAndOutputs);
LOAD_FUNCTION(libneuralnetworks,
ANeuralNetworksModel_identifyInputsAndOutputs);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksCompilation_create);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksCompilation_free);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksCompilation_setPreference);
@ -214,7 +218,8 @@ const NnApi LoadNnApi() {
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksExecution_setInput);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksExecution_setInputFromMemory);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksExecution_setOutput);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksExecution_setOutputFromMemory);
LOAD_FUNCTION(libneuralnetworks,
ANeuralNetworksExecution_setOutputFromMemory);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksExecution_startCompute);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksEvent_wait);
LOAD_FUNCTION(libneuralnetworks, ANeuralNetworksEvent_free);
@ -308,6 +313,83 @@ const NnApi LoadNnApi() {
ANeuralNetworksExecution_enableInputAndOutputPadding);
LOAD_FUNCTION_OPTIONAL(libneuralnetworks,
ANeuralNetworksExecution_setReusable);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_getSessionId);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_getNnApiVersion);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_getModelArchHash);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_getDeviceIds);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_getErrorCode);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_getInputDataClass);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_getOutputDataClass);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_getCompilationTimeNanos);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_isCachingEnabled);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_isControlFlowUsed);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticCompilationInfo_areDynamicTensorsUsed);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getSessionId);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getNnApiVersion);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getModelArchHash);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getDeviceIds);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getExecutionMode);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getInputDataClass);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getOutputDataClass);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getErrorCode);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getRuntimeExecutionTimeNanos);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getDriverExecutionTimeNanos);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_getHardwareExecutionTimeNanos);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_isCachingEnabled);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_isControlFlowUsed);
LOAD_FUNCTION_OPTIONAL(
libneuralnetworks,
SL_ANeuralNetworksDiagnosticExecutionInfo_areDynamicTensorsUsed);
#ifndef __ANDROID__
// If libneuralnetworks.so is loaded, but android_sdk_version is not set,
// then determine android_sdk_version by testing which functions are
@ -329,173 +411,6 @@ const NnApi LoadNnApi() {
} // namespace
#else
//
// Stub out the API with default implementations that do nothing.
//
#include "core/providers/nnapi/nnapi_builtin/builders/helper.h"
#include "core/providers/nnapi/nnapi_builtin/nnapi_lib/NeuralNetworksTypes.h"
const NnApi LoadNnApi() {
NnApi nnapi = {};
nnapi.android_sdk_version = ORT_NNAPI_MAX_SUPPORTED_API_LEVEL;
nnapi.nnapi_runtime_feature_level = ANEURALNETWORKS_FEATURE_LEVEL_5;
nnapi.ANeuralNetworksMemory_createFromFd =
[](size_t, int, int, size_t, ANeuralNetworksMemory**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemory_free = [](ANeuralNetworksMemory*) {};
nnapi.ANeuralNetworksModel_create = [](ANeuralNetworksModel**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksModel_free = [](ANeuralNetworksModel*) {};
nnapi.ANeuralNetworksModel_finish = [](ANeuralNetworksModel*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksModel_addOperand = [](ANeuralNetworksModel*, const ANeuralNetworksOperandType*) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_setOperandValue = [](ANeuralNetworksModel*, int32_t, const void*, size_t) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_setOperandSymmPerChannelQuantParams =
[](ANeuralNetworksModel*, int32_t, const ANeuralNetworksSymmPerChannelQuantParams*) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_setOperandValueFromMemory =
[](ANeuralNetworksModel*, int32_t, const ANeuralNetworksMemory*, size_t, size_t) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_addOperation =
[](ANeuralNetworksModel*, ANeuralNetworksOperationType, uint32_t, const uint32_t*, uint32_t, const uint32_t*) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_identifyInputsAndOutputs =
[](ANeuralNetworksModel*, uint32_t, const uint32_t*, uint32_t, const uint32_t*) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_relaxComputationFloat32toFloat16 =
[](ANeuralNetworksModel*, bool) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksCompilation_create =
[](ANeuralNetworksModel*, ANeuralNetworksCompilation**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksCompilation_free = [](ANeuralNetworksCompilation*) {};
nnapi.ANeuralNetworksCompilation_setPreference =
[](ANeuralNetworksCompilation*, int32_t) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksCompilation_finish =
[](ANeuralNetworksCompilation*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_create =
[](ANeuralNetworksCompilation*, ANeuralNetworksExecution**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_free = [](ANeuralNetworksExecution*) {};
nnapi.ANeuralNetworksExecution_setInput =
[](ANeuralNetworksExecution*, int32_t, const ANeuralNetworksOperandType*, const void*, size_t) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_setInputFromMemory =
[](ANeuralNetworksExecution*, int32_t, const ANeuralNetworksOperandType*, const ANeuralNetworksMemory*, size_t, size_t) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_setOutput =
[](ANeuralNetworksExecution*, int32_t, const ANeuralNetworksOperandType*, void*, size_t) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_setOutputFromMemory =
[](ANeuralNetworksExecution*, int32_t, const ANeuralNetworksOperandType*, const ANeuralNetworksMemory*, size_t, size_t) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_startCompute =
[](ANeuralNetworksExecution*, ANeuralNetworksEvent**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksEvent_wait = [](ANeuralNetworksEvent*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksEvent_free = [](ANeuralNetworksEvent*) {};
nnapi.ASharedMemory_create = [](const char*, size_t) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworks_getDeviceCount = [](uint32_t*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworks_getDevice = [](uint32_t, ANeuralNetworksDevice**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksDevice_getName =
[](const ANeuralNetworksDevice*, const char**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksDevice_getVersion =
[](const ANeuralNetworksDevice*, const char**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksDevice_getFeatureLevel =
[](const ANeuralNetworksDevice*, int64_t* feature_level) {
*feature_level = ANEURALNETWORKS_FEATURE_LEVEL_5;
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksDevice_getType =
[](const ANeuralNetworksDevice*, int32_t*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksModel_getSupportedOperationsForDevices =
[](const ANeuralNetworksModel*, const ANeuralNetworksDevice* const*, uint32_t, bool*) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksCompilation_createForDevices =
[](ANeuralNetworksModel*, const ANeuralNetworksDevice* const*, uint32_t, ANeuralNetworksCompilation**) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksCompilation_setCaching =
[](ANeuralNetworksCompilation*, const char*, const uint8_t*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksCompilation_setTimeout =
[](ANeuralNetworksCompilation*, uint64_t) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksCompilation_setPriority =
[](ANeuralNetworksCompilation*, int) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_compute =
[](ANeuralNetworksExecution*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_setTimeout =
[](ANeuralNetworksExecution*, uint64_t) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_setLoopTimeout =
[](ANeuralNetworksExecution*, uint64_t) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_getOutputOperandRank =
[](ANeuralNetworksExecution*, int32_t, uint32_t*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_getOutputOperandDimensions =
[](ANeuralNetworksExecution*, int32_t, uint32_t*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksBurst_create =
[](ANeuralNetworksCompilation*, ANeuralNetworksBurst**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksBurst_free = [](ANeuralNetworksBurst*) {};
nnapi.ANeuralNetworksExecution_burstCompute =
[](ANeuralNetworksExecution*, ANeuralNetworksBurst*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemory_createFromAHardwareBuffer =
[](const AHardwareBuffer*, ANeuralNetworksMemory**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_setMeasureTiming =
[](ANeuralNetworksExecution*, bool) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_getDuration =
[](const ANeuralNetworksExecution*, int32_t, uint64_t*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksDevice_getExtensionSupport =
[](const ANeuralNetworksDevice*, const char*, bool*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksModel_getExtensionOperandType =
[](ANeuralNetworksModel*, const char*, uint16_t, int32_t*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksModel_getExtensionOperationType =
[](ANeuralNetworksModel*, const char*, uint16_t, ANeuralNetworksOperationType*) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_setOperandExtensionData =
[](ANeuralNetworksModel*, int32_t, const void*, size_t) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemoryDesc_create = [](ANeuralNetworksMemoryDesc**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemoryDesc_free = [](ANeuralNetworksMemoryDesc*) {};
nnapi.ANeuralNetworksMemoryDesc_addInputRole =
[](ANeuralNetworksMemoryDesc*, const ANeuralNetworksCompilation*, uint32_t, float) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksMemoryDesc_addOutputRole =
[](ANeuralNetworksMemoryDesc*, const ANeuralNetworksCompilation*, uint32_t, float) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksMemoryDesc_setDimensions =
[](ANeuralNetworksMemoryDesc*, uint32_t, const uint32_t*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemoryDesc_finish =
[](ANeuralNetworksMemoryDesc*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemory_createFromDesc =
[](const ANeuralNetworksMemoryDesc*, ANeuralNetworksMemory**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemory_copy =
[](const ANeuralNetworksMemory*, const ANeuralNetworksMemory*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksEvent_createFromSyncFenceFd =
[](int, ANeuralNetworksEvent**) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksEvent_getSyncFenceFd =
[](const ANeuralNetworksEvent*, int*) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_startComputeWithDependencies =
[](ANeuralNetworksExecution*, const ANeuralNetworksEvent* const*, uint32_t, uint64_t, ANeuralNetworksEvent**) {
return int(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_enableInputAndOutputPadding =
[](ANeuralNetworksExecution*, bool) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_setReusable =
[](ANeuralNetworksExecution*, bool) { return int(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworks_getRuntimeFeatureLevel = []() { return int64_t(ANEURALNETWORKS_FEATURE_LEVEL_5); };
return nnapi;
}
#endif // defined(__ANDROID__)
const NnApi* NnApiImplementation() {
static const NnApi nnapi = LoadNnApi();
return &nnapi;

View file

@ -1,8 +1,11 @@
/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -1781,6 +1784,326 @@ struct NnApi {
* Available since NNAPI feature level 5.
*/
int64_t (*ANeuralNetworks_getRuntimeFeatureLevel)();
/**
* Gets the ID that identifies a single session of client interacting with
* NNAPI runtime.
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Session info id.
*/
int32_t (*SL_ANeuralNetworksDiagnosticCompilationInfo_getSessionId)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Gets NNAPI version.
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return NNAPI version.
*/
int64_t (*SL_ANeuralNetworksDiagnosticCompilationInfo_getNnApiVersion)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Gets the hash of the model architecture (without weights).
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Model hash.
*/
const uint8_t* (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getModelArchHash)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Gets the device IDs as a comma-concatenated string.
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Device ID.
*/
const char* (*SL_ANeuralNetworksDiagnosticCompilationInfo_getDeviceIds)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Gets the error code.
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Error code.
*/
int32_t (*SL_ANeuralNetworksDiagnosticCompilationInfo_getErrorCode)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Gets the type of tensors used for inputs.
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Input data class.
*/
ANeuralNetworksDiagnosticDataClass (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getInputDataClass)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Gets the type of tensors used for outputs.
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Output data class.
*/
ANeuralNetworksDiagnosticDataClass (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getOutputDataClass)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Gets how many nanoseconds elapsed when compiling the model.
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Time to compile the model in nanoseconds. UINT64_MAX indicates that
* timing information is not available.
*/
uint64_t (
*SL_ANeuralNetworksDiagnosticCompilationInfo_getCompilationTimeNanos)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Is caching enabled?
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Whether caching is enabled.
*/
bool (*SL_ANeuralNetworksDiagnosticCompilationInfo_isCachingEnabled)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Is control flow used?
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Whether control flow was used.
*/
bool (*SL_ANeuralNetworksDiagnosticCompilationInfo_isControlFlowUsed)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Are dynamic tensors used?
*
* @param diagnosticCompilationInfo The NNAPI diagnostic compilation info
* object.
* @return Whether dynamic tensors were used.
*/
bool (*SL_ANeuralNetworksDiagnosticCompilationInfo_areDynamicTensorsUsed)(
const ANeuralNetworksDiagnosticCompilationInfo*
diagnosticCompilationInfo);
/**
* Gets the ID that identifies a single session of client interacting with
* NNAPI runtime.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Session info id.
*/
int32_t (*SL_ANeuralNetworksDiagnosticExecutionInfo_getSessionId)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets NNAPI version.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return NNAPI version.
*/
int64_t (*SL_ANeuralNetworksDiagnosticExecutionInfo_getNnApiVersion)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets the hash of the model architecture (without weights).
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Model hash.
*/
const uint8_t* (*SL_ANeuralNetworksDiagnosticExecutionInfo_getModelArchHash)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets the device IDs as a comma-concatenated string.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Device ID.
*/
const char* (*SL_ANeuralNetworksDiagnosticExecutionInfo_getDeviceIds)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets the execution mode.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Execution mode.
*/
ANeuralNetworksDiagnosticExecutionMode (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getExecutionMode)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets the input data class.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Input data class.
*/
ANeuralNetworksDiagnosticDataClass (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getInputDataClass)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets the output data class.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Output data class.
*/
ANeuralNetworksDiagnosticDataClass (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getOutputDataClass)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets the error code.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Error code.
*/
uint32_t (*SL_ANeuralNetworksDiagnosticExecutionInfo_getErrorCode)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets the time taken to execute from runtime, including runtime/ipc
* overhead.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Time taken to execute as measured by the runtime in nanoseconds.
* UINT64_MAX indicates that timing information is not available.
*/
uint64_t (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getRuntimeExecutionTimeNanos)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets the time taken to execute in the driver, excluding runtime/ipc
* overhead.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Time taken to execute on the driver in nanoseconds. UINT64_MAX
* indicates that timing information is not available.
*/
uint64_t (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getDriverExecutionTimeNanos)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Gets the time taken to execute on the hardware, excluding driver overhead.
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Time taken to execute on the hardware in nanoseconds. UINT64_MAX
* indicates that timing information is not available.
*/
uint64_t (
*SL_ANeuralNetworksDiagnosticExecutionInfo_getHardwareExecutionTimeNanos)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Is caching enabled?
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Whether caching is enabled.
*/
bool (*SL_ANeuralNetworksDiagnosticExecutionInfo_isCachingEnabled)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Is control flow used?
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Whether control flow was used.
*/
bool (*SL_ANeuralNetworksDiagnosticExecutionInfo_isControlFlowUsed)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Are dynamic tensors used?
*
* @param diagnosticExecutionInfo The NNAPI diagnostic compilation info
* object.
* @return Whether dynamic tensors were used.
*/
bool (*SL_ANeuralNetworksDiagnosticExecutionInfo_areDynamicTensorsUsed)(
const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo);
/**
* Sets the callbacks to be called when compilations or executions finish.
*
* Example usage:
*
* // Callback to be invoked whenever a compilation has completed.
* void compilationCallback(void* context,
* ANeuralNetworksDiagnosticCompilationInfo* info) {
* // The context object can be used to store state without the use of a
* global variable. ExampleLoggerObject* logger =
* static_cast<ExampleLoggerObject*>(context);
*
* // Calls to getters to get the details...
* const int32_t sessionId =
* ANeuralNetworksDiagnosticCompilationInfo_getSessionId(info);
*
* ...
*
* logger->write(...);
* }
*
* void executionCallback(void* context,
* ANeuralNetworksDiagnosticExecutionInfo* info) {
* ...
* }
*
* ExampleLoggerObject exampleLoggerObject;
* ANeuralNetworksDiagnostic_registerCallbacks(&compilationCallback,
* &executionCallback, static_cast<void*>(&exampleLoggerObject));
*
* @param compilationCallback The compilation callback to set.
* @param executionCallback The execution callback to set.
* @param callbackContext The context to be passed to the callbacks when they
* are invoked. The context object may be used by multiple threads
* simulatenously, so it must be thread-safe.
*/
void (*SL_ANeuralNetworksDiagnostic_registerCallbacks)(
ANeuralNetworksDiagnosticCompilationFinishedCallback compilationCallback,
ANeuralNetworksDiagnosticExecutionFinishedCallback executionCallback,
void* callbackContext);
};
/**
@ -1790,4 +2113,4 @@ struct NnApi {
*/
const NnApi* NnApiImplementation();
#endif // TENSORFLOW_LITE_NNAPI_NNAPI_IMPLEMENTATION_H_
#endif // TENSORFLOW_LITE_NNAPI_NNAPI_IMPLEMENTATION_H_

View file

@ -0,0 +1,245 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#include "core/providers/nnapi/nnapi_builtin/nnapi_lib/nnapi_implementation.h"
//
// Stub out the API with default implementations that do nothing.
//
#include "core/providers/nnapi/nnapi_builtin/builders/helper.h"
#include "core/providers/nnapi/nnapi_builtin/nnapi_lib/NeuralNetworksTypes.h"
namespace {
const NnApi LoadNnApi() {
NnApi nnapi = {};
nnapi.android_sdk_version = ORT_NNAPI_MAX_SUPPORTED_API_LEVEL;
nnapi.nnapi_runtime_feature_level = ANEURALNETWORKS_FEATURE_LEVEL_7;
nnapi.ANeuralNetworksMemory_createFromFd =
[](size_t, int, int, size_t, ANeuralNetworksMemory**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemory_free = [](ANeuralNetworksMemory*) {};
nnapi.ANeuralNetworksModel_create =
[](ANeuralNetworksModel**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksModel_free = [](ANeuralNetworksModel*) {};
nnapi.ANeuralNetworksModel_finish = [](ANeuralNetworksModel*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksModel_addOperand = [](ANeuralNetworksModel*, const ANeuralNetworksOperandType*) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_setOperandValue = [](ANeuralNetworksModel*, int32_t, const void*, size_t) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_setOperandSymmPerChannelQuantParams =
[](ANeuralNetworksModel*, int32_t, const ANeuralNetworksSymmPerChannelQuantParams*) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_setOperandValueFromMemory =
[](ANeuralNetworksModel*, int32_t, const ANeuralNetworksMemory*, size_t, size_t) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_addOperation =
[](ANeuralNetworksModel*, ANeuralNetworksOperationType, uint32_t, const uint32_t*, uint32_t, const uint32_t*) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_identifyInputsAndOutputs =
[](ANeuralNetworksModel*, uint32_t, const uint32_t*, uint32_t, const uint32_t*) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_relaxComputationFloat32toFloat16 =
[](ANeuralNetworksModel*, bool) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksCompilation_create =
[](ANeuralNetworksModel*, ANeuralNetworksCompilation**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksCompilation_free = [](ANeuralNetworksCompilation*) {};
nnapi.ANeuralNetworksCompilation_setPreference =
[](ANeuralNetworksCompilation*, int32_t) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksCompilation_finish =
[](ANeuralNetworksCompilation*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_create =
[](ANeuralNetworksCompilation*, ANeuralNetworksExecution**) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_free = [](ANeuralNetworksExecution*) {};
nnapi.ANeuralNetworksExecution_setInput =
[](ANeuralNetworksExecution*, int32_t, const ANeuralNetworksOperandType*, const void*, size_t) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_setInputFromMemory =
[](ANeuralNetworksExecution*, int32_t, const ANeuralNetworksOperandType*, const ANeuralNetworksMemory*, size_t,
size_t) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_setOutput =
[](ANeuralNetworksExecution*, int32_t, const ANeuralNetworksOperandType*, void*, size_t) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_setOutputFromMemory =
[](ANeuralNetworksExecution*, int32_t, const ANeuralNetworksOperandType*, const ANeuralNetworksMemory*, size_t,
size_t) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_startCompute =
[](ANeuralNetworksExecution*, ANeuralNetworksEvent**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksEvent_wait = [](ANeuralNetworksEvent*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksEvent_free = [](ANeuralNetworksEvent*) {};
nnapi.ASharedMemory_create = [](const char*, size_t) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworks_getDeviceCount = [](uint32_t*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworks_getDevice =
[](uint32_t, ANeuralNetworksDevice**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksDevice_getName =
[](const ANeuralNetworksDevice*, const char**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksDevice_getVersion =
[](const ANeuralNetworksDevice*, const char**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksDevice_getFeatureLevel =
[](const ANeuralNetworksDevice*, int64_t* feature_level) {
*feature_level = ANEURALNETWORKS_FEATURE_LEVEL_7;
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksDevice_getType =
[](const ANeuralNetworksDevice*, int32_t*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksModel_getSupportedOperationsForDevices =
[](const ANeuralNetworksModel*, const ANeuralNetworksDevice* const*, uint32_t, bool*) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksCompilation_createForDevices =
[](ANeuralNetworksModel*, const ANeuralNetworksDevice* const*, uint32_t, ANeuralNetworksCompilation**) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksCompilation_setCaching =
[](ANeuralNetworksCompilation*, const char*, const uint8_t*) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksCompilation_setTimeout =
[](ANeuralNetworksCompilation*, uint64_t) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksCompilation_setPriority =
[](ANeuralNetworksCompilation*, int) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_compute =
[](ANeuralNetworksExecution*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_setTimeout =
[](ANeuralNetworksExecution*, uint64_t) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_setLoopTimeout =
[](ANeuralNetworksExecution*, uint64_t) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_getOutputOperandRank =
[](ANeuralNetworksExecution*, int32_t, uint32_t*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_getOutputOperandDimensions =
[](ANeuralNetworksExecution*, int32_t, uint32_t*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksBurst_create =
[](ANeuralNetworksCompilation*, ANeuralNetworksBurst**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksBurst_free = [](ANeuralNetworksBurst*) {};
nnapi.ANeuralNetworksExecution_burstCompute =
[](ANeuralNetworksExecution*, ANeuralNetworksBurst*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemory_createFromAHardwareBuffer =
[](const AHardwareBuffer*, ANeuralNetworksMemory**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_setMeasureTiming =
[](ANeuralNetworksExecution*, bool) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_getDuration =
[](const ANeuralNetworksExecution*, int32_t, uint64_t*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksDevice_getExtensionSupport =
[](const ANeuralNetworksDevice*, const char*, bool*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksModel_getExtensionOperandType =
[](ANeuralNetworksModel*, const char*, uint16_t, int32_t*) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_getExtensionOperationType =
[](ANeuralNetworksModel*, const char*, uint16_t, ANeuralNetworksOperationType*) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksModel_setOperandExtensionData =
[](ANeuralNetworksModel*, int32_t, const void*, size_t) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemoryDesc_create =
[](ANeuralNetworksMemoryDesc**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemoryDesc_free = [](ANeuralNetworksMemoryDesc*) {};
nnapi.ANeuralNetworksMemoryDesc_addInputRole =
[](ANeuralNetworksMemoryDesc*, const ANeuralNetworksCompilation*, uint32_t, float) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksMemoryDesc_addOutputRole =
[](ANeuralNetworksMemoryDesc*, const ANeuralNetworksCompilation*, uint32_t, float) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksMemoryDesc_setDimensions =
[](ANeuralNetworksMemoryDesc*, uint32_t, const uint32_t*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemoryDesc_finish =
[](ANeuralNetworksMemoryDesc*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksMemory_createFromDesc =
[](const ANeuralNetworksMemoryDesc*, ANeuralNetworksMemory**) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksMemory_copy =
[](const ANeuralNetworksMemory*, const ANeuralNetworksMemory*) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksEvent_createFromSyncFenceFd =
[](int, ANeuralNetworksEvent**) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksEvent_getSyncFenceFd =
[](const ANeuralNetworksEvent*, int*) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_startComputeWithDependencies =
[](ANeuralNetworksExecution*, const ANeuralNetworksEvent* const*, uint32_t, uint64_t, ANeuralNetworksEvent**) {
return static_cast<int>(ANEURALNETWORKS_NO_ERROR);
};
nnapi.ANeuralNetworksExecution_enableInputAndOutputPadding =
[](ANeuralNetworksExecution*, bool) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworksExecution_setReusable =
[](ANeuralNetworksExecution*, bool) { return static_cast<int>(ANEURALNETWORKS_NO_ERROR); };
nnapi.ANeuralNetworks_getRuntimeFeatureLevel = []() { return int64_t(ANEURALNETWORKS_FEATURE_LEVEL_7); };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_getSessionId =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> int32_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_getNnApiVersion =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> int64_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_getModelArchHash =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> const uint8_t* { return nullptr; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_getDeviceIds =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> const char* { return ""; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_getErrorCode =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> int32_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_getInputDataClass =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> ANeuralNetworksDiagnosticDataClass { return {}; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_getOutputDataClass =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> ANeuralNetworksDiagnosticDataClass { return {}; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_getCompilationTimeNanos =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> uint64_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_isCachingEnabled =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> bool { return false; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_isControlFlowUsed =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> bool { return false; };
nnapi.SL_ANeuralNetworksDiagnosticCompilationInfo_areDynamicTensorsUsed =
[](const ANeuralNetworksDiagnosticCompilationInfo*) -> bool { return false; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getSessionId =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> int32_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getNnApiVersion =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> int64_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getModelArchHash =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> const uint8_t* { return nullptr; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getDeviceIds =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> const char* { return ""; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getExecutionMode =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> ANeuralNetworksDiagnosticExecutionMode { return {}; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getInputDataClass =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> ANeuralNetworksDiagnosticDataClass { return {}; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getOutputDataClass =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> ANeuralNetworksDiagnosticDataClass { return {}; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getErrorCode =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> uint32_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getRuntimeExecutionTimeNanos =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> uint64_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getDriverExecutionTimeNanos =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> uint64_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_getHardwareExecutionTimeNanos =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> uint64_t { return 0; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_isCachingEnabled =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> bool { return false; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_isControlFlowUsed =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> bool { return false; };
nnapi.SL_ANeuralNetworksDiagnosticExecutionInfo_areDynamicTensorsUsed =
[](const ANeuralNetworksDiagnosticExecutionInfo*) -> bool { return false; };
nnapi.SL_ANeuralNetworksDiagnostic_registerCallbacks =
[](ANeuralNetworksDiagnosticCompilationFinishedCallback,
ANeuralNetworksDiagnosticExecutionFinishedCallback,
void*) -> void {};
return nnapi;
}
} // namespace
const NnApi* NnApiImplementation() {
static const NnApi nnapi = LoadNnApi();
return &nnapi;
}

View file

@ -1,8 +1,8 @@
1. Files: nnapi_implementation.h
nnapi_implementation.cc
NeuralNetworksTypes.h
These files are copied from TensorFlow Lite project
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/nnapi
These files are copied from TensorFlow Lite project (release tag v2.9.1)
https://github.com/tensorflow/tensorflow/tree/v2.9.1/tensorflow/lite/nnapi
These files do not need to be updated frequently, unless new functionalities are
introduced in new Android OS versions, and we will integrate the new functionalities.
@ -10,15 +10,19 @@ introduced in new Android OS versions, and we will integrate the new functionali
The modifications to these files,
NeuralNetworksTypes.h
* The enum ANEURALNETWORKS_MAX_SIZE_OF_IMMEDIATELY_COPIED_VALUES was added.
* The operation ANEURALNETWORKS_GROUPED_CONV_2D was added.
nnapi_implementation.h/cc
* Include paths were updated
* In nnapi_implementation.cc, NeuralNetworksSupportLibraryImpl.h was replaced with NeuralNetworksTypes.h.
We don't keep a copy of NeuralNetworksSupportLibraryImpl.h yet.
* CreateNnApiFromSupportLibrary was removed
* A stub implementation was added to enable unit testing on non-Android platforms
* [TODO, add support of CreateNnApiFromSupportLibrary for Android 12]
2. Files: NeuralNetworksWrapper.h
NeuralNetworksWrapper.cc
This NeuralNetworksWrapper.h is copied from The Android Open Source Project
* https://android.googlesource.com/platform/frameworks/ml/+/refs/heads/master/nn/runtime/include/
This file is heavily modified, and an extra NeuralNetworksWrapper.cc was added.
Please do not update these files.
This NeuralNetworksWrapper.h is copied from The Android Open Source Project
* https://android.googlesource.com/platform/frameworks/ml/+/refs/heads/master/nn/runtime/include/
This file is heavily modified, and an extra NeuralNetworksWrapper.cc was added.
Please do not update these files.
3. File: nnapi_implementation_stub.cc
A stub implementation of nnapi_implementation.h was added to enable unit testing on non-Android platforms.