Compute Library
 21.02
NEDirectConvolutionLayer Class Reference

Function to run the direct convolution. More...

#include <NEDirectConvolutionLayer.h>

Collaboration diagram for NEDirectConvolutionLayer:
[legend]

Public Member Functions

 NEDirectConvolutionLayer (std::shared_ptr< IMemoryManager > memory_manager=nullptr)
 Constructor. More...
 
 NEDirectConvolutionLayer (const NEDirectConvolutionLayer &)=delete
 Prevent instances of this class from being copied (As this class contains pointers) More...
 
NEDirectConvolutionLayeroperator= (const NEDirectConvolutionLayer &)=delete
 Prevent instances of this class from being copied (As this class contains pointers) More...
 
 NEDirectConvolutionLayer (NEDirectConvolutionLayer &&)=delete
 Prevent instances of this class from being moved (As this class contains non movable objects) More...
 
NEDirectConvolutionLayeroperator= (NEDirectConvolutionLayer &&)=delete
 Prevent instances of this class from being moved (As this class contains non movable objects) More...
 
 ~NEDirectConvolutionLayer ()
 Default destructor. More...
 
void configure (ITensor *input, const ITensor *weights, const ITensor *bias, ITensor *output, const PadStrideInfo &conv_info, const ActivationLayerInfo &act_info=ActivationLayerInfo())
 Set the input, weights, biases and output tensors. More...
 
void run () override
 Run the kernels contained in the function. More...
 
- Public Member Functions inherited from IFunction
virtual ~IFunction ()=default
 Destructor. More...
 
virtual void prepare ()
 Prepare the function for executing. More...
 

Static Public Member Functions

static Status validate (const ITensorInfo *input, const ITensorInfo *weights, const ITensorInfo *bias, const ITensorInfo *output, const PadStrideInfo &conv_info, const ActivationLayerInfo &act_info=ActivationLayerInfo())
 Static function to check if given info will lead to a valid configuration of NEDirectConvolutionLayer. More...
 

Detailed Description

Function to run the direct convolution.

This function calls the following Neon kernels:

  1. NEFillBorderKernel for the input
  2. NEDirectConvolutionLayerOutputStageKernel
  3. NEDirectConvolutionLayerKernel

Definition at line 50 of file NEDirectConvolutionLayer.h.

Constructor & Destructor Documentation

◆ NEDirectConvolutionLayer() [1/3]

NEDirectConvolutionLayer ( std::shared_ptr< IMemoryManager memory_manager = nullptr)

Constructor.

Definition at line 38 of file NEDirectConvolutionLayer.cpp.

39  : _memory_group(std::move(memory_manager)), _output_stage_kernel(), _conv_kernel(), _input_border_handler(), _activationlayer_function(), _accumulator(), _has_bias(false),
40  _is_activationlayer_enabled(false), _dim_split(Window::DimZ), _is_padding_required()
41 {
42 }
static constexpr size_t DimZ
Alias for dimension 2 also known as Z dimension.
Definition: Window.h:47

◆ NEDirectConvolutionLayer() [2/3]

Prevent instances of this class from being copied (As this class contains pointers)

◆ NEDirectConvolutionLayer() [3/3]

Prevent instances of this class from being moved (As this class contains non movable objects)

◆ ~NEDirectConvolutionLayer()

Default destructor.

Member Function Documentation

◆ configure()

void configure ( ITensor input,
const ITensor weights,
const ITensor bias,
ITensor output,
const PadStrideInfo conv_info,
const ActivationLayerInfo act_info = ActivationLayerInfo() 
)

Set the input, weights, biases and output tensors.

Note
: DirectConvolution only works in the following configurations: 1x1 convolution with stride_x = 1/2/3, stride_y = 1/2/3 data type = F16/F32 3x3 convolution with stride_x = 1/2/3, stride_y = 1/2/3 data type = F16/F32 5x5 convolution with stride_x = 1/2/3, stride_y = 1/2/3 data type = F32
Parameters
[in,out]inputInput tensor. Data types supported: F16/F32.
[in]weightsSet of kernels to convolve the input volume. Supported sizes: 1x1, 3x3 and 5x5. The 3rd dimension must be the same as the input's volume 3rd dimension. Data type supported: Same as input.
[in]biasSet of biases. Can be nullptr. Data type supported: Same as input.
[out]outputOutput tensor. The 3rd dimensions must be equal to the 4th dimension of the kernels tensor. Data types supported: Same as input.
[in]conv_infoContains padding and stride information described in PadStrideInfo.
[in]act_info(Optional) Activation layer information in case of a fused activation.

Definition at line 44 of file NEDirectConvolutionLayer.cpp.

