SampleDriverQuant.cpp revision 820215d28bed6c90f696cde0f282445d16da432e
1b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani/*
2b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani * Copyright (C) 2017 The Android Open Source Project
3b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani *
4b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
5b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani * you may not use this file except in compliance with the License.
6b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani * You may obtain a copy of the License at
7b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani *
8b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
9b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani *
10b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani * Unless required by applicable law or agreed to in writing, software
11b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
12b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani * See the License for the specific language governing permissions and
14b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani * limitations under the License.
15b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani */
16b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani
17b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani#define LOG_TAG "SampleDriverQuant"
18b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani
19ab61b0df4af1a504e845c7008224ebadb5400ce9Andres Morales#include "SampleDriver.h"
207ab8929cc6ecbd1ba14c0d6ecb393b31f9a6fcdaAndres Morales
2139b467482d1bf256a111c757e9b7621c6f523271Jason Monk#include "HalInterfaces.h"
22ab61b0df4af1a504e845c7008224ebadb5400ce9Andres Morales#include "Utils.h"
23ab61b0df4af1a504e845c7008224ebadb5400ce9Andres Morales
24b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani#include <android-base/logging.h>
257dbbe131683c231f6820bca4d67853649a4836f8Sudheer Shanka#include <hidl/LegacySupport.h>
262c53933e8d35ba50d0791a29e46fa3156e9cab7cJulia Reynolds#include <thread>
27ff8a68010e2f7f41da6db592f3eea836e7d9274fRussell Brenner
2839b467482d1bf256a111c757e9b7621c6f523271Jason Monknamespace android {
29b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasaninamespace nn {
30b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasaninamespace sample_driver {
31b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani
32b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasaniclass SampleDriverQuant : public SampleDriver {
33ce25af48383b26535ec07312ab0db6928bba1fe3Julia Reynoldspublic:
34b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani    SampleDriverQuant() : SampleDriver("sample-quant") {}
359d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren    Return<void> getCapabilities(getCapabilities_cb _hidl_cb) override;
367dbbe131683c231f6820bca4d67853649a4836f8Sudheer Shanka    Return<void> getSupportedOperations(const Model& model, getSupportedOperations_cb cb) override;
377dbbe131683c231f6820bca4d67853649a4836f8Sudheer Shanka};
387dbbe131683c231f6820bca4d67853649a4836f8Sudheer Shanka
3939b467482d1bf256a111c757e9b7621c6f523271Jason MonkReturn<void> SampleDriverQuant::getCapabilities(getCapabilities_cb cb) {
40b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani    VLOG(DRIVER) << "getCapabilities()";
41b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani    Capabilities capabilities = {.float32Performance = {.execTime = 50.0f, .powerUsage = 1.0f},
42b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani                                 .quantized8Performance = {.execTime = 50.0f, .powerUsage = 1.0f}};
43b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani    cb(ErrorStatus::NONE, capabilities);
44b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani    return Void();
45b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani}
46b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani
47b14e1e04939ca610fd5f2439f879265450b0a6cdAmith YamasaniReturn<void> SampleDriverQuant::getSupportedOperations(const Model& model,
48b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani                                                       getSupportedOperations_cb cb) {
49b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani    VLOG(DRIVER) << "getSupportedOperations()";
500708d9e119da4c4d9424c0bc54fa458d01856bd7Udam Saini    if (validateModel(model)) {
51b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani        const size_t count = model.operations.size();
52b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani        std::vector<bool> supported(count);
53b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani        for (size_t i = 0; i < count; i++) {
54b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani            const Operation& operation = model.operations[i];
55b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani            if (operation.inputs.size() > 0) {
56b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani                const Operand& firstOperand = model.operands[operation.inputs[0]];
57b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani                supported[i] = firstOperand.type == OperandType::TENSOR_QUANT8_ASYMM;
58b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani            }
59b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani        }
60b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani        cb(ErrorStatus::NONE, supported);
61b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani    } else {
62b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani        std::vector<bool> supported;
63b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani        cb(ErrorStatus::INVALID_ARGUMENT, supported);
64b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani    }
65b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani    return Void();
66b14e1e04939ca610fd5f2439f879265450b0a6cdAmith Yamasani}
67ab61b0df4af1a504e845c7008224ebadb5400ce9Andres Morales
687ab8929cc6ecbd1ba14c0d6ecb393b31f9a6fcdaAndres Morales} // namespace sample_driver
697ab8929cc6ecbd1ba14c0d6ecb393b31f9a6fcdaAndres Morales} // namespace nn
70de4fc8eb2a27797adaa7afac98fa3a2a7ffd8f99Russell Brenner} // namespace android
71de4fc8eb2a27797adaa7afac98fa3a2a7ffd8f99Russell Brenner
72de4fc8eb2a27797adaa7afac98fa3a2a7ffd8f99Russell Brennerusing android::nn::sample_driver::SampleDriverQuant;
73de4fc8eb2a27797adaa7afac98fa3a2a7ffd8f99Russell Brennerusing android::sp;
74de4fc8eb2a27797adaa7afac98fa3a2a7ffd8f99Russell Brenner
75de4fc8eb2a27797adaa7afac98fa3a2a7ffd8f99Russell Brennerint main() {
76e6bf2a5609b9aabbd790c3c3680172f4b50a3f8eAndres Morales    android::nn::initVLogMask();
77c17ec1be19a45dec12d601f1e6a545f558bdf293Andres Morales    sp<SampleDriverQuant> driver(new SampleDriverQuant());
78c17ec1be19a45dec12d601f1e6a545f558bdf293Andres Morales    return driver->run();
79c17ec1be19a45dec12d601f1e6a545f558bdf293Andres Morales}
80e6bf2a5609b9aabbd790c3c3680172f4b50a3f8eAndres Morales