1 std::string kernel_str = R"END(
6 NonLinearConvolution<T>::NonLinearConvolution( T& convolution_kernel ) {
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" );
11 std::string source_directory = SOURCE_DIR;
12 std::string kernel_name = "/nonlinearconvolve.cl";
14 kernel_path = source_directory + kernel_name;
16 LoadCLKernel<typename T::value_type>( "NonLinearConvolve" );
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();
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 );
26 err = kernel.setArg(1, kernel_buff);
28 err = kernel.setArg(4, kernel_size);
33 NonLinearConvolution<T>::NonLinearConvolution( T* convolution_kernel ) {
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";
39 kernel_path = source_directory + kernel_name;
41 LoadCLKernel<T>( "LinearConvolve" );
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();
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 );
51 err = kernel.setArg(1, kernel_buff);
53 err = kernel.setArg(3, kernel_size);
58 NonLinearConvolution<T>::~NonLinearConvolution() {}
61 void NonLinearConvolution<T>::Trigger() {
64 err = command_queue.enqueueNDRangeKernel( kernel,cl::NullRange, cl::NDRange( signal_size ) );
69 void NonLinearConvolution<T>::SetSignal( cl::Buffer& signal_buff, uint sig_size ){
71 signal_size = sig_size;
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 );
77 cl_int err = kernel.setArg(2, scratch_buff);
80 err = kernel.setArg(0, signal_buff);
81 err = kernel.setArg(3, sig_size);
86 cl::Buffer& NonLinearConvolution<T>::ProcessedSignal() {
91 size_t NonLinearConvolution<T>::ProcessedSignalBytes() {
92 return signal_size*sizeof( typename T::value_type );
96 size_t NonLinearConvolution<T>::ProcessedSignalSize(){