CompilationBuilder.cpp revision 820215d28bed6c90f696cde0f282445d16da432e
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"
231f4381539b7e89c42336ee7cd1addb9a4c317b34David Gross#include "Manager.h"
240b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross#include "ModelBuilder.h"
250b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross#include "Utils.h"
2683e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
2783e24dc4706a5b7089881a55daf05b3924fab3b7David Grossnamespace android {
2883e24dc4706a5b7089881a55daf05b3924fab3b7David Grossnamespace nn {
2983e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
3083e24dc4706a5b7089881a55daf05b3924fab3b7David GrossCompilationBuilder::CompilationBuilder(const ModelBuilder* model) :
3183e24dc4706a5b7089881a55daf05b3924fab3b7David Gross    mModel(model) {
32820215d28bed6c90f696cde0f282445d16da432eMiao Wang    VLOG(COMPILATION) << "CompilationBuilder::CompilationBuilder";
3383e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}
3483e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
3565aa556323f4a054f80a75b6c4c721b2a7ed3298David Grossint CompilationBuilder::finish() {
3665aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    if (mFinished) {
3765aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        LOG(ERROR) << "ANeuralNetworksCompilation_finish called more than once";
3865aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        return ANEURALNETWORKS_BAD_STATE;
3965aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    }
40e127e49e67b53c96eb79f6a9c58f956ad4761227Jean-Luc Brouillet    // TODO validate the rest
4165aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross
4265aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    mFinished = true;
430b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross
441f4381539b7e89c42336ee7cd1addb9a4c317b34David Gross    if (uint32_t p = DeviceManager::get()->getPartitioning()) {
45def0a14aa77689f12120cfb4f136eea659038cc0David Gross        // Get the list of HAL devices.
46def0a14aa77689f12120cfb4f136eea659038cc0David Gross        const std::vector<std::shared_ptr<Device>>& devices = DeviceManager::get()->getDrivers();
47def0a14aa77689f12120cfb4f136eea659038cc0David Gross
48def0a14aa77689f12120cfb4f136eea659038cc0David Gross        int n = mModel->partitionTheWork(devices, mPreference, &mPlan);
49e3178825b8686f3300a895572691a2e8c1f0676bDavid Gross        if (!DeviceManager::partitioningAllowsFallback(p) &&
50e3178825b8686f3300a895572691a2e8c1f0676bDavid Gross            (n != ANEURALNETWORKS_NO_ERROR)) {
511f4381539b7e89c42336ee7cd1addb9a4c317b34David Gross            return n;
521f4381539b7e89c42336ee7cd1addb9a4c317b34David Gross        }
530b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross    }
540b9453e41a544f9c780eaa15ad65136ad4662ccbDavid Gross
5565aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    return ANEURALNETWORKS_NO_ERROR;
5665aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross}
5765aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross
5865aa556323f4a054f80a75b6c4c721b2a7ed3298David Grossint CompilationBuilder::setPreference(int32_t preference) {
5965aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    if (mFinished) {
6065aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        LOG(ERROR) <<
6165aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross                "ANeuralNetworksCompilation_setPreference can't modify after compilation finished";
6265aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        return ANEURALNETWORKS_BAD_STATE;
6365aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    }
64e127e49e67b53c96eb79f6a9c58f956ad4761227Jean-Luc Brouillet    if (preference >= kNumberOfPreferences) {
65e127e49e67b53c96eb79f6a9c58f956ad4761227Jean-Luc Brouillet        LOG(ERROR) << "ANeuralNetworksCompilation_setPreference invalid preference " << preference;
66e127e49e67b53c96eb79f6a9c58f956ad4761227Jean-Luc Brouillet        return ANEURALNETWORKS_BAD_DATA;
67e127e49e67b53c96eb79f6a9c58f956ad4761227Jean-Luc Brouillet    }
68e127e49e67b53c96eb79f6a9c58f956ad4761227Jean-Luc Brouillet
6965aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    mPreference = preference;
7083e24dc4706a5b7089881a55daf05b3924fab3b7David Gross    return ANEURALNETWORKS_NO_ERROR;
7183e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}
7283e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
733ced3cfd5b8f22b632c35f24e585c4847383b195David Grossint CompilationBuilder::createExecution(ExecutionBuilder **execution) {
7465aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    if (!mFinished) {
7565aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        LOG(ERROR) << "ANeuralNetworksExecution_create passed an unfinished compilation";
7665aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        *execution = nullptr;
7765aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross        return ANEURALNETWORKS_BAD_STATE;
7865aa556323f4a054f80a75b6c4c721b2a7ed3298David Gross    }
793ced3cfd5b8f22b632c35f24e585c4847383b195David Gross    *execution = new ExecutionBuilder(this);
803ced3cfd5b8f22b632c35f24e585c4847383b195David Gross    return (*execution ? ANEURALNETWORKS_NO_ERROR : ANEURALNETWORKS_OUT_OF_MEMORY);
8183e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}
8283e24dc4706a5b7089881a55daf05b3924fab3b7David Gross
8383e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}  // namespace nn
8483e24dc4706a5b7089881a55daf05b3924fab3b7David Gross}  // namespace android
85