blob: 93542cc73bffe6fe8db72805b0d96d4de9258b8e [file] [log] [blame]
/*
* Copyright (C) 2017 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.
*/
#ifndef ANDROID_FRAMEWORKS_ML_NN_RUNTIME_COMPILATION_BUILDER_H
#define ANDROID_FRAMEWORKS_ML_NN_RUNTIME_COMPILATION_BUILDER_H
#include <chrono>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "ExecutionPlan.h"
#include "Manager.h"
#include "NeuralNetworks.h"
namespace android {
namespace nn {
class BurstBuilder;
class Device;
class ExecutionBuilder;
class ModelBuilder;
class CompilationBuilder {
public:
friend class ExecutionBuilder; // TODO remove this
// explicitDeviceList is true if the list of devices was provided explicitly
// via the ANeuralNetworksModel_createForDevices API (which has certain
// special semantics) and false otherwise.
CompilationBuilder(const ModelBuilder* model,
const std::vector<std::shared_ptr<Device>>& devices,
bool explicitDeviceList = false);
int setPreference(int32_t preference);
int setCaching(const std::string& cacheDir, const uint8_t* token);
// Dups the fds
int setCachingFromFds(const int* modelCacheFds, const uint32_t numModelCacheFiles,
const int* dataCacheFds, const uint32_t numDataCacheFiles,
const uint8_t* token);
int setPriority(int32_t priority);
int setTimeoutDuration(uint64_t duration);
int finish();
int getPreferredMemoryAlignmentForInput(uint32_t index, uint32_t* alignment) const;
int getPreferredMemoryPaddingForInput(uint32_t index, uint32_t* padding) const;
int getPreferredMemoryAlignmentForOutput(uint32_t index, uint32_t* alignment) const;
int getPreferredMemoryPaddingForOutput(uint32_t index, uint32_t* padding) const;
int createExecution(ExecutionBuilder** execution);
int createBurst(BurstBuilder** burst);
const ModelBuilder* getModel() const { return mModel; }
int forEachStepRoleOfInput(uint32_t index, const StepRoleCallback& callback) const;
int forEachStepRoleOfOutput(uint32_t index, const StepRoleCallback& callback) const;
bool createdWithExplicitDeviceList() const { return mExplicitDeviceList; }
bool hasDynamicTemporaries() const { return mPlan.hasDynamicTemporaries(); }
// These functions are solely intended for use by unit tests of the
// partitioning algorithm.
const ExecutionPlan& forTest_getExecutionPlan() const { return mPlan; }
int forTest_setPartitioning(uint32_t partitioning);
int forTest_failPartitioning(
int resultCode); // If not ANEURALNETWORKS_NO_ERROR, then simulate partitioning failure
private:
const ModelBuilder* mModel;
ExecutionPlan mPlan;
// Whether the application prefers to go fast or use low power for this execution.
int32_t mPreference = ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER;
// See class DeviceManager. When CompilationBuilder is
// instantiated, we capture partitioning from DeviceManager; but
// we can override this later.
uint32_t mPartitioning;
// For testing purposes, simulate partitioning failure.
int mFailPartitioning = ANEURALNETWORKS_NO_ERROR;
// Once the compilation has been finished, we should not allow further
// modifications to the compilation.
bool mFinished = false;
// The set of devices that the partitioning algorithm operates on when
// finish() is called.
std::vector<std::shared_ptr<Device>> mDevices;
// mExplicitDeviceList is true if the list of devices was provided
// explicitly via the ANeuralNetworksModel_createForDevices API (which has
// certain special semantics) and false otherwise.
bool mExplicitDeviceList;
// Compilation caching information.
CacheInfo mCacheInfo;
uint8_t mToken[ANEURALNETWORKS_BYTE_SIZE_OF_CACHE_TOKEN];
bool mIsCacheInfoProvided = false;
// Compilation priority information.
int32_t mPriority = ANEURALNETWORKS_PRIORITY_DEFAULT;
// Amount of time to complete or abort the execution.
std::optional<uint64_t> mTimeoutDuration;
};
} // namespace nn
} // namespace android
#endif // ANDROID_FRAMEWORKS_ML_NN_RUNTIME_COMPILATION_BUILDER_H