JASPL  0.2
Just Another Signal Processing Library
nonlinearconvolution.tpp
1 std::string kernel_str = R"END(
2  //
3 )END";
4 
5 template <typename T>
6 NonLinearConvolution<T>::NonLinearConvolution( T& convolution_kernel ) {
7 
8  static_assert( is_stdlib_container< T >::value, "NonLinearConvolution can only accept pointers or container-like objects." );
9  static_assert( std::is_arithmetic<typename T::value_type>::value, "NonLinearConvolution must be made with arithmetic type" );
10 
11  std::string source_directory = SOURCE_DIR;
12  std::string kernel_name = "/nonlinearconvolve.cl";
13 
14  kernel_path = source_directory + kernel_name;
15 
16  LoadCLKernel<typename T::value_type>( "NonLinearConvolve" );
17 
18  uint kernel_size = convolution_kernel.size();
19  size_t kernel_bytes = kernel_size*sizeof( typename T::value_type );
20  auto kernel_ptr = convolution_kernel.data();
21 
22  kernel_buff = cl::Buffer ( context, CL_MEM_READ_ONLY, kernel_bytes );
23  command_queue.enqueueWriteBuffer( kernel_buff, CL_TRUE, 0, kernel_bytes, kernel_ptr );
24 
25  cl_int err;
26  err = kernel.setArg(1, kernel_buff);
27  OCL_DEBUG( err );
28  err = kernel.setArg(4, kernel_size);
29  OCL_DEBUG( err );
30 }
31 
32 template <typename T>
33 NonLinearConvolution<T>::NonLinearConvolution( T* convolution_kernel ) {
34 
35  static_assert( std::is_arithmetic<T>::value, "NonLinearConvolution must be made with arithmetic pointer type" );
36  std::string source_directory = SOURCE_DIR;
37  std::string kernel_name = "/linearconvolve.cl";
38 
39  kernel_path = source_directory + kernel_name;
40 
41  LoadCLKernel<T>( "LinearConvolve" );
42 
43  uint kernel_size = convolution_kernel.size();
44  size_t kernel_bytes = kernel_size*sizeof( typename T::value_type );
45  auto kernel_ptr = convolution_kernel.data();
46 
47  kernel_buff = cl::Buffer ( context, CL_MEM_READ_ONLY, kernel_bytes );
48  command_queue.enqueueWriteBuffer( kernel_buff, CL_TRUE, 0, kernel_bytes, kernel_ptr );
49 
50  cl_int err;
51  err = kernel.setArg(1, kernel_buff);
52  OCL_DEBUG( err );
53  err = kernel.setArg(3, kernel_size);
54  OCL_DEBUG( err );
55 }
56 
57 template <typename T>
58 NonLinearConvolution<T>::~NonLinearConvolution() {}
59 
60 template <typename T>
61 void NonLinearConvolution<T>::Trigger() {
62 
63  cl_int err;
64  err = command_queue.enqueueNDRangeKernel( kernel,cl::NullRange, cl::NDRange( signal_size ) );
65  OCL_DEBUG( err );
66 }
67 
68 template <typename T>
69 void NonLinearConvolution<T>::SetSignal( cl::Buffer& signal_buff, uint sig_size ){
70 
71  signal_size = sig_size;
72 
73  cl_int* err_ptr = NULL;
74  scratch_buff = cl::Buffer ( context, CL_MEM_READ_WRITE, sig_size*sizeof(typename T::value_type), err_ptr );
75  OCL_DEBUG( err_ptr );
76 
77  cl_int err = kernel.setArg(2, scratch_buff);
78  OCL_DEBUG( err );
79 
80  err = kernel.setArg(0, signal_buff);
81  err = kernel.setArg(3, sig_size);
82  OCL_DEBUG( err );
83 }
84 
85 template <typename T>
86 cl::Buffer& NonLinearConvolution<T>::ProcessedSignal() {
87  return scratch_buff;
88 }
89 
90 template <typename T>
91 size_t NonLinearConvolution<T>::ProcessedSignalBytes() {
92  return signal_size*sizeof( typename T::value_type );
93 }
94 
95 template <typename T>
96 size_t NonLinearConvolution<T>::ProcessedSignalSize(){
97  return signal_size;
98 }