| /* |
| * Copyright (c) 2019-2021 Arm Limited. All rights reserved. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| * |
| * Licensed under the Apache License, Version 2.0 (the License); you may |
| * not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an AS IS BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #pragma once |
| |
| #include <array> |
| #include <queue> |
| #include <stdlib.h> |
| #include <string> |
| #include <vector> |
| |
| namespace InferenceProcess { |
| struct DataPtr { |
| void *data; |
| size_t size; |
| |
| DataPtr(void *data = nullptr, size_t size = 0); |
| |
| void invalidate(); |
| void clean(); |
| }; |
| |
| struct InferenceJob { |
| std::string name; |
| DataPtr networkModel; |
| std::vector<DataPtr> input; |
| std::vector<DataPtr> output; |
| std::vector<DataPtr> expectedOutput; |
| size_t numBytesToPrint; |
| std::vector<uint8_t> pmuEventConfig; |
| uint32_t pmuCycleCounterEnable; |
| std::vector<uint32_t> pmuEventCount; |
| uint64_t pmuCycleCounterCount; |
| |
| InferenceJob(); |
| InferenceJob(const std::string &name, |
| const DataPtr &networkModel, |
| const std::vector<DataPtr> &input, |
| const std::vector<DataPtr> &output, |
| const std::vector<DataPtr> &expectedOutput, |
| size_t numBytesToPrint, |
| const std::vector<uint8_t> &pmuEventConfig, |
| const uint32_t pmuCycleCounterEnable); |
| |
| void invalidate(); |
| void clean(); |
| }; |
| |
| class InferenceProcess { |
| public: |
| InferenceProcess(uint8_t *_tensorArena, size_t _tensorArenaSize) : |
| lock(0), tensorArena(_tensorArena), tensorArenaSize(_tensorArenaSize) {} |
| |
| bool push(const InferenceJob &job); |
| bool runJob(InferenceJob &job); |
| bool run(bool exitOnEmpty = true); |
| |
| private: |
| volatile uint32_t lock; |
| uint8_t *tensorArena; |
| const size_t tensorArenaSize; |
| std::queue<InferenceJob> inferenceJobQueue; |
| |
| void getLock(); |
| void freeLock(); |
| }; |
| } // namespace InferenceProcess |