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));
|
|
}
|