1 /* 2 * Copyright (c) 2016-2019 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_ICLDISTRIBUTION1D_H 25 #define ARM_COMPUTE_ICLDISTRIBUTION1D_H 26 27 #include "arm_compute/core/IDistribution1D.h" 28 29 #include <cstddef> 30 #include <cstdint> 31 32 namespace cl 33 { 34 class Buffer; 35 class CommandQueue; 36 } 37 38 namespace arm_compute 39 { 40 /** ICLDistribution1D interface class */ 41 class ICLDistribution1D : public IDistribution1D 42 { 43 public: 44 /** Constructor: Creates a 1D CLDistribution of a consecutive interval [offset, offset + range - 1] 45 * defined by a start offset and valid range, divided equally into num_bins parts. 46 * 47 * @param[in] num_bins The number of bins the distribution is divided in. 48 * @param[in] offset The start of the values to use. 49 * @param[in] range The total number of the consecutive values of the distribution interval. 50 */ 51 ICLDistribution1D(size_t num_bins, int32_t offset, uint32_t range); 52 /** Prevent instances of this class from being copied (As this class contains pointers) */ 53 ICLDistribution1D(const ICLDistribution1D &) = delete; 54 /** Prevent instances of this class from being copied (As this class contains pointers) */ 55 const ICLDistribution1D &operator=(const ICLDistribution1D &) = delete; 56 /** Enqueue a map operation of the allocated buffer on the given queue. 57 * 58 * @param[in,out] q The CL command queue to use for the mapping operation. 59 * @param[in] blocking If true, then the mapping will be ready to use by the time 60 * this method returns, else it is the caller's responsibility 61 * to flush the queue and wait for the mapping operation to have completed before using the returned mapping pointer. 62 */ 63 void map(cl::CommandQueue &q, bool blocking = true); 64 /** Enqueue an unmap operation of the allocated and mapped buffer on the given queue. 65 * 66 * @note This method simply enqueues the unmap operation, it is the caller's responsibility to flush the queue and make sure the unmap is finished before 67 * the memory is accessed by the device. 68 * 69 * @param[in,out] q The CL command queue to use for the mapping operation. 70 */ 71 void unmap(cl::CommandQueue &q); 72 /** Interface to be implemented by the child class to return a reference to the OpenCL buffer containing the distribution's data. 73 * 74 * @return A reference to an OpenCL buffer containing the distribution's data. 75 */ 76 virtual cl::Buffer &cl_buffer() = 0; 77 // Inherited methods overridden: 78 uint32_t *buffer() const override; 79 80 protected: 81 /** Method to be implemented by the child class to map the OpenCL buffer 82 * 83 * @param[in,out] q The CL command queue to use for the mapping operation. 84 * @param[in] blocking If true, then the mapping will be ready to use by the time 85 * this method returns, else it is the caller's responsibility 86 * to flush the queue and wait for the mapping operation to have completed before using the returned mapping pointer. 87 */ 88 virtual uint32_t *do_map(cl::CommandQueue &q, bool blocking) = 0; 89 /** Method to be implemented by the child class to unmap the OpenCL buffer 90 * 91 * @note This method simply enqueues the unmap operation, it is the caller's responsibility to flush the queue and make sure the unmap is finished before 92 * the memory is accessed by the device. 93 * 94 * @param[in,out] q The CL command queue to use for the mapping operation. 95 */ 96 virtual void do_unmap(cl::CommandQueue &q) = 0; 97 98 protected: 99 uint32_t *_mapping; /**< The distribution data. */ 100 }; 101 } 102 #endif /* ARM_COMPUTE_ICLDISTRIBUTION1D_H */ 103