aboutsummaryrefslogtreecommitdiff
path: root/arm_compute
diff options
context:
space:
mode:
authorgiuros01 <giuseppe.rossini@arm.com>2019-03-26 17:44:40 +0000
committerGiuseppe Rossini <giuseppe.rossini@arm.com>2019-05-01 14:00:38 +0000
commit05fb448bf48e31d723dfd9f4bbf3899ff65f0fba (patch)
tree610576f2df7f1fc616a165c516f2a9475981f819 /arm_compute
parenta4f378dcd39addd4a63db1c0848f2c120804f4eb (diff)
downloadComputeLibrary-05fb448bf48e31d723dfd9f4bbf3899ff65f0fba.tar.gz
COMPMID-1963: Implement FFT (2D) on NEON
Change-Id: I3b564be8d7949e00c6544071ef62dd51de838c96 Signed-off-by: giuros01 <giuseppe.rossini@arm.com> Reviewed-on: https://review.mlplatform.org/c/1048 Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
Diffstat (limited to 'arm_compute')
-rw-r--r--arm_compute/core/NEON/NEKernels.h1
-rw-r--r--arm_compute/core/NEON/kernels/NEFFTRadixStageKernel.h19
-rw-r--r--arm_compute/core/NEON/kernels/NEFFTScaleKernel.h84
-rw-r--r--arm_compute/runtime/NEON/NEFunctions.h1
-rw-r--r--arm_compute/runtime/NEON/functions/NEFFT1D.h19
-rw-r--r--arm_compute/runtime/NEON/functions/NEFFT2D.h76
6 files changed, 186 insertions, 14 deletions
diff --git a/arm_compute/core/NEON/NEKernels.h b/arm_compute/core/NEON/NEKernels.h
index b8ae467c6d..b9716b1e43 100644
--- a/arm_compute/core/NEON/NEKernels.h
+++ b/arm_compute/core/NEON/NEKernels.h
@@ -64,6 +64,7 @@
#include "arm_compute/core/NEON/kernels/NEErodeKernel.h"
#include "arm_compute/core/NEON/kernels/NEFFTDigitReverseKernel.h"
#include "arm_compute/core/NEON/kernels/NEFFTRadixStageKernel.h"
+#include "arm_compute/core/NEON/kernels/NEFFTScaleKernel.h"
#include "arm_compute/core/NEON/kernels/NEFastCornersKernel.h"
#include "arm_compute/core/NEON/kernels/NEFillArrayKernel.h"
#include "arm_compute/core/NEON/kernels/NEFillBorderKernel.h"
diff --git a/arm_compute/core/NEON/kernels/NEFFTRadixStageKernel.h b/arm_compute/core/NEON/kernels/NEFFTRadixStageKernel.h
index a4c4be6f35..8498d3c613 100644
--- a/arm_compute/core/NEON/kernels/NEFFTRadixStageKernel.h
+++ b/arm_compute/core/NEON/kernels/NEFFTRadixStageKernel.h
@@ -24,10 +24,10 @@
#ifndef __ARM_COMPUTE_NEFFTRADIXSTAGEKERNEL_H__
#define __ARM_COMPUTE_NEFFTRADIXSTAGEKERNEL_H__
-#include "arm_compute/core/NEON/INEKernel.h"
-
#include "arm_compute/core/KernelDescriptors.h"
+#include "arm_compute/core/NEON/INEKernel.h"
+#include <arm_neon.h>
#include <set>
namespace arm_compute
@@ -87,12 +87,17 @@ private:
ITensor *_output;
bool _run_in_place;
unsigned int _Nx;
+ unsigned int _axis;
+ unsigned int _radix;
+
+ void set_radix_stage_axis0(const FFTRadixStageKernelInfo &config);
+ void set_radix_stage_axis1(const FFTRadixStageKernelInfo &config);
- template <bool first_stage>
- void set_radix_stage_fun(unsigned int radix);
+ using FFTFunctionPointerAxis0 = std::function<void(float *, float *, unsigned int, unsigned int, const float32x2_t &, unsigned int)>;
+ using FFTFunctionPointerAxis1 = std::function<void(float *, float *, unsigned int, unsigned int, const float32x2_t &, unsigned int, unsigned int)>;
- using FFTFunctionPointerInPlace = std::function<void(float *, float *, unsigned int, unsigned int)>;
- FFTFunctionPointerInPlace _func;
+ FFTFunctionPointerAxis0 _func_0;
+ FFTFunctionPointerAxis1 _func_1;
};
} // namespace arm_compute
-#endif /*__ARM_COMPUTE_NEFFTKERNEL_H__ */
+#endif /*__ARM_COMPUTE_NEFFTRADIXSTAGEKERNEL_H__ */
diff --git a/arm_compute/core/NEON/kernels/NEFFTScaleKernel.h b/arm_compute/core/NEON/kernels/NEFFTScaleKernel.h
new file mode 100644
index 0000000000..5a19af7e62
--- /dev/null
+++ b/arm_compute/core/NEON/kernels/NEFFTScaleKernel.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2019 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_NEFFTSCALEKERNEL_H__
+#define __ARM_COMPUTE_NEFFTSCALEKERNEL_H__
+
+#include "arm_compute/core/NEON/INEKernel.h"
+
+#include "arm_compute/core/KernelDescriptors.h"
+
+namespace arm_compute
+{
+// Forward declarations
+class ITensor;
+
+/** Interface for the inverse fft scale kernel. */
+class NEFFTScaleKernel : public INEKernel
+{
+public:
+ const char *name() const override
+ {
+ return "NEFFTScaleKernel";
+ }
+ /** Constructor */
+ NEFFTScaleKernel();
+ /** Prevent instances of this class from being copied (As this class contains pointers) */
+ NEFFTScaleKernel(const NEFFTScaleKernel &) = delete;
+ /** Prevent instances of this class from being copied (As this class contains pointers) */
+ NEFFTScaleKernel &operator=(const NEFFTScaleKernel &) = delete;
+ /** Default Move Constructor. */
+ NEFFTScaleKernel(NEFFTScaleKernel &&) = default;
+ /** Default move assignment operator */
+ NEFFTScaleKernel &operator=(NEFFTScaleKernel &&) = default;
+ /** Default destructor */
+ ~NEFFTScaleKernel() = default;
+ /** Set the input and output tensors.
+ *
+ * @param[in,out] input Source tensor. Data types supported: F32.
+ * @param[out] output Destination tensor. Data type supported: same as @p input
+ * @param[in] config Kernel configuration
+ */
+ void configure(ITensor *input, ITensor *output, const FFTScaleKernelInfo &config);
+ /** Static function to check if given info will lead to a valid configuration of @ref NEFFTScaleKernel
+ *
+ * @param[in] input Source tensor info. Data types supported: F32.
+ * @param[in] output Destination tensor info. Data type supported: same as @p input
+ * @param[in] config Kernel configuration
+ *
+ * @return a status
+ */
+ static Status validate(const ITensorInfo *input, const ITensorInfo *output, const FFTScaleKernelInfo &config);
+
+ // Inherited methods overridden:
+ void run(const Window &window, const ThreadInfo &info) override;
+
+private:
+ ITensor *_input;
+ ITensor *_output;
+ float _scale;
+ bool _run_in_place;
+ bool _is_conj;
+};
+} // namespace arm_compute
+#endif /*__ARM_COMPUTE_NEFFTSCALEKERNEL_H__ */
diff --git a/arm_compute/runtime/NEON/NEFunctions.h b/arm_compute/runtime/NEON/NEFunctions.h
index d8f54ea231..869eb523dd 100644
--- a/arm_compute/runtime/NEON/NEFunctions.h
+++ b/arm_compute/runtime/NEON/NEFunctions.h
@@ -64,6 +64,7 @@
#include "arm_compute/runtime/NEON/functions/NEEqualizeHistogram.h"
#include "arm_compute/runtime/NEON/functions/NEErode.h"
#include "arm_compute/runtime/NEON/functions/NEFFT1D.h"
+#include "arm_compute/runtime/NEON/functions/NEFFT2D.h"
#include "arm_compute/runtime/NEON/functions/NEFastCorners.h"
#include "arm_compute/runtime/NEON/functions/NEFillBorder.h"
#include "arm_compute/runtime/NEON/functions/NEFlattenLayer.h"
diff --git a/arm_compute/runtime/NEON/functions/NEFFT1D.h b/arm_compute/runtime/NEON/functions/NEFFT1D.h
index 9b5ada746a..c706936f77 100644
--- a/arm_compute/runtime/NEON/functions/NEFFT1D.h
+++ b/arm_compute/runtime/NEON/functions/NEFFT1D.h
@@ -26,6 +26,7 @@
#include "arm_compute/core/NEON/kernels/NEFFTDigitReverseKernel.h"
#include "arm_compute/core/NEON/kernels/NEFFTRadixStageKernel.h"
+#include "arm_compute/core/NEON/kernels/NEFFTScaleKernel.h"
#include "arm_compute/runtime/IFunction.h"
#include "arm_compute/runtime/FunctionDescriptors.h"
@@ -37,24 +38,25 @@ namespace arm_compute
// Forward declaration
class ITensor;
-/** Basic function to execute one dimensional FFT. This function calls the following OpenCL kernels:
+/** Basic function to execute one dimensional FFT. This function calls the following NEON kernels:
*
- * -# @ref CLFFTDigitReverseKernel Performs digit reverse
+ * -# @ref NEFFTDigitReverseKernel Performs digit reverse
* -# @ref NEFFTRadixStageKernel A list of FFT kernels depending on the radix decomposition
+ * -# @ref NEFFTScaleKernel Performs output scaling in case of in inverse FFT
*/
class NEFFT1D : public IFunction
{
public:
/** Default Constructor */
NEFFT1D(std::shared_ptr<IMemoryManager> memory_manager = nullptr);
- /** Initialise the function's source, destinations and border mode.
+ /** Initialise the function's source and destinations.
*
* @param[in] input Source tensor. Data types supported: F32.
* @param[out] output Destination tensor. Data types and data layouts supported: Same as @p input.
* @param[in] config FFT related configuration
*/
void configure(const ITensor *input, ITensor *output, const FFT1DInfo &config);
- /** Static function to check if given info will lead to a valid configuration of @ref CLFFT1D.
+ /** Static function to check if given info will lead to a valid configuration of @ref NEFFT1D.
*
* @param[in] input Source tensor info. Data types supported: F32.
* @param[in] output Destination tensor info. Data types and data layouts supported: Same as @p input.
@@ -69,11 +71,14 @@ public:
protected:
MemoryGroup _memory_group;
- Tensor _digit_reversed_input;
- Tensor _digit_reverse_indices;
NEFFTDigitReverseKernel _digit_reverse_kernel;
std::vector<NEFFTRadixStageKernel> _fft_kernels;
- unsigned int _n_ffts;
+ NEFFTScaleKernel _scale_kernel;
+ Tensor _digit_reversed_input;
+ Tensor _digit_reverse_indices;
+ unsigned int _num_ffts;
+ unsigned int _axis;
+ bool _run_scale;
};
} // namespace arm_compute
#endif /*__ARM_COMPUTE_NEFFT1D_H__ */
diff --git a/arm_compute/runtime/NEON/functions/NEFFT2D.h b/arm_compute/runtime/NEON/functions/NEFFT2D.h
new file mode 100644
index 0000000000..9911cea290
--- /dev/null
+++ b/arm_compute/runtime/NEON/functions/NEFFT2D.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2019 ARM Limited.
+ *
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __ARM_COMPUTE_NEFFT2D_H__
+#define __ARM_COMPUTE_NEFFT2D_H__
+
+#include "arm_compute/runtime/IFunction.h"
+
+#include "arm_compute/runtime/FunctionDescriptors.h"
+#include "arm_compute/runtime/MemoryGroup.h"
+#include "arm_compute/runtime/NEON/functions/NEFFT1D.h"
+#include "arm_compute/runtime/Tensor.h"
+
+namespace arm_compute
+{
+// Forward declaration
+class ITensor;
+
+/** Basic function to execute two dimensional FFT. This function calls the following NEON kernels:
+ *
+ * -# @ref NEFFT1D 1D FFT is performed on the first given axis
+ * -# @ref NEFFT1D 1D FFT is performed on the second given axis
+ */
+class NEFFT2D : public IFunction
+{
+public:
+ /** Default Constructor */
+ NEFFT2D(std::shared_ptr<IMemoryManager> memory_manager = nullptr);
+ /** Initialise the function's source and destinations
+ *
+ * @param[in] input Source tensor. Data types supported: F32.
+ * @param[out] output Destination tensor. Data types and data layouts supported: Same as @p input.
+ * @param[in] config FFT related configuration
+ */
+ void configure(const ITensor *input, ITensor *output, const FFT2DInfo &config);
+ /** Static function to check if given info will lead to a valid configuration of @ref NEFFT2D.
+ *
+ * @param[in] input Source tensor info. Data types supported: F32.
+ * @param[in] output Destination tensor info. Data types and data layouts supported: Same as @p input.
+ * @param[in] config FFT related configuration
+ *
+ * @return a status
+ */
+ static Status validate(const ITensorInfo *input, const ITensorInfo *output, const FFT2DInfo &config);
+
+ // Inherited methods overridden:
+ void run() override;
+
+protected:
+ MemoryGroup _memory_group;
+ NEFFT1D _first_pass_func;
+ NEFFT1D _second_pass_func;
+ Tensor _first_pass_tensor;
+};
+} // namespace arm_compute
+#endif /*__ARM_COMPUTE_NEFFT2D_H__ */