• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2020 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef ARM_COMPUTE_TEST_CL_HELPER_H
25 #define ARM_COMPUTE_TEST_CL_HELPER_H
26 
27 #include "src/core/CL/kernels/CLFillBorderKernel.h"
28 #include "src/core/CL/kernels/CLMemsetKernel.h"
29 
30 #include "arm_compute/runtime/CL/CLScheduler.h"
31 #include "arm_compute/runtime/CL/ICLSimpleFunction.h"
32 #include "arm_compute/runtime/IFunction.h"
33 
34 #include "src/core/CL/ICLKernel.h"
35 
36 #include "support/MemorySupport.h"
37 
38 namespace arm_compute
39 {
40 namespace test
41 {
42 /** This template synthetizes an ICLSimpleFunction which runs the given kernel K */
43 template <typename K>
44 class CLSynthetizeFunction : public ICLSimpleFunction
45 {
46 public:
47     /** Configure the kernel.
48      *
49      * @param[in] args Configuration arguments.
50      */
51     template <typename... Args>
configure(Args &&...args)52     void configure(Args &&... args)
53     {
54         auto k = arm_compute::support::cpp14::make_unique<K>();
55         k->configure(std::forward<Args>(args)...);
56         _kernel = std::move(k);
57     }
58     /** Configure the kernel setting the GPU target as well
59      *
60      * @param[in] gpu_target GPUTarget to set
61      * @param[in] args       Configuration arguments.
62      */
63     template <typename... Args>
configure(GPUTarget gpu_target,Args &&...args)64     void configure(GPUTarget gpu_target, Args &&... args)
65     {
66         auto k = arm_compute::support::cpp14::make_unique<K>();
67         k->set_target(gpu_target);
68         k->configure(std::forward<Args>(args)...);
69         _kernel = std::move(k);
70     }
71     /** Validate input arguments
72      *
73      * @param[in] args Configuration arguments.
74      */
75     template <typename... Args>
validate(Args &&...args)76     static Status validate(Args &&... args)
77     {
78         return K::validate(std::forward<Args>(args)...);
79     }
80 };
81 
82 /** As above but this also setups a Zero border on the input tensor of the specified bordersize */
83 template <typename K, int bordersize>
84 class CLSynthetizeFunctionWithZeroConstantBorder : public ICLSimpleFunction
85 {
86 public:
87     /** Configure the kernel.
88      *
89      * @param[in] first First configuration argument.
90      * @param[in] args  Rest of the configuration arguments.
91      */
92     template <typename T, typename... Args>
configure(T first,Args &&...args)93     void configure(T first, Args &&... args)
94     {
95         auto k = arm_compute::support::cpp14::make_unique<K>();
96         k->configure(first, std::forward<Args>(args)...);
97         _kernel = std::move(k);
98         _border_handler->configure(first, BorderSize(bordersize), BorderMode::CONSTANT, PixelValue());
99     }
100 };
101 
102 /** As above but this also initializes to zero the input tensor */
103 template <typename K, int bordersize>
104 class CLSynthetizeFunctionInitOutputWithZeroAndWithZeroConstantBorder : public IFunction
105 {
106 public:
107     /** Configure the kernel.
108      *
109      * @param[in] first  First input argument.
110      * @param[in] second Second input argument.
111      * @param[in] args   Rest of the configuration arguments.
112      */
113     template <typename T, typename... Args>
configure(T first,T second,Args &&...args)114     void configure(T first, T second, Args &&... args)
115     {
116         auto k = arm_compute::support::cpp14::make_unique<K>();
117         k->set_target(CLScheduler::get().target());
118         k->configure(first, second, std::forward<Args>(args)...);
119         _kernel = std::move(k);
120         _border_handler.configure(first, BorderSize(bordersize), BorderMode::CONSTANT, PixelValue());
121         _memset_kernel.configure(second, PixelValue());
122     }
123 
124     // Inherited method overridden:
run()125     void run() override final
126     {
127         ARM_COMPUTE_ERROR_ON_MSG(!_kernel, "The CL kernel or function isn't configured");
128 
129         CLScheduler::get().enqueue(_memset_kernel, false);
130         CLScheduler::get().enqueue(_border_handler, false);
131         CLScheduler::get().enqueue(*_kernel);
132     }
133 
134 private:
135     CLMemsetKernel             _memset_kernel{};  /**< Kernel to initialize the tensor */
136     CLFillBorderKernel         _border_handler{}; /**< Kernel to handle  borders */
137     std::unique_ptr<ICLKernel> _kernel{};         /**< Kernel to run */
138 };
139 } // namespace test
140 } // namespace arm_compute
141 #endif /* ARM_COMPUTE_TEST_CL_HELPER_H */
142