1 #ifndef JFILTER_UNIT_TEST_H 2 #define JFILTER_UNIT_TEST_H 16 #include "jVector/jvector.h" 17 #include "jFFT/jfft.h" 18 #include "jPlot/jplot.h" 19 #include "jFilter/jlinearfilter.h" 20 #include "jTypeTraits/jtypetraits.h" 28 void CheckFilterCPU( uint num_points ) {
30 uint kernel_radius =
static_cast<uint
>( floor( num_points/100 ) );
32 uint kernel_bytes = kernel_radius*2*
sizeof( T );
34 if( kernel_bytes > CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE ) {
35 kernel_radius =
static_cast<uint
>( CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE/( 2 *
sizeof(T) ) );
40 std::string mesg =
"CPU Linear Convolution Test:";
41 mesg +=
"\nSignal size:";
42 mesg += boost::lexical_cast<std::string>( num_points );
43 mesg +=
"\nKernel size:";
44 mesg += boost::lexical_cast<std::string>( kernel_radius );
46 std::cout << mesg << std::endl;
48 TestCPUConvolve( signal, kernel_radius );
52 void CheckFilterGPU( uint num_points ) {
54 int kernel_radius =
static_cast<int>( floor( num_points/100 ) );
56 uint kernel_bytes = kernel_radius*2*
sizeof( T );
58 if( kernel_bytes > CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE ) {
59 kernel_radius =
static_cast<uint
>( CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE/( 2 *
sizeof(T) ) );
64 std::string mesg =
"GPU Linear Convolution Test:";
65 mesg +=
"\nSignal size:";
66 mesg += boost::lexical_cast<std::string>( num_points );
67 mesg +=
"\nKernel size:";
68 mesg += boost::lexical_cast<std::string>( kernel_radius );
70 std::cout << mesg << std::endl;
72 TestGPUConvolve( signal, kernel_radius );
77 uint num_elem_per_MB ( uint MB ) {
78 return static_cast<uint
> (MB/4*1e5);
81 inline double gaussian(
double x,
double sigma) {
82 return 1/(sqrt(M_PI_2)*sigma)*exp( -0.5 *pow(x/sigma,2.0));
89 for ( uint i = 0; i < N/2 ; i++ ) {
95 for ( uint i = N/2; i < N ; i++ ) {
107 for ( uint i = 0; i < N ; i++ ) {
109 sin_vect.push_back( sinf( 2*i *2*M_PI/N) + sinf( 25*i*2*M_PI/N) + sinf( 100*i*2*M_PI/N ) );
118 plot( vec,
"Original", 500 );
122 int r = kernel_radius;
123 double sigma =
static_cast<double>(r)/2.0;
125 for(
int i = -r; i<= r ; i ++) {
126 kernel.push_back(gaussian(i,sigma));
131 auto start_cpu = std::chrono::high_resolution_clock::now();
133 auto convolved_vect = jaspl::JLinearConvolve( vec, kernel );
135 plot( convolved_vect,
"Convolved (CPU)", 500 );
137 auto end_cpu = std::chrono::high_resolution_clock::now();
138 std::chrono::duration<double, std::milli> cpu_ms = end_cpu - start_cpu;
139 auto time_taken_cpu = cpu_ms.count();
141 std::cout<<
"CPU took "<<time_taken_cpu<<
" ms."<<std::endl;
147 plot( vec,
"Original", 500 );
152 int r = kernel_radius;
153 double sigma =
static_cast<double>(r)/2.0;
155 for(
int i = -r; i<= r ; i ++) {
156 kernel.push_back(gaussian(i,sigma));
161 auto start_gpu = std::chrono::high_resolution_clock::now();
163 auto end_gpu = std::chrono::high_resolution_clock::now();
164 std::chrono::duration<double, std::milli> gpu_ms = end_gpu - start_gpu;
165 auto time_taken_gpu = gpu_ms.count();
167 std::cout<<
"GPU took "<<time_taken_gpu<<
" ms."<<std::endl;
174 #endif // JFILTER_UNIT_TEST_H