/* * Copyright (C) 2021 The Android Open Source Project * * 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. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "ExecutionBuilder.h" #include "NeuralNetworksSupportLibraryImpl.h" #include "Telemetry.h" namespace { using android::nn::ExecutionMode; using android::nn::telemetry::DataClass; using android::nn::telemetry::DiagnosticCompilationInfo; using android::nn::telemetry::DiagnosticExecutionInfo; const DiagnosticCompilationInfo* castTo(const ANeuralNetworksDiagnosticCompilationInfo* info) { CHECK(info != nullptr); return reinterpret_cast(info); } const DiagnosticExecutionInfo* castTo(const ANeuralNetworksDiagnosticExecutionInfo* info) { CHECK(info != nullptr); return reinterpret_cast(info); } const ANeuralNetworksDiagnosticCompilationInfo* castFrom(const DiagnosticCompilationInfo* info) { CHECK(info != nullptr); return reinterpret_cast(info); } const ANeuralNetworksDiagnosticExecutionInfo* castFrom(const DiagnosticExecutionInfo* info) { CHECK(info != nullptr); return reinterpret_cast(info); } ANeuralNetworksDiagnosticDataClass convert(DataClass dataClass) { switch (dataClass) { case DataClass::UNKNOWN: return ANNDIAG_DATA_CLASS_UNKNOWN; case DataClass::OTHER: return ANNDIAG_DATA_CLASS_OTHER; case DataClass::FLOAT32: return ANNDIAG_DATA_CLASS_FLOAT32; case DataClass::FLOAT16: return ANNDIAG_DATA_CLASS_FLOAT16; case DataClass::QUANT: return ANNDIAG_DATA_CLASS_QUANT; case DataClass::MIXED: return ANNDIAG_DATA_CLASS_MIXED; } LOG(FATAL) << "Unrecognized DataClass " << static_cast(dataClass); return ANNDIAG_DATA_CLASS_UNKNOWN; } ANeuralNetworksDiagnosticExecutionMode convert(ExecutionMode executionMode) { switch (executionMode) { case ExecutionMode::ASYNC: return ANNDIAG_EXECUTION_MODE_ASYNC; case ExecutionMode::SYNC: return ANNDIAG_EXECUTION_MODE_SYNC; case ExecutionMode::BURST: return ANNDIAG_EXECUTION_MODE_BURST; case ExecutionMode::ASYNC_WITH_DEPS: return ANNDIAG_EXECUTION_MODE_ASYNC_WITH_DEPS; } LOG(FATAL) << "Unrecognized ExecutionMode " << static_cast(executionMode); return ANNDIAG_EXECUTION_MODE_UNKNOWN; } } // namespace int32_t SL_ANeuralNetworksDiagnosticCompilationInfo_getSessionId( const ANeuralNetworksDiagnosticCompilationInfo* /*diagnosticCompilationInfo*/) { return android::nn::telemetry::getSessionId(); } int64_t SL_ANeuralNetworksDiagnosticCompilationInfo_getNnApiVersion( const ANeuralNetworksDiagnosticCompilationInfo* /*diagnosticCompilationInfo*/) { return android::nn::DeviceManager::get()->getRuntimeFeatureLevel(); } const uint8_t* SL_ANeuralNetworksDiagnosticCompilationInfo_getModelArchHash( const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo) { return castTo(diagnosticCompilationInfo)->modelArchHash; } const char* SL_ANeuralNetworksDiagnosticCompilationInfo_getDeviceIds( const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo) { return castTo(diagnosticCompilationInfo)->deviceId.c_str(); } int32_t SL_ANeuralNetworksDiagnosticCompilationInfo_getErrorCode( const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo) { return castTo(diagnosticCompilationInfo)->errorCode; } ANeuralNetworksDiagnosticDataClass SL_ANeuralNetworksDiagnosticCompilationInfo_getInputDataClass( const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo) { return convert(castTo(diagnosticCompilationInfo)->inputDataClass); } ANeuralNetworksDiagnosticDataClass SL_ANeuralNetworksDiagnosticCompilationInfo_getOutputDataClass( const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo) { return convert(castTo(diagnosticCompilationInfo)->outputDataClass); } uint64_t SL_ANeuralNetworksDiagnosticCompilationInfo_getCompilationTimeNanos( const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo) { return castTo(diagnosticCompilationInfo)->compilationTimeNanos; } bool SL_ANeuralNetworksDiagnosticCompilationInfo_isCachingEnabled( const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo) { return castTo(diagnosticCompilationInfo)->cacheEnabled; } bool SL_ANeuralNetworksDiagnosticCompilationInfo_isControlFlowUsed( const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo) { return castTo(diagnosticCompilationInfo)->hasControlFlow; } bool SL_ANeuralNetworksDiagnosticCompilationInfo_areDynamicTensorsUsed( const ANeuralNetworksDiagnosticCompilationInfo* diagnosticCompilationInfo) { return castTo(diagnosticCompilationInfo)->hasDynamicTemporaries; } int32_t SL_ANeuralNetworksDiagnosticExecutionInfo_getSessionId( const ANeuralNetworksDiagnosticExecutionInfo* /*diagnosticExecutionInfo*/) { return android::nn::telemetry::getSessionId(); } int64_t SL_ANeuralNetworksDiagnosticExecutionInfo_getNnApiVersion( const ANeuralNetworksDiagnosticExecutionInfo* /*diagnosticExecutionInfo*/) { return android::nn::DeviceManager::get()->getRuntimeFeatureLevel(); } const uint8_t* SL_ANeuralNetworksDiagnosticExecutionInfo_getModelArchHash( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return castTo(diagnosticExecutionInfo)->modelArchHash; } const char* SL_ANeuralNetworksDiagnosticExecutionInfo_getDeviceIds( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return castTo(diagnosticExecutionInfo)->deviceId.c_str(); } ANeuralNetworksDiagnosticExecutionMode SL_ANeuralNetworksDiagnosticExecutionInfo_getExecutionMode( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return convert(castTo(diagnosticExecutionInfo)->executionMode); } ANeuralNetworksDiagnosticDataClass SL_ANeuralNetworksDiagnosticExecutionInfo_getInputDataClass( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return convert(castTo(diagnosticExecutionInfo)->inputDataClass); } ANeuralNetworksDiagnosticDataClass SL_ANeuralNetworksDiagnosticExecutionInfo_getOutputDataClass( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return convert(castTo(diagnosticExecutionInfo)->outputDataClass); } uint32_t SL_ANeuralNetworksDiagnosticExecutionInfo_getErrorCode( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return castTo(diagnosticExecutionInfo)->errorCode; } uint64_t SL_ANeuralNetworksDiagnosticExecutionInfo_getRuntimeExecutionTimeNanos( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return castTo(diagnosticExecutionInfo)->durationRuntimeNanos; } uint64_t SL_ANeuralNetworksDiagnosticExecutionInfo_getDriverExecutionTimeNanos( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return castTo(diagnosticExecutionInfo)->durationDriverNanos; } uint64_t SL_ANeuralNetworksDiagnosticExecutionInfo_getHardwareExecutionTimeNanos( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return castTo(diagnosticExecutionInfo)->durationHardwareNanos; } bool SL_ANeuralNetworksDiagnosticExecutionInfo_isCachingEnabled( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return castTo(diagnosticExecutionInfo)->cacheEnabled; } bool SL_ANeuralNetworksDiagnosticExecutionInfo_isControlFlowUsed( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return castTo(diagnosticExecutionInfo)->hasControlFlow; } bool SL_ANeuralNetworksDiagnosticExecutionInfo_areDynamicTensorsUsed( const ANeuralNetworksDiagnosticExecutionInfo* diagnosticExecutionInfo) { return castTo(diagnosticExecutionInfo)->hasDynamicTemporaries; } void SL_ANeuralNetworksDiagnostic_registerCallbacks( ANeuralNetworksDiagnosticCompilationFinishedCallback compilationCallback, ANeuralNetworksDiagnosticExecutionFinishedCallback executionCallback, void* callbackContext) { using android::nn::telemetry::registerTelemetryCallbacks; std::function compilation = [compilationCallback, callbackContext](const DiagnosticCompilationInfo* info) { compilationCallback(callbackContext, castFrom(info)); }; std::function execution = [executionCallback, callbackContext](const DiagnosticExecutionInfo* info) { executionCallback(callbackContext, castFrom(info)); }; registerTelemetryCallbacks(std::move(compilation), std::move(execution)); }