References Tensor::allocator(), ARM_COMPUTE_ERROR_ON, Tensor::buffer(), NEActivationLayer::configure(), arm_compute::CONSTANT, ITensorInfo::data_layout(), Window::DimY, Window::DimZ, ActivationLayerInfo::enabled(), TensorAllocator::free(), ITensor::info(), arm_compute::NCHW, and arm_compute::UNKNOWN.

Referenced by arm_compute::test::validation::DATA_TEST_CASE().

45 {
46  ARM_COMPUTE_ERROR_ON(input->info()->data_layout() == DataLayout::UNKNOWN);
47  _output_stage_kernel = std::make_unique<NEDirectConvolutionLayerOutputStageKernel>();
48  _conv_kernel = std::make_unique<NEDirectConvolutionLayerKernel>();
49  _input_border_handler = std::make_unique<NEFillBorderKernel>();
50 
51  // Free accumulator
52  if(_accumulator.buffer() != nullptr)
53  {
54  _accumulator.allocator()->free();
55  }
56 
57  _dim_split = input->info()->data_layout() == DataLayout::NCHW ? Window::DimZ : Window::DimY;
58 
59  // Check if bias should be added in the convolution result
60  _has_bias = (bias != nullptr);
61 
62  _conv_kernel->configure(input, weights, output, conv_info);
63  if(_has_bias)
64  {
65  _output_stage_kernel->configure(output, bias);
66  }
67  _is_padding_required = !_conv_kernel->border_size().empty();
68 
69  if(_is_padding_required)
70  {
71  // Add zero padding XY
72  _input_border_handler->configure(input, _conv_kernel->border_size(), BorderMode::CONSTANT, PixelValue(static_cast<float>(0.f)));
73  }
74 
75  //Configure Activation Layer
76  _is_activationlayer_enabled = act_info.enabled();
77  if(_is_activationlayer_enabled)
78  {
79  _activationlayer_function.configure(output, nullptr, act_info);
80  }
81 }
#define ARM_COMPUTE_ERROR_ON(cond)
If the condition is true then an error message is printed and an exception thrown.
Definition: Error.h:466
TensorAllocator * allocator()
Return a pointer to the tensor&#39;s allocator.
Definition: Tensor.cpp:48
void free() override
Free allocated CPU memory.
Num samples, channels, height, width.
static constexpr size_t DimY
Alias for dimension 1 also known as Y dimension.
Definition: Window.h:45
static constexpr size_t DimZ
Alias for dimension 2 also known as Z dimension.
Definition: Window.h:47
void configure(ITensor *input, ITensor *output, ActivationLayerInfo activation_info)
[NEActivationLayer snippet]
uint8_t * buffer() const override
Interface to be implemented by the child class to return a pointer to CPU memory. ...
Definition: Tensor.cpp:43

◆ operator=() [1/2]

NEDirectConvolutionLayer& operator= ( const NEDirectConvolutionLayer )
delete

Prevent instances of this class from being copied (As this class contains pointers)

◆ operator=() [2/2]

Prevent instances of this class from being moved (As this class contains non movable objects)

◆ run()

void run ( )
overridevirtual

Run the kernels contained in the function.

For Neon kernels:

  • Multi-threading is used for the kernels which are parallelisable.
  • By default std::thread::hardware_concurrency() threads are used.
Note
CPPScheduler::set_num_threads() can be used to manually set the number of threads

For OpenCL kernels:

  • All the kernels are enqueued on the queue associated with CLScheduler.
  • The queue is then flushed.
Note
The function will not block until the kernels are executed. It is the user's responsibility to wait.
Will call prepare() on first run if hasn't been done

Implements IFunction.

Definition at line 114 of file NEDirectConvolutionLayer.cpp.

References Window::DimY, Window::DimZ, Scheduler::get(), NEActivationLayer::run(), and IScheduler::schedule().

115 {
116  MemoryGroupResourceScope scope_mg(_memory_group);
117 
118  if(_is_padding_required)
119  {
120  NEScheduler::get().schedule(_input_border_handler.get(), Window::DimZ);
121  }
122  NEScheduler::get().schedule(_conv_kernel.get(), _dim_split);
123  if(_has_bias)
124  {
125  NEScheduler::get().schedule(_output_stage_kernel.get(), Window::DimY);
126  }
127 
128  if(_is_activationlayer_enabled)
129  {
130  _activationlayer_function.run();
131  }
132 }
void run() override
Run the kernels contained in the function.
static constexpr size_t DimY
Alias for dimension 1 also known as Y dimension.
Definition: Window.h:45
virtual void schedule(ICPPKernel *kernel, const Hints &hints)=0
Runs the kernel in the same thread as the caller synchronously.
static constexpr size_t DimZ
Alias for dimension 2 also known as Z dimension.
Definition: Window.h:47
static IScheduler & get()
Access the scheduler singleton.
Definition: Scheduler.cpp:94

