1ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet/* 2ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * Copyright (C) 2017 The Android Open Source Project 3ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * 4ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * Licensed under the Apache License, Version 2.0 (the "License"); 5ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * you may not use this file except in compliance with the License. 6ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * You may obtain a copy of the License at 7ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * 8ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * http://www.apache.org/licenses/LICENSE-2.0 9ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * 10ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * Unless required by applicable law or agreed to in writing, software 11ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * distributed under the License is distributed on an "AS IS" BASIS, 12ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * See the License for the specific language governing permissions and 14ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet * limitations under the License. 15ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet */ 16ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 17ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#define LOG_TAG "SampleDriverFloatSlow" 18ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 19ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "SampleDriver.h" 20ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 21ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "HalInterfaces.h" 22ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include "Utils.h" 23c5e342b62bf25a98d15ae28ee97916b274296e94Jean-Luc Brouillet#include "ValidateHal.h" 24ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 25ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <android-base/logging.h> 26ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <hidl/LegacySupport.h> 27ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet#include <thread> 28ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 29ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace android { 30ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace nn { 31ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletnamespace sample_driver { 32ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 33ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletclass SampleDriverFloatSlow : public SampleDriver { 34ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletpublic: 35ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet SampleDriverFloatSlow() : SampleDriver("sample-float-slow") {} 3647b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross Return<void> getCapabilities_1_1(getCapabilities_1_1_cb cb) override; 37d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler Return<void> getSupportedOperations_1_1(const V1_1::Model& model, 38d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler getSupportedOperations_1_1_cb cb) override; 39ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet}; 40ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 4147b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid GrossReturn<void> SampleDriverFloatSlow::getCapabilities_1_1(getCapabilities_1_1_cb cb) { 42a116e12f3a150b3dfc6afa91b0997e551490a9f8Jean-Luc Brouillet android::nn::initVLogMask(); 43820215d28bed6c90f696cde0f282445d16da432eMiao Wang VLOG(DRIVER) << "getCapabilities()"; 44ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet Capabilities capabilities = {.float32Performance = {.execTime = 1.3f, .powerUsage = 0.7f}, 4547b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross .quantized8Performance = {.execTime = 1.0f, .powerUsage = 1.0f}, 4647b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross .relaxedFloat32toFloat16Performance = 4747b5916d2c4c5d0e0d4f6b43075a23449c16345bDavid Gross {.execTime = 1.2f, .powerUsage = 0.6f}}; 48ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet cb(ErrorStatus::NONE, capabilities); 49ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet return Void(); 50ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} 51ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 52d56b2323c6e367d77bc226c5e35908d9512af79eMichael ButlerReturn<void> SampleDriverFloatSlow::getSupportedOperations_1_1(const V1_1::Model& model, 53d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler getSupportedOperations_1_1_cb cb) { 54820215d28bed6c90f696cde0f282445d16da432eMiao Wang VLOG(DRIVER) << "getSupportedOperations()"; 55ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet if (validateModel(model)) { 56ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet const size_t count = model.operations.size(); 57ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet std::vector<bool> supported(count); 58ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet for (size_t i = 0; i < count; i++) { 59d56b2323c6e367d77bc226c5e35908d9512af79eMichael Butler const Operation& operation = model.operations[i]; 60ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet if (operation.inputs.size() > 0) { 61ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet const Operand& firstOperand = model.operands[operation.inputs[0]]; 62ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet supported[i] = firstOperand.type == OperandType::TENSOR_FLOAT32; 63ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } 64ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } 65ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet cb(ErrorStatus::NONE, supported); 66ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } else { 67ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet std::vector<bool> supported; 68ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet cb(ErrorStatus::INVALID_ARGUMENT, supported); 69ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet } 70ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet return Void(); 71ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} 72ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 73ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace sample_driver 74ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace nn 75ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} // namespace android 76ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 77ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletusing android::nn::sample_driver::SampleDriverFloatSlow; 78ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletusing android::sp; 79ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet 80ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouilletint main() { 81ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet sp<SampleDriverFloatSlow> driver(new SampleDriverFloatSlow()); 82ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet return driver->run(); 83ef22aa5727b96e9a0863ef71cfbe3dbdac339408Jean-Luc Brouillet} 84