45 Status validate_arguments(
const ITensorInfo *src1,
const ITensorInfo *src2,
const ITensorInfo *
dst,
float scale,
67 const bool in_place = (src1 ==
dst) || (src2 == dst);
68 const bool src1_in_place = in_place && (src1 ==
dst);
75 if(dst->total_size() > 0)
83 "Dst can only be U8 if both src are U8");
85 "Dst can only be QASYMM8 if both src are QASYMM8");
87 "Dst can only be QASYMM8_SIGNED if both src are QASYMM8_SIGNED");
89 "Dst can only be QSYMM16 if both src are QSYMM16");
91 "Dst must be S32 if source tensors are S32");
95 "Wrong shape for dst, cannot do in_place calculation");
100 "Wrong shape for dst");
118 scale, overflow_policy, rounding_policy, act_info));
128 float normalized_mantissa = std::frexp(scale, &exponent);
132 if((normalized_mantissa == 0.5f) && (-14 <= exponent) && (exponent <= 1))
136 scale_int = std::abs(exponent - 1);
139 std::string acc_type;
167 const unsigned int vec_size_leftover = dst->
dimension(0) % vec_size;
194 kernel_name +=
"_quantized";
198 kernel_name += (scale_int >= 0) ?
"_int" :
"_float";
201 build_opts.
add_option(
"-DACC_DATA_TYPE=" + acc_type);
211 const bool in_place = (src1 ==
dst) || (src2 == dst);
212 const bool src1_in_place = in_place && (src1 ==
dst);
222 if(scale_int >= 0 && !is_quantized)
224 _kernel.setArg(idx++, scale_int);
228 _kernel.setArg(idx++, scale);
232 ICLKernel::configure_internal(win);
280 const TensorShape &in_shape1 = src_0->info()->tensor_shape();
281 const TensorShape &in_shape2 = src_1->info()->tensor_shape();
282 const TensorShape &out_shape = dst->info()->tensor_shape();
284 bool can_collapse =
true;
290 can_collapse = (in_shape1[d] == in_shape2[d]);
294 bool has_collapsed =
false;
305 const bool in_place = (src_0 ==
dst) || (src_1 == dst);
308 unsigned int idx = 0;
325 constexpr
unsigned int vec_size_complex = 1;
375 _kernel =
create_kernel(compile_context,
"pixelwise_mul_complex", build_opts.options());
378 ICLKernel::configure_internal(win);
400 const TensorShape &in_shape1 = src_0->info()->tensor_shape();
401 const TensorShape &in_shape2 = src_1->info()->tensor_shape();
402 const TensorShape &out_shape = dst->info()->tensor_shape();
404 bool can_collapse =
true;
405 if(std::min(in_shape1.total_size(), in_shape2.
total_size()) > 1)
410 can_collapse = (in_shape1[d] == in_shape2[d]);
414 bool has_collapsed =
false;
426 unsigned int idx = 0;
bool is_data_type_quantized(DataType dt)
Check if a given data type is of quantized type.
Window calculate_max_window(const ValidRegion &valid_region, const Steps &steps, bool skip_border, BorderSize border_size)
#define ARM_COMPUTE_RETURN_ERROR_ON_F16_UNSUPPORTED(tensor)
const Window & window() const
The maximum window the kernel can be executed on.
void configure(const CLCompileContext &compile_context, ITensorInfo *src1, ITensorInfo *src2, ITensorInfo *dst, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Initialise the kernel's src and dst.
quantized, symmetric fixed-point 16-bit number
static Status validate(const ITensorInfo *src1, const ITensorInfo *src2, const ITensorInfo *dst, float scale, ConvertPolicy overflow_policy, RoundingPolicy rounding_policy, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Static function to check if given info will lead to a valid configuration.
bool enabled() const
Check if initialised.
virtual size_t dimension(size_t index) const =0
Return the size of the requested dimension.
void enqueue(cl::CommandQueue &queue, ICLKernel &kernel, const Window &window, const cl::NDRange &lws_hint=CLKernelLibrary::get().default_ndrange(), bool use_dummy_work_items=false)
Add the kernel to the command queue with the given window.
const StringSet & options() const
Gets the current options list set.
cl::NDRange lws_hint() const
Return the Local-Workgroup-Size hint.
TensorShape collapsed_from(size_t start) const
Return a copy with collapsed dimensions starting from a given point.
1 channel, 1 U8 per channel
float a() const
Get the alpha value.
#define ARM_COMPUTE_RETURN_ON_ERROR(status)
Checks if a status contains an error and returns it.
std::string to_string(T &&value)
Convert integer and float values to string.
virtual DataType data_type() const =0
Data type used for each element of the tensor.
1 channel, 1 F32 per channel
static TensorShape broadcast_shape(const Shapes &... shapes)
If shapes are broadcast compatible, return the broadcasted shape.
#define ARM_COMPUTE_ERROR_ON(cond)
If the condition is true then an error message is printed and an exception thrown.
const std::string & string_from_activation_func(ActivationLayerInfo::ActivationFunction act)
Translates a given activation function to a string.
Store the tensor's metadata.
#define ARM_COMPUTE_ERROR_THROW_ON(status)
Manages all the OpenCL kernels compilation and caching, provides accessors for the OpenCL Context...
std::string lower_string(const std::string &val)
Lower a given string.
#define ARM_COMPUTE_RETURN_ERROR_ON(cond)
If the condition is true, an error is returned.
Activation Layer Information class.
void add_3D_tensor_argument(unsigned int &idx, const ICLTensor *tensor, const Window &window)
Add the passed 3D tensor's parameters to the object's kernel's arguments starting from the index idx...
Copyright (c) 2017-2021 Arm Limited.
1 channel, 1 F16 per channel
#define ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(...)
1 channel, 1 S32 per channel
void add_option(std::string option)
Adds option to the existing build option list.
const ITensor * get_const_tensor(int id) const
Get constant tensor of a given id.
cl::Kernel create_kernel(const CLCompileContext &ctx, const std::string &kernel_name, const std::set< std::string > &build_opts=std::set< std::string >())
Creates an opencl kernel using a compile context.
const std::string & string_from_data_type(DataType dt)
Convert a data type identity into a string.
static constexpr unsigned int num_arguments_per_3D_tensor()
Returns the number of arguments enqueued per 3D tensor object.
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
Window collapse_if_possible(const Window &full_window, size_t first, size_t last, bool *has_collapsed=nullptr) const
Collapse the dimensions between first and last if possible.
std::string float_to_string_with_full_precision(float val)
Create a string with the float in full precision.
virtual const TensorShape & tensor_shape() const =0
Size for each dimension of the tensor.
quantized, asymmetric fixed-point 8-bit number unsigned
Class to describe a number of elements in each dimension.
size_t total_size() const
Collapses all dimensions to a single linear total size.
UniformQuantizationInfo uniform() const
Return per layer quantization info.
std::string get_cl_type_from_data_type(const DataType &dt)
Translates a tensor data type to the appropriate OpenCL type.
bool auto_init_if_empty(ITensorInfo &info, const TensorShape &shape, int num_channels, DataType data_type, QuantizationInfo quantization_info=QuantizationInfo())
Auto initialize the tensor info (shape, number of channels and data type) if the current assignment i...
RoundingPolicy
Rounding method.
virtual std::unique_ptr< T > clone() const =0
Provide a clone of the current object of class T.
bool have_different_dimensions(const Dimensions< T > &dim1, const Dimensions< T > &dim2, unsigned int upper_dim)
void add_option_if(bool cond, std::string option)
Adds option if a given condition is true;.
virtual size_t element_size() const =0
Element size in bytes calculated as data_size() * num_channels()
Window broadcast_if_dimension_le_one(const TensorShape &shape) const
Don't advance in the dimension where shape is less equal to 1.
Elementeise CL kernel type.
bool slide_window_slice_3D(Window &slice) const
Slide the passed 3D window slice.
virtual QuantizationInfo quantization_info() const =0
Get the quantization settings (scale and offset) of the tensor.
#define ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(k)
1 channel, 1 S16 per channel
bool has_padding_changed(const std::unordered_map< const ITensorInfo *, PaddingSize > &padding_map)
Check if the previously stored padding info has changed after configuring a kernel.
bool is_data_type_quantized_asymmetric(DataType dt)
Check if a given data type is of asymmetric quantized type.
static Status validate(const ITensorInfo *src1, const ITensorInfo *src2, const ITensorInfo *dst, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Static function to check if given info will lead to a valid configuration.
ITensor * get_tensor(int id)
Get tensor of a given id from the pac.
virtual size_t total_size() const =0
Returns the total size of the tensor in bytes.
static constexpr size_t DimZ
Alias for dimension 2 also known as Z dimension.
void run_op(ITensorPack &tensors, const Window &window, cl::CommandQueue &queue) override
Enqueue the OpenCL kernel to process the given window on the passed OpenCL command queue...
unsigned int num_dimensions() const
Returns the effective dimensionality of the tensor.
void run_op(ITensorPack &tensors, const Window &window, cl::CommandQueue &queue) override
Enqueue the OpenCL kernel to process the given window on the passed OpenCL command queue...
#define ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(...)
#define ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(t, c,...)
std::unordered_map< const ITensorInfo *, PaddingSize > get_padding_info(std::initializer_list< const ITensorInfo *> infos)
Stores padding information before configuring a kernel.
void configure(const CLCompileContext &compile_context, ITensorInfo *src1, ITensorInfo *src2, ITensorInfo *dst, float scale, ConvertPolicy overflow_policy, RoundingPolicy rounding_policy, const ActivationLayerInfo &act_info=ActivationLayerInfo())
Initialise the kernel's src and dst.
Wrapper to configure the Khronos OpenCL C++ header.
#define ARM_COMPUTE_RETURN_ERROR_ON_MSG(cond, msg)
If the condition is true, an error is returned.
#define ARM_COMPUTE_ERROR_ON_NULLPTR(...)
unsigned int adjust_vec_size(unsigned int vec_size, size_t dim0)
Returns the adjusted vector size in case it is less than the input's first dimension, getting rounded down to its closest valid vector size.
ActivationFunction activation() const
Get the type of activation function.
float b() const
Get the beta value.
quantized, asymmetric fixed-point 8-bit number signed
Window first_slice_window_3D() const
First 3D slice of the window.
Truncates the least significant values that are lost in operations.
Describe a multidimensional execution window.
ConvertPolicy
Policy to handle overflow.
bool is_data_type_float(DataType dt)
Check if a given data type is of floating point type.
#define ARM_COMPUTE_ERROR_ON_INVALID_SUBWINDOW(f, s)
SimpleTensor< T > slice(const SimpleTensor< T > &src, Coordinates starts, Coordinates ends)
void add_option_if_else(bool cond, std::string option_true, std::string option_false)
Adds first option if condition is true else the second one.