◆ validate()

Status validate ( const ITensorInfo input,
const ITensorInfo weights,
const ITensorInfo bias,
const ITensorInfo output,
const PadStrideInfo conv_info,
const ActivationLayerInfo act_info = ActivationLayerInfo() 
)
static

Static function to check if given info will lead to a valid configuration of NEDirectConvolutionLayer.

Note
: DirectConvolution only works in the following configurations: 1x1 convolution with stride_x = 1/2/3, stride_y = 1/2/3 data type = F16/F32 3x3 convolution with stride_x = 1/2/3, stride_y = 1/2/3 data type = F16/F32 5x5 convolution with stride_x = 1/2/3, stride_y = 1/2/3 data type = F32
Parameters
[in]inputInput tensor. Data types supported: F16/F32.
[in]weightsSet of kernels to convolve the input volume. Supported sizes: 1x1, 3x3 and 5x5. The 3rd dimension must be the same as the input's volume 3rd dimension. Data type supported: Same as input.
[in]biasSet of biases. Can be nullptr. Data type supported: Same as input.
[in]outputOutput tensor. The 3rd dimensions must be equal to the 4th dimension of the kernels tensor. Data types supported: Same as input.
[in]conv_infoContains padding and stride information described in PadStrideInfo.
[in]act_info(Optional) Activation layer information in case of a fused activation.
Returns
a status

Definition at line 83 of file NEDirectConvolutionLayer.cpp.

References ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES, ARM_COMPUTE_RETURN_ERROR_ON_MSG, ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR, ARM_COMPUTE_RETURN_ON_ERROR, ICloneable< T >::clone(), arm_compute::test::validation::data_type, ITensorInfo::data_type(), ITensorInfo::dimension(), ActivationLayerInfo::enabled(), ITensorInfo::num_dimensions(), NEDirectConvolutionLayerOutputStageKernel::validate(), NEDirectConvolutionLayerKernel::validate(), and NEActivationLayer::validate().

Referenced by arm_compute::test::validation::DATA_TEST_CASE(), NEConvolutionLayer::get_convolution_method(), and NEConvolutionLayer::validate().

85 {
87 
88  // output might not be initialized since it can be an intermediate tensor of another layer
89  DataType data_type = input->data_type();
90  TensorInfo accumulator(output->clone()->set_is_resizable(true).reset_padding().set_data_type(data_type));
91 
92  // Validate Convolution kernel
94 
95  if(bias != nullptr)
96  {
98  ARM_COMPUTE_RETURN_ERROR_ON_MSG(bias->dimension(0) != weights->dimension(3),
99  "Biases size and number of input feature maps should match");
100  ARM_COMPUTE_RETURN_ERROR_ON_MSG(bias->num_dimensions() > 1, "Biases should be one dimensional");
101  }
102 
103  // Validate bias kernel
105 
106  if(act_info.enabled())
107  {
108  ARM_COMPUTE_RETURN_ON_ERROR(NEActivationLayer::validate(output, nullptr, act_info));
109  }
110 
111  return Status{};
112 }
#define ARM_COMPUTE_RETURN_ON_ERROR(status)
Checks if a status contains an error and returns it.
Definition: Error.h:204
static Status validate(const ITensorInfo *input, const ITensorInfo *output, const ActivationLayerInfo &act_info)
[NEActivationLayer snippet]
#define ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(...)
Definition: Validate.h:163
const DataType data_type
Definition: Im2Col.cpp:150
static Status validate(const ITensorInfo *input, const ITensorInfo *bias=nullptr, const ITensorInfo *output=nullptr, const DirectConvolutionLayerOutputStageKernelInfo &info=DirectConvolutionLayerOutputStageKernelInfo())
Static function to check if given info will lead to a valid configuration of NEDirectConvolutionLayer...
#define ARM_COMPUTE_RETURN_ERROR_ON_MISMATCHING_DATA_TYPES(...)
Definition: Validate.h:545
static Status validate(const ITensorInfo *input, const ITensorInfo *weights, const ITensorInfo *output, const PadStrideInfo &conv_info)
Static function to check if given info will lead to a valid configuration of NEDirectConvolutionLayer...
#define ARM_COMPUTE_RETURN_ERROR_ON_MSG(cond, msg)
If the condition is true, an error is returned.
Definition: Error.h:244
DataType
Available data types.
Definition: Types.h:77

The documentation for this class was generated from the following files: