1/**
2 * Copyright (c) Glow Contributors. See CONTRIBUTORS file.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "../../lib/Onnxifi/GlowOnnxifiManager.h"
18
19#include "gtest/gtest.h"
20
21#include <thread>
22
23using namespace glow::onnxifi;
24
25TEST(GlowOnnxifiManagerTest, BackendIdTest) {
26 auto &manager = GlowOnnxifiManager::get();
27 auto *backend = manager.createBackend("Interpreter",
28 /*use_onnx*/ true);
29 // Backend is valid after it has been added to the manager.
30 EXPECT_TRUE(manager.isValid(backend));
31 manager.release(backend);
32 // Backend isn't valid after it has been released by the manager.
33 EXPECT_FALSE(manager.isValid(backend));
34
35 // Nullptr is not a valid Backend.
36 backend = nullptr;
37 EXPECT_FALSE(manager.isValid(backend));
38}
39
40TEST(GlowOnnxifiManagerTest, EventTest) {
41 auto &manager = GlowOnnxifiManager::get();
42 auto *event = manager.createEvent();
43 // Event is valid after it has been created by the manager.
44 EXPECT_TRUE(manager.isValid(event));
45 manager.release(event);
46 // Event isn't valid after it has been released by the manager.
47 EXPECT_FALSE(manager.isValid(event));
48
49 // Nullptr is not a valid Event.
50 event = nullptr;
51 EXPECT_FALSE(manager.isValid(event));
52}
53
54TEST(GlowOnnxifiManagerTest, GraphTest) {
55 auto &manager = GlowOnnxifiManager::get();
56 auto *backend = manager.createBackend("Interpreter",
57 /*use_onnx*/ true);
58
59 auto *graph = manager.createGraph(backend);
60 // Graph is valid after it has been created by the manager.
61 EXPECT_TRUE(manager.isValid(graph));
62
63 manager.release(graph);
64 // Graph isn't valid after it has been released by the manager.
65 EXPECT_FALSE(manager.isValid(graph));
66
67 manager.release(backend);
68
69 // Nullptr is not a valid Graph.
70 graph = nullptr;
71 EXPECT_FALSE(manager.isValid(graph));
72}
73
74void createAndDestroyManagerObjects() {
75 auto &manager = GlowOnnxifiManager::get();
76 auto *backend = manager.createBackend("Interpreter",
77 /*use_onnx*/ true);
78
79 auto *event = manager.createEvent();
80 auto *graph = manager.createGraph(backend);
81
82 EXPECT_TRUE(manager.isValid(backend));
83 EXPECT_TRUE(manager.isValid(event));
84 EXPECT_TRUE(manager.isValid(graph));
85
86 manager.release(graph);
87 manager.release(event);
88 manager.release(backend);
89}
90
91TEST(GlowOnnxifiManagerTest, Concurrency) {
92 constexpr auto numThreads = 12;
93 constexpr auto numItersPerThread = 100;
94
95 std::vector<std::thread> threads;
96 for (auto i = 0; i < numThreads; ++i) {
97 threads.emplace_back([&]() {
98 for (auto j = 0; j < numItersPerThread; ++j) {
99 createAndDestroyManagerObjects();
100 }
101 });
102 }
103
104 for (auto &t : threads) {
105 t.join();
106 }
107}
108