-
#ifndef FFT_CUDA_H
#define FFT_CUDA_H
-#include "fft.h"
-#include "cuda/cuda_error_check.cuh"
-
-#if CV_MAJOR_VERSION == 2
- #include <opencv2/gpu/gpu.hpp>
- #define CUDA cv::gpu
-#else
- #include "opencv2/opencv.hpp"
- #define CUDA cv::cuda
-#endif
-
#include <cufft.h>
#include <cuda_runtime.h>
+#include <cublas_v2.h>
-struct Scale_vars;
+#include "fft.h"
+#include "cuda_error_check.hpp"
+#include "pragmas.h"
+
+struct ThreadCtx;
class cuFFT : public Fft
{
public:
- void init(unsigned width, unsigned height, unsigned num_of_feats, unsigned num_of_scales, bool big_batch_mode) override;
- void set_window(const cv::Mat & window) override;
- ComplexMat forward(const cv::Mat & input) override;
- void forward(Scale_vars & vars) override;
- void forward_raw(Scale_vars & vars, bool all_scales) override;
- ComplexMat forward_window(const std::vector<cv::Mat> & input) override;
- void forward_window(Scale_vars & vars) override;
- cv::Mat inverse(const ComplexMat & input) override;
- void inverse(Scale_vars & vars) override;
- float* inverse_raw(const ComplexMat & input) override;
- ~cuFFT() override;
+ cuFFT();
+ void init(unsigned width, unsigned height, unsigned num_of_feats, unsigned num_of_scales);
+ void set_window(const MatDynMem &window);
+ void forward(const MatScales &real_input, ComplexMat &complex_result);
+ void forward_window(MatScaleFeats &patch_feats_in, ComplexMat &complex_result, MatScaleFeats &tmp);
+ void inverse(ComplexMat &complex_input, MatScales &real_result);
+ ~cuFFT();
+
+protected:
+ cufftHandle create_plan_fwd(uint howmany) const;
+ cufftHandle create_plan_inv(uint howmany) const;
+
private:
cv::Mat m_window;
- unsigned m_width, m_height, m_num_of_feats, m_num_of_scales;
- bool m_big_batch_mode;
- cufftHandle plan_f, plan_f_all_scales, plan_fw, plan_fw_all_scales, plan_i_features,
- plan_i_features_all_scales, plan_i_1ch, plan_i_1ch_all_scales;
- float *data_f = nullptr, *data_f_all_scales = nullptr, *data_fw = nullptr, *data_fw_d = nullptr, *data_fw_all_scales = nullptr, *data_fw_all_scales_d = nullptr, *data_i_features = nullptr, *data_i_features_d = nullptr, *data_i_features_all_scales = nullptr, *data_i_features_all_scales_d = nullptr, *data_i_1ch = nullptr, *data_i_1ch_d = nullptr, *data_i_1ch_all_scales = nullptr, *data_i_1ch_all_scales_d = nullptr;
+ cufftHandle plan_f, plan_fw, plan_i_1ch;
+#ifdef BIG_BATCH
+ cufftHandle plan_f_all_scales, plan_fw_all_scales, plan_i_all_scales;
+#endif
+ cublasHandle_t cublas;
};
#endif // FFT_CUDA_H