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