blob: 1ff03f7c0afe26d701bbd0817bd7f9d8a067e4bd [file] [log] [blame]
/*
* 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));
}