diff options
Diffstat (limited to 'nn/common/include/Utils.h')
-rw-r--r-- | nn/common/include/Utils.h | 592 |
1 files changed, 2 insertions, 590 deletions
diff --git a/nn/common/include/Utils.h b/nn/common/include/Utils.h index cdaf91172..7ac1e59c7 100644 --- a/nn/common/include/Utils.h +++ b/nn/common/include/Utils.h @@ -17,595 +17,7 @@ #ifndef ANDROID_FRAMEWORKS_ML_NN_COMMON_UTILS_H #define ANDROID_FRAMEWORKS_ML_NN_COMMON_UTILS_H -#include <android-base/logging.h> - -#include <set> -#include <string> -#include <tuple> -#include <utility> -#include <vector> - -#include "HalInterfaces.h" -#include "NeuralNetworks.h" -#include "OperationResolver.h" -#include "ValidateHal.h" -#include "nnapi/TypeUtils.h" -#include "nnapi/Types.h" - -namespace android { -namespace nn { - -// The number of data types (OperandCode) defined in NeuralNetworks.h. -const int kNumberOfDataTypes = 16; - -// The number of operation types (OperationCode) defined in NeuralNetworks.h. -const int kNumberOfOperationTypes = 102; -static_assert(kNumberOfOperationTypes == BuiltinOperationResolver::kNumberOfOperationTypes); - -// The number of execution preferences defined in NeuralNetworks.h. -const int kNumberOfPreferences = 3; - -// The number of data types (OperandCode) defined in NeuralNetworksOEM.h. -const int kNumberOfDataTypesOEM = 2; - -// The number of operation types (OperationCode) defined in NeuralNetworksOEM.h. -const int kNumberOfOperationTypesOEM = 1; - -// The lowest number assigned to any OEM Code in NeuralNetworksOEM.h. -const int kOEMCodeBase = 10000; - -/* IMPORTANT: if you change the following list, don't - * forget to update the corresponding 'tags' table in - * the initVlogMask() function implemented in Utils.cpp. - */ -enum VLogFlags { MODEL = 0, COMPILATION, EXECUTION, CPUEXE, MANAGER, DRIVER, MEMORY }; - -#define VLOG_IS_ON(TAG) ((vLogMask & (1 << (TAG))) != 0) - -#define VLOG(TAG) \ - if (LIKELY(!VLOG_IS_ON(TAG))) \ - ; \ - else \ - LOG(INFO) - -extern int vLogMask; -void initVLogMask(); - -#ifdef NN_DEBUGGABLE -#define SHOW_IF_DEBUG(msg) msg -#else -#define SHOW_IF_DEBUG(msg) "" -#endif - -// DEPRECATED(b/118737105). Use CHECK. -#define nnAssert(v) CHECK(v) - -#define NN_RETURN_IF_ERROR(expr) \ - do { \ - int _errorCode = (expr); \ - if (_errorCode != ANEURALNETWORKS_NO_ERROR) { \ - return _errorCode; \ - } \ - } while (0) - -// Make an TimeoutDuration from a duration in nanoseconds. If the value exceeds -// the max duration, return the maximum expressible duration. -TimeoutDuration makeTimeoutDuration(uint64_t nanoseconds); - -// Type to represent a deadline time point across processes. -using Deadline = std::chrono::steady_clock::time_point; - -// Make an Deadline from a duration. If the sum of the current time and the -// duration exceeds the max time, return a time point holding the maximum -// expressible time. -Deadline makeDeadline(TimeoutDuration duration); -inline Deadline makeDeadline(uint64_t duration) { - return makeDeadline(makeTimeoutDuration(duration)); -} - -// Convenience function. If the duration is provided, this function creates a -// Deadline using makeDeadline. If the duration is not provided, this function -// returns std::nullopt. -inline std::optional<Deadline> makeDeadline(OptionalTimeoutDuration duration) { - return duration.has_value() ? makeDeadline(*duration) : std::optional<Deadline>{}; -} -inline std::optional<Deadline> makeDeadline(std::optional<uint64_t> duration) { - return duration.has_value() ? makeDeadline(*duration) : std::optional<Deadline>{}; -} - -// Make an optional Deadline from an OptionalTimePoint. If -// timePoint.nanosecondsSinceEpoch cannot be represented in Deadline, return a -// time point holding the maximum Deadline. If the OptionalTimePoint is none, -// this function returns std::nullopt. -std::optional<Deadline> makeDeadline(const V1_3::OptionalTimePoint& timePoint); - -// Returns true if the deadline has passed. Returns false if either the deadline -// has not been exceeded or if the deadline is not present. -bool hasDeadlinePassed(const std::optional<Deadline>& deadline); - -// Make an OptionalTimePoint from an optional Deadline. If the Deadline is not -// provided, this function returns none for OptionalTimePoint. -OptionalTimePoint makeTimePoint(const std::optional<Deadline>& deadline); - -// Ensure that every user of FalseyErrorStream is linked to the -// correct instance, using the correct LOG_TAG -namespace { - -template <HalVersion version> -struct VersionedType {}; - -template <> -struct VersionedType<HalVersion::V1_2> { - using OperandPerformance = V1_2::Capabilities::OperandPerformance; - using OperandType = V1_2::OperandType; -}; - -template <> -struct VersionedType<HalVersion::V1_3> { - using OperandPerformance = V1_3::Capabilities::OperandPerformance; - using OperandType = V1_3::OperandType; -}; - -template <HalVersion version> -using VersionedOperandPerformance = typename VersionedType<version>::OperandPerformance; -template <HalVersion version> -using VersionedOperandType = typename VersionedType<version>::OperandType; - -} // namespace - -// Return a vector with one entry for each non-extension OperandType except -// SUBGRAPH, set to the specified PerformanceInfo value. The vector will be -// sorted by OperandType. -// -// Control flow (OperandType::SUBGRAPH) operation performance is specified -// separately using Capabilities::ifPerformance and -// Capabilities::whilePerformance. -template <HalVersion version> -hardware::hidl_vec<VersionedOperandPerformance<version>> nonExtensionOperandPerformance( - V1_0::PerformanceInfo perf); - -// Update the vector entry corresponding to the specified OperandType with the -// specified PerformanceInfo value. The vector must already have an entry for -// that OperandType, and must be sorted by OperandType. -void update(hardware::hidl_vec<V1_2::Capabilities::OperandPerformance>* operandPerformance, - V1_2::OperandType type, V1_0::PerformanceInfo perf); -void update(hardware::hidl_vec<V1_3::Capabilities::OperandPerformance>* operandPerformance, - V1_3::OperandType type, V1_0::PerformanceInfo perf); - -// Look for a vector entry corresponding to the specified OperandType. If -// found, return the associated PerformanceInfo. If not, return a pessimistic -// PerformanceInfo (FLT_MAX). The vector must be sorted by OperandType. -V1_0::PerformanceInfo lookup( - const hardware::hidl_vec<V1_2::Capabilities::OperandPerformance>& operandPerformance, - V1_2::OperandType type); -V1_0::PerformanceInfo lookup( - const hardware::hidl_vec<V1_3::Capabilities::OperandPerformance>& operandPerformance, - V1_3::OperandType type); - -// Returns true if an operand type is an extension type. -bool isExtensionOperandType(V1_3::OperandType type); - -// Returns true if an operation type is an extension type. -bool isExtensionOperationType(V1_3::OperationType type); - -// Returns the amount of space needed to store a value of the specified -// dimensions and type. For a tensor with unspecified rank or at least one -// unspecified dimension, returns zero. -// -// Aborts if the specified type is an extension type. -// Aborts if the size would overflow the return type. -// -// See also TypeManager::getSizeOfData(OperandType, const std::vector<uint32_t>&). -uint32_t nonExtensionOperandSizeOfData(V1_3::OperandType type, - const std::vector<uint32_t>& dimensions); -uint32_t nonExtensionOperandSizeOfData(OperandType type, const std::vector<uint32_t>& dimensions); - -// Returns the amount of space needed to store a value of the dimensions and -// type of this operand. For a tensor with unspecified rank or at least one -// unspecified dimension, returns zero. -// -// Aborts if the specified type is an extension type. -// Aborts if the size would overflow the return type. -// -// See also TypeManager::getSizeOfData(const Operand&). -inline uint32_t nonExtensionOperandSizeOfData(const Operand& operand) { - return nonExtensionOperandSizeOfData(operand.type, operand.dimensions); -} -inline uint32_t nonExtensionOperandSizeOfData(const V1_3::Operand& operand) { - return nonExtensionOperandSizeOfData(operand.type, operand.dimensions); -} - -// Returns the amount of space needed to store a value of the specified -// dimensions and element size. For a tensor with unspecified rank or at least -// one unspecified dimension, returns zero. -// -// Aborts if the size would overflow the return type. -// -// See also TypeManager::getSizeOfData(const Operand&). -uint32_t sizeOfTensorData(uint32_t sizeOfElement, const std::vector<uint32_t>& dimensions); - -// Returns true if the amount of space needed to store a value of the specified -// dimensions and element size overflows the uint32_t type. -// -// Aborts if the specified type is an extension type. -// -// See also TypeManager::sizeOfDataOverflowsUInt32(OperandType, const std::vector<uint32_t>&). -bool nonExtensionOperandSizeOfDataOverflowsUInt32(OperandType type, - const std::vector<uint32_t>& dimensions); -bool nonExtensionOperandSizeOfDataOverflowsUInt32(V1_3::OperandType type, - const std::vector<uint32_t>& dimensions); - -// Returns true if the amount of space needed to store a value of the specified -// dimensions and element size overflows the uint32_t type. -// -// See also TypeManager::sizeOfDataOverflowsUInt32(OperandType, const std::vector<uint32_t>&). -bool sizeOfTensorDataOverflowsUInt32(uint32_t elementSize, const std::vector<uint32_t>& dimensions); - -// Returns true if a non-extension operand type is a scalar type. -// -// Aborts if the specified type is an extension type. -// -// See also TypeManager::isTensorType(OperandType). -bool nonExtensionOperandTypeIsScalar(int type); - -// Returns the name of the operation type in ASCII. -std::string getOperationName(V1_3::OperationType opCode); - -// Returns the name of the operand type in ASCII. -std::string getOperandTypeName(V1_3::OperandType type); - -// Whether an operand of tensor type has unspecified dimensions. -// -// Undefined behavior if the operand type is a scalar type. -bool tensorHasUnspecifiedDimensions(int type, const uint32_t* dim, uint32_t dimCount); -bool tensorHasUnspecifiedDimensions(V1_3::OperandType type, - const std::vector<uint32_t>& dimensions); -bool tensorHasUnspecifiedDimensions(OperandType type, const std::vector<uint32_t>& dimensions); -bool tensorHasUnspecifiedDimensions(OperandType type, const Dimensions& dimensions); -bool tensorHasUnspecifiedDimensions(const Operand& operand); -bool tensorHasUnspecifiedDimensions(const V1_3::Operand& operand); -bool tensorHasUnspecifiedDimensions(const ANeuralNetworksOperandType* type); - -// Returns the number of padding bytes needed to align data of the -// specified length. It aligns object of length: -// 2, 3 on a 2 byte boundary, -// 4+ on a 4 byte boundary. -// We may want to have different alignments for tensors. -// TODO: This is arbitrary, more a proof of concept. We need -// to determine what this should be. -uint32_t alignBytesNeeded(uint32_t index, size_t length); - -// Does a detailed LOG(INFO) of the model -void logModelToInfo(const V1_0::Model& model); -void logModelToInfo(const V1_1::Model& model); -void logModelToInfo(const V1_2::Model& model); -void logModelToInfo(const V1_3::Model& model); -void logModelToInfo(const Model& model); - -inline std::string toString(uint32_t obj) { - return std::to_string(obj); -} - -template <typename Type> -std::string toString(const std::vector<Type>& range) { - std::string os = "["; - for (size_t i = 0; i < range.size(); ++i) { - os += (i == 0 ? "" : ", ") + toString(range[i]); - } - return os += "]"; -} - -template <typename A, typename B> -std::string toString(const std::pair<A, B>& pair) { - std::ostringstream oss; - oss << "(" << pair.first << ", " << pair.second << ")"; - return oss.str(); -} - -inline bool validCode(uint32_t codeCount, uint32_t codeCountOEM, uint32_t code) { - return (code < codeCount) || (code >= kOEMCodeBase && (code - kOEMCodeBase) < codeCountOEM); -} - -bool validateOperandSymmPerChannelQuantParams( - const V1_3::Operand& halOperand, - const ANeuralNetworksSymmPerChannelQuantParams& channelQuant, const char* tag); - -// Validates an operand type. -// -// extensionOperandTypeInfo must be nullptr iff the type is not an extension type. -// -// If allowPartial is true, the dimensions may be underspecified. -int validateOperandType(const ANeuralNetworksOperandType& type, - const Extension::OperandTypeInformation* const extensionOperandTypeInfo, - const char* tag, bool allowPartial); -int validateOperandList(uint32_t count, const uint32_t* list, uint32_t operandCount, - const char* tag); - -// A set of functions to help validate models containing IF or WHILE operations. -struct SubgraphValidationHelper { - // Checks if a given operand is a SUBGRAPH operand with a valid offset. - std::function<bool(const Operand&)> isValidSubgraphReference; - // Gets the input count of a subgraph referenced by a given operand. - std::function<uint32_t(const Operand&)> getSubgraphInputCount; - // Gets the output count of a subgraph referenced by a given operand. - std::function<uint32_t(const Operand&)> getSubgraphOutputCount; - // Gets the specified input operand of a subgraph referenced by a given operand. - std::function<const Operand*(const Operand&, uint32_t)> getSubgraphInputOperand; - // Gets the specified output operand of a subgraph referenced by a given operand. - std::function<const Operand*(const Operand&, uint32_t)> getSubgraphOutputOperand; - // Whether control flow operations with inner or outer input or output - // operands of unknown size are allowed. - bool allowControlFlowOperationWithOperandOfUnknownSize; -}; - -// Returns ANEURALNETWORKS_NO_ERROR if the corresponding operation is defined and can handle the -// provided operand types in the given HAL version, otherwise returns ANEURALNETWORKS_BAD_DATA. -// The last argument is only used for validating IF and WHILE operations. -int validateOperation(ANeuralNetworksOperationType opType, uint32_t inputCount, - const uint32_t* inputIndexes, uint32_t outputCount, - const uint32_t* outputIndexes, const std::vector<Operand>& operands, - HalVersion halVersion, const SubgraphValidationHelper& helper); - -inline size_t getSizeFromInts(int lower, int higher) { - return (uint32_t)(lower) + ((uint64_t)(uint32_t)(higher) << 32); -} - -// Convert ANEURALNETWORKS_* result code to ErrorStatus. -// Not guaranteed to be a 1-to-1 mapping. -ErrorStatus convertResultCodeToErrorStatus(int resultCode); -V1_3::ErrorStatus convertResultCodeToHalErrorStatus(int resultCode); - -// Convert ErrorStatus to ANEURALNETWORKS_* result code. -// Not guaranteed to be a 1-to-1 mapping. -int convertErrorStatusToResultCode(ErrorStatus status); -int convertErrorStatusToResultCode(V1_3::ErrorStatus status); - -// Convert execution results to runtime format. Additionally checks that the -// returned results abide by the HAL specification, and logs an error if the -// result violates the specification. -std::tuple<int, std::vector<OutputShape>, Timing> getExecutionResult( - V1_3::ErrorStatus status, const hardware::hidl_vec<V1_2::OutputShape>& outputShapes, - const V1_2::Timing& timing); -std::tuple<int, std::vector<OutputShape>, Timing> getExecutionResult( - ErrorStatus status, std::vector<OutputShape> outputShapes, Timing timing); - -// Versioning - -bool compliantWithV1_0(const V1_0::Capabilities& capabilities); -bool compliantWithV1_0(const V1_1::Capabilities& capabilities); -bool compliantWithV1_0(const V1_2::Capabilities& capabilities); -bool compliantWithV1_0(const V1_3::Capabilities& capabilities); -bool compliantWithV1_1(const V1_0::Capabilities& capabilities); -bool compliantWithV1_1(const V1_1::Capabilities& capabilities); -bool compliantWithV1_1(const V1_2::Capabilities& capabilities); -bool compliantWithV1_1(const V1_3::Capabilities& capabilities); -bool compliantWithV1_2(const V1_0::Capabilities& capabilities); -bool compliantWithV1_2(const V1_1::Capabilities& capabilities); -bool compliantWithV1_2(const V1_2::Capabilities& capabilities); -bool compliantWithV1_2(const V1_3::Capabilities& capabilities); -bool compliantWithV1_3(const V1_0::Capabilities& capabilities); -bool compliantWithV1_3(const V1_1::Capabilities& capabilities); -bool compliantWithV1_3(const V1_2::Capabilities& capabilities); -bool compliantWithV1_3(const V1_3::Capabilities& capabilities); - -// If noncompliantOperations != nullptr, then -// precondition: noncompliantOperations->empty() -// postcondition: *noncompliantOperations consists of the indices of the noncompliant -// operations; if the compliance check fails for some reason -// other than a noncompliant operation, -// *noncompliantOperations consists of the indices of all operations -bool compliantWithV1_0(const V1_0::Model& model); -bool compliantWithV1_0(const V1_1::Model& model); -bool compliantWithV1_0(const V1_2::Model& model, - std::set<uint32_t>* noncompliantOperations = nullptr); -bool compliantWithV1_0(const V1_3::Model& model, - std::set<uint32_t>* noncompliantOperations = nullptr); -bool compliantWithV1_1(const V1_0::Model& model); -bool compliantWithV1_1(const V1_1::Model& model); -bool compliantWithV1_1(const V1_2::Model& model, - std::set<uint32_t>* noncompliantOperations = nullptr); -bool compliantWithV1_1(const V1_3::Model& model, - std::set<uint32_t>* noncompliantOperations = nullptr); -bool compliantWithV1_2(const V1_0::Model& model); -bool compliantWithV1_2(const V1_1::Model& model); -bool compliantWithV1_2(const V1_2::Model& model, - std::set<uint32_t>* noncompliantOperations = nullptr); -bool compliantWithV1_2(const V1_3::Model& model, - std::set<uint32_t>* noncompliantOperations = nullptr); - -V1_0::ErrorStatus convertToV1_0(V1_0::ErrorStatus status); -V1_0::ErrorStatus convertToV1_0(V1_3::ErrorStatus status); -V1_3::ErrorStatus convertToV1_3(V1_0::ErrorStatus status); -V1_3::ErrorStatus convertToV1_3(V1_3::ErrorStatus status); - -V1_0::Capabilities convertToV1_0(const V1_0::Capabilities& capabilities); -V1_0::Capabilities convertToV1_0(const V1_1::Capabilities& capabilities); -V1_0::Capabilities convertToV1_0(const V1_2::Capabilities& capabilities); -V1_0::Capabilities convertToV1_0(const V1_3::Capabilities& capabilities); -V1_1::Capabilities convertToV1_1(const V1_0::Capabilities& capabilities); -V1_1::Capabilities convertToV1_1(const V1_1::Capabilities& capabilities); -V1_1::Capabilities convertToV1_1(const V1_2::Capabilities& capabilities); -V1_1::Capabilities convertToV1_1(const V1_3::Capabilities& capabilities); -V1_2::Capabilities convertToV1_2(const V1_0::Capabilities& capabilities); -V1_2::Capabilities convertToV1_2(const V1_1::Capabilities& capabilities); -V1_2::Capabilities convertToV1_2(const V1_2::Capabilities& capabilities); -V1_2::Capabilities convertToV1_2(const V1_3::Capabilities& capabilities); -V1_3::Capabilities convertToV1_3(const V1_0::Capabilities& capabilities); -V1_3::Capabilities convertToV1_3(const V1_1::Capabilities& capabilities); -V1_3::Capabilities convertToV1_3(const V1_2::Capabilities& capabilities); -V1_3::Capabilities convertToV1_3(const V1_3::Capabilities& capabilities); - -V1_0::Model convertToV1_0(const V1_0::Model& model); -V1_0::Model convertToV1_0(const V1_1::Model& model); -V1_0::Model convertToV1_0(const V1_2::Model& model); -V1_0::Model convertToV1_0(const V1_3::Model& model); -V1_1::Model convertToV1_1(const V1_0::Model& model); -V1_1::Model convertToV1_1(const V1_1::Model& model); -V1_1::Model convertToV1_1(const V1_2::Model& model); -V1_1::Model convertToV1_1(const V1_3::Model& model); -V1_2::Model convertToV1_2(const V1_0::Model& model); -V1_2::Model convertToV1_2(const V1_1::Model& model); -V1_2::Model convertToV1_2(const V1_2::Model& model); -V1_2::Model convertToV1_2(const V1_3::Model& model); -V1_3::Model convertToV1_3(const V1_0::Model& model); -V1_3::Model convertToV1_3(const V1_1::Model& model); -V1_3::Model convertToV1_3(const V1_2::Model& model); -V1_3::Model convertToV1_3(const V1_3::Model& model); - -V1_0::OperationType uncheckedConvertToV1_0(V1_3::OperationType type); -V1_1::OperationType uncheckedConvertToV1_1(V1_3::OperationType type); -V1_2::OperationType uncheckedConvertToV1_2(V1_3::OperationType type); - -V1_0::Operand convertToV1_0(const V1_2::Operand& operand); -V1_0::Operand convertToV1_0(const V1_3::Operand& operand); -V1_2::Operand convertToV1_2(const V1_0::Operand& operand); -V1_2::Operand convertToV1_2(const V1_3::Operand& operand); -V1_3::Operand convertToV1_3(const V1_0::Operand& operand); -V1_3::Operand convertToV1_3(const V1_2::Operand& operand); -V1_3::Operand convertToV1_3(const V1_3::Operand& operand); - -hardware::hidl_vec<V1_0::Operand> convertToV1_0(const hardware::hidl_vec<V1_0::Operand>& operands); -hardware::hidl_vec<V1_0::Operand> convertToV1_0(const hardware::hidl_vec<V1_2::Operand>& operands); -hardware::hidl_vec<V1_0::Operand> convertToV1_0(const hardware::hidl_vec<V1_3::Operand>& operands); -hardware::hidl_vec<V1_2::Operand> convertToV1_2(const hardware::hidl_vec<V1_0::Operand>& operands); -hardware::hidl_vec<V1_2::Operand> convertToV1_2(const hardware::hidl_vec<V1_2::Operand>& operands); -hardware::hidl_vec<V1_2::Operand> convertToV1_2(const hardware::hidl_vec<V1_3::Operand>& operands); -hardware::hidl_vec<V1_3::Operand> convertToV1_3(const hardware::hidl_vec<V1_0::Operand>& operands); -hardware::hidl_vec<V1_3::Operand> convertToV1_3(const hardware::hidl_vec<V1_2::Operand>& operands); -hardware::hidl_vec<V1_3::Operand> convertToV1_3(const hardware::hidl_vec<V1_3::Operand>& operands); - -bool compliantWithV1_0(const V1_0::Request& request); -bool compliantWithV1_0(const V1_3::Request& request); -bool compliantWithV1_2(const V1_3::Request& request); - -V1_0::Request convertToV1_0(const V1_0::Request& request); -V1_0::Request convertToV1_0(const V1_3::Request& request); -V1_0::Request convertToV1_2(const V1_3::Request& request); -V1_3::Request convertToV1_3(const V1_0::Request& request); -V1_3::Request convertToV1_3(const V1_3::Request& request); - -bool compliantWithV1_0(V1_0::OperandLifeTime lifetime); -bool compliantWithV1_0(V1_3::OperandLifeTime lifetime); -bool compliantWithV1_3(V1_0::OperandLifeTime lifetime); -bool compliantWithV1_3(V1_3::OperandLifeTime lifetime); - -V1_0::OperandLifeTime convertToV1_0(V1_0::OperandLifeTime lifetime); -V1_0::OperandLifeTime convertToV1_0(V1_3::OperandLifeTime lifetime); -V1_3::OperandLifeTime convertToV1_3(V1_0::OperandLifeTime lifetime); -V1_3::OperandLifeTime convertToV1_3(V1_3::OperandLifeTime lifetime); - -constexpr V1_3::Priority convertToHalPriority(int32_t priority) { - switch (priority) { - case ANEURALNETWORKS_PRIORITY_LOW: - return V1_3::Priority::LOW; - case ANEURALNETWORKS_PRIORITY_MEDIUM: - return V1_3::Priority::MEDIUM; - case ANEURALNETWORKS_PRIORITY_HIGH: - return V1_3::Priority::HIGH; - } - LOG(FATAL) << "unrecognized priority: " << priority; - return {}; -} - -constexpr Priority convertToCanonicalPriority(int32_t priority) { - switch (priority) { - case ANEURALNETWORKS_PRIORITY_LOW: - return Priority::LOW; - case ANEURALNETWORKS_PRIORITY_MEDIUM: - return Priority::MEDIUM; - case ANEURALNETWORKS_PRIORITY_HIGH: - return Priority::HIGH; - } - LOG(FATAL) << "unrecognized priority: " << priority; - return {}; -} - -// The function syncWait() has the same semantics as the system function -// ::sync_wait(), except that the syncWait() return value is semantically -// richer. The timeout parameter is in msecs. -enum class FenceState { - ACTIVE, // fence has not been signaled - SIGNALED, // fence has been signaled - ERROR, // fence has been placed in the error state - UNKNOWN, // either bad argument passed to syncWait(), or internal error -}; -FenceState syncWait(int fd, int timeout); - -#ifdef NN_DEBUGGABLE -uint32_t getProp(const char* str, uint32_t defaultValue = 0); -#endif // NN_DEBUGGABLE - -// DEPRECATED. Use checked conversions from nnapi/hal/1.X/Conversions.h. -Capabilities::OperandPerformance uncheckedConvert( - const V1_3::Capabilities::OperandPerformance& operandPerformance); -Capabilities::PerformanceInfo uncheckedConvert(const V1_0::PerformanceInfo& performanceInfo); -Capabilities uncheckedConvert(const V1_3::Capabilities& capabilities); -DataLocation uncheckedConvert(const V1_0::DataLocation& location); -ErrorStatus uncheckedConvert(V1_0::ErrorStatus status); -ErrorStatus uncheckedConvert(V1_3::ErrorStatus status); -Extension::OperandTypeInformation uncheckedConvert(const V1_2::Extension::OperandTypeInformation&); -Extension uncheckedConvert(const V1_2::Extension& extension); -hardware::hidl_vec<uint8_t> uncheckedConvert(const Operand::ExtensionParams& params); -MeasureTiming uncheckedConvert(V1_2::MeasureTiming measure); -Memory uncheckedConvert(const hardware::hidl_memory& memory); -Model::ExtensionNameAndPrefix uncheckedConvert(const V1_2::Model::ExtensionNameAndPrefix&); -Model::Subgraph uncheckedConvert(const V1_3::Subgraph& subgraph); -Model uncheckedConvert(const V1_3::Model& model); -Operand::ExtensionParams uncheckedConvert(const hardware::hidl_vec<uint8_t>& params); -Operand::ExtraParams uncheckedConvert(const V1_2::Operand::ExtraParams& params); -Operand::LifeTime uncheckedConvert(V1_3::OperandLifeTime lifetime); -Operand::SymmPerChannelQuantParams uncheckedConvert(const V1_2::SymmPerChannelQuantParams& params); -OperandType uncheckedConvert(V1_3::OperandType operandType); -Operand uncheckedConvert(const V1_3::Operand& operand); -OperationType uncheckedConvert(V1_3::OperationType operationType); -Operation uncheckedConvert(const V1_3::Operation& operation); -OptionalTimeoutDuration uncheckedConvert(const V1_3::OptionalTimeoutDuration& timeoutDuration); -OutputShape uncheckedConvert(const V1_2::OutputShape& outputShape); -Request::Argument uncheckedConvert(const V1_0::RequestArgument& requestArgument); -Request::MemoryPool uncheckedConvert(const V1_3::Request::MemoryPool& memoryPool); -Request uncheckedConvert(const V1_3::Request& request); -std::vector<Extension> uncheckedConvert(const hardware::hidl_vec<V1_2::Extension>& extensions); -std::vector<Memory> uncheckedConvert(const hardware::hidl_vec<hardware::hidl_memory>& memories); -std::vector<Model::Subgraph> uncheckedConvert(const hardware::hidl_vec<V1_3::Subgraph>& subgraphs); -std::vector<Operand> uncheckedConvert(const hardware::hidl_vec<V1_3::Operand>& operands); -std::vector<OutputShape> uncheckedConvert( - const hardware::hidl_vec<V1_2::OutputShape>& outputShapes); -std::vector<Request::MemoryPool> uncheckedConvert( - const hardware::hidl_vec<V1_3::Request::MemoryPool>& memoryPools); -Timing uncheckedConvert(const V1_2::Timing& timing); - -// DEPRECATED. Use conversions from nnapi/hal/1.X/Conversions.h. -hardware::hidl_memory convertToV1_0(const Memory& memory); -hardware::hidl_vec<hardware::hidl_memory> convertToV1_0(const std::vector<Memory>& memories); -hardware::hidl_vec<uint8_t> convertToV1_0(const Model::OperandValues& operandValues); -hardware::hidl_vec<V1_2::OutputShape> convertToV1_2(const std::vector<OutputShape>& outputShapes); -hardware::hidl_vec<V1_3::BufferRole> convertToV1_3(const std::vector<BufferRole>& bufferRoles); -V1_0::DataLocation convertToV1_0(const DataLocation& location); -V1_0::ErrorStatus convertToV1_0(ErrorStatus status); -V1_0::RequestArgument convertToV1_0(const Request::Argument& requestArgument); -V1_1::ExecutionPreference convertToV1_1(ExecutionPreference preference); -V1_2::MeasureTiming convertToV1_2(MeasureTiming measure); -V1_2::Model::ExtensionNameAndPrefix convertToV1_2(const Model::ExtensionNameAndPrefix&); -V1_2::Operand::ExtraParams convertToV1_2(const Operand::ExtraParams& params); -V1_2::OutputShape convertToV1_2(const OutputShape& outputShape); -V1_2::SymmPerChannelQuantParams convertToV1_2(const Operand::SymmPerChannelQuantParams& params); -V1_2::Timing convertToV1_2(const Timing& timing); -V1_3::BufferRole convertToV1_3(const BufferRole& bufferRole); -V1_3::ErrorStatus convertToV1_3(ErrorStatus status); -V1_3::Model convertToV1_3(const Model& model); -V1_3::Operand convertToV1_3(const Operand& operand); -V1_3::OperandLifeTime convertToV1_3(Operand::LifeTime lifetime); -V1_3::OperandType convertToV1_3(OperandType operandType); -V1_3::Operation convertToV1_3(const Operation& operation); -V1_3::OperationType convertToV1_3(OperationType operationType); -V1_3::OptionalTimeoutDuration convertToV1_3(const OptionalTimeoutDuration& timeoutDuration); -V1_3::OptionalTimePoint convertToV1_3(const OptionalTimePoint& timePoint); -V1_3::Priority convertToV1_3(Priority priority); -V1_3::Request convertToV1_3(const Request& request); -V1_3::Request::MemoryPool convertToV1_3(const Request::MemoryPool& memoryPool); -V1_3::Subgraph convertToV1_3(const Model::Subgraph& model); - -} // namespace nn -} // namespace android +#include "LegacyHalUtils.h" +#include "LegacyUtils.h" #endif // ANDROID_FRAMEWORKS_ML_NN_COMMON_UTILS_H |