231 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  * 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 <android-base/logging.h>
 | |
| 
 | |
| #include <functional>
 | |
| #include <utility>
 | |
| 
 | |
| #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<const DiagnosticCompilationInfo*>(info);
 | |
| }
 | |
| 
 | |
| const DiagnosticExecutionInfo* castTo(const ANeuralNetworksDiagnosticExecutionInfo* info) {
 | |
|     CHECK(info != nullptr);
 | |
|     return reinterpret_cast<const DiagnosticExecutionInfo*>(info);
 | |
| }
 | |
| 
 | |
| const ANeuralNetworksDiagnosticCompilationInfo* castFrom(const DiagnosticCompilationInfo* info) {
 | |
|     CHECK(info != nullptr);
 | |
|     return reinterpret_cast<const ANeuralNetworksDiagnosticCompilationInfo*>(info);
 | |
| }
 | |
| 
 | |
| const ANeuralNetworksDiagnosticExecutionInfo* castFrom(const DiagnosticExecutionInfo* info) {
 | |
|     CHECK(info != nullptr);
 | |
|     return reinterpret_cast<const ANeuralNetworksDiagnosticExecutionInfo*>(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<int32_t>(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<int32_t>(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<void(const DiagnosticCompilationInfo*)> compilation =
 | |
|             [compilationCallback, callbackContext](const DiagnosticCompilationInfo* info) {
 | |
|                 compilationCallback(callbackContext, castFrom(info));
 | |
|             };
 | |
|     std::function<void(const DiagnosticExecutionInfo*)> execution =
 | |
|             [executionCallback, callbackContext](const DiagnosticExecutionInfo* info) {
 | |
|                 executionCallback(callbackContext, castFrom(info));
 | |
|             };
 | |
| 
 | |
|     registerTelemetryCallbacks(std::move(compilation), std::move(execution));
 | |
| }
 |