CompilationBuilder.cpp revision 0b9453e41a544f9c780eaa15ad65136ad4662ccb
183e24dc4706a5b7089881a55daf05b3924fab3b7David Gross/*
283e24dc4706a5b7089881a55daf05b3924fab3b7David Gross * Copyright (C) 2017 The Android Open Source Project
383e24dc4706a5b7089881a55daf05b3924fab3b7David Gross *
483e24dc4706a5b7089881a55daf05b3924fab3b7David Gross * Licensed under the Apache License, Version 2.0 (the "License");
583e24dc4706a5b7089881a55daf05b3924fab3b7David Gross * you may not use this file except in compliance with the License.
683e24dc4706a5b7089881a55daf05b3924fab3b7David Gross * You may obtain a copy of the License at
783e24dc4706a5b7089881a55daf05b3924fab3b7David Gross *
883e24dc4706a5b7089881a55daf05b3924fab3b7David Gross *      http://www.apache.org/licenses/LICENSE-2.0
983e24dc4706a5b7089881a55daf05b3924fab3b7David Gross *
1083e24dc4706a5b7089881a55daf05b3924fab3b7David Gross * Unless required by applicable law or agreed to in writing, software
1183e24dc4706a5b7089881a55daf05b3924fab3b7David Gross * distributed under the License is distributed on an "AS IS" BASIS,
1283e24dc4706a5b7089881a55daf05b3924fab3b7David Gross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1383e24dc4706a5b7089881a55daf05b3924fab3b7David Gross * See the License for the specific language governing permissions and
1483e24dc4706a5b7089881a55daf05b3924fab3b7David Gross * limitations under the License.
1583e24dc4706a5b7089881a55daf05b3924fab3b7David Gross */
1683e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
1783e24dc4706a5b7089881a55daf05b3924fab3b7David Gross#define LOG_TAG "CompilationBuilder"
1883e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
1983e24dc4706a5b7089881a55daf05b3924fab3b7David Gross#include "CompilationBuilder.h"
2083e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
213ced3cfd5b8f22b632c35f24e585c4847383b195David Gross#include "ExecutionBuilder.h"
220b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross#include "ExecutionPlan.h"
230b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross#include "ModelBuilder.h"
240b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross#include "Utils.h"
2583e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
2683e24dc4706a5b7089881a55daf05b3924fab3b7David Grossnamespace android {
2783e24dc4706a5b7089881a55daf05b3924fab3b7David Grossnamespace nn {
2883e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
2983e24dc4706a5b7089881a55daf05b3924fab3b7David GrossCompilationBuilder::CompilationBuilder(const ModelBuilder* model) :
3083e24dc4706a5b7089881a55daf05b3924fab3b7David Gross    mModel(model) {
3183e24dc4706a5b7089881a55daf05b3924fab3b7David Gross    LOG(DEBUG) << "CompilationBuilder::CompilationBuilder";
3283e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}
3383e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
3465aa556323f4a054f80a75b6c4c721b2a7ed3298David Grossint CompilationBuilder::finish() {
3565aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    if (mFinished) {
3665aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        LOG(ERROR) << "ANeuralNetworksCompilation_finish called more than once";
3765aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        return ANEURALNETWORKS_BAD_STATE;
3865aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    }
3965aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross
4065aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    mFinished = true;
410b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross
420b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross#ifdef NN_DEBUGGABLE
430b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross    if (getProp("debug.nn.partition.test")) {
440b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross        ExecutionPlan plan;
450b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross        mModel->partitionTheWork(mPreference, &plan);
460b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross    }
470b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross#endif  // NN_DEBUGGABLE
480b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross
4965aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    return ANEURALNETWORKS_NO_ERROR;
5065aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross}
5165aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross
5265aa556323f4a054f80a75b6c4c721b2a7ed3298David Grossint CompilationBuilder::setPreference(int32_t preference) {
5365aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    if (mFinished) {
5465aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        LOG(ERROR) <<
5565aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross                "ANeuralNetworksCompilation_setPreference can't modify after compilation finished";
5665aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        return ANEURALNETWORKS_BAD_STATE;
5765aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    }
5865aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    mPreference = preference;
5983e24dc4706a5b7089881a55daf05b3924fab3b7David Gross    return ANEURALNETWORKS_NO_ERROR;
6083e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}
6183e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
623ced3cfd5b8f22b632c35f24e585c4847383b195David Grossint CompilationBuilder::createExecution(ExecutionBuilder **execution) {
6365aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    if (!mFinished) {
6465aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        LOG(ERROR) << "ANeuralNetworksExecution_create passed an unfinished compilation";
6565aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        *execution = nullptr;
6665aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        return ANEURALNETWORKS_BAD_STATE;
6765aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    }
683ced3cfd5b8f22b632c35f24e585c4847383b195David Gross    *execution = new ExecutionBuilder(this);
693ced3cfd5b8f22b632c35f24e585c4847383b195David Gross    return (*execution ? ANEURALNETWORKS_NO_ERROR : ANEURALNETWORKS_OUT_OF_MEMORY);
7083e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}
7183e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
7283e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}  // namespace nn
7383e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}  // namespace android
74