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