16 #include "jFFT/test_jfft.h" 17 #include "jVector/jvector.h" 18 #include "jFFT/jfft.h" 19 #include "jFFT/perf_jfft.h" 20 #include "jPlot/jplot.h" 21 #include "jFilter/jlinearfilter.h" 22 #include "jTypeTraits/jtypetraits.h" 23 #include "jFilter/jfilter_unit_test.h" 24 #include "OpenCLBase/openclbase.h" 25 #include "TaskQueue/taskqueue.h" 26 #include "TaskItems/LinearConvolution/linearconvolution.h" 27 #include "jChart/jchart.h" 28 #include "TaskItems/FFT/fft.h" 29 #include "TaskItems/PowerSpectrum/powerspectrum.h" 30 #include "TaskItems/Arithmetic/ScalarAdd/scalaradd.h" 31 #include "TaskItems/Arithmetic/ScalarMultiply/scalarmultiply.h" 32 #include "Containers/test_ouroborus.h" 34 #define TEST_POINTS pow( 2, 16 ) 35 #define TEST_TYPE float 41 uint N = (uint)TEST_POINTS;
43 std::vector< TEST_TYPE > sin_vect;
44 sin_vect.reserve( N );
46 for ( uint i = 0; i < N ; i++ ) {
48 sin_vect.push_back( sinf( (N/8)*i *2*M_PI/N) + 2*sinf( (N/4)*i*2*M_PI/N) + 3*sinf( (3*N/8)*i*2*M_PI/N ) );
59 TEST_TYPE fact =
static_cast< TEST_TYPE
>( 1.0f / 100.0f );
61 std::vector< TEST_TYPE > box_vec( 100, fact );
63 test_q.AddTaskItem( conv_task );
66 test_q.AddTaskItem( fft_task );
69 test_q.AddTaskItem( mult_task );
72 test_q.AddTaskItem( addition_task );
74 auto start_opencl = std::chrono::high_resolution_clock::now();
76 test_q.Load( sin_vect );
82 std::vector< TEST_TYPE > processed = test_q.Recall();
84 auto end_opencl = std::chrono::high_resolution_clock::now();
85 std::chrono::duration<double, std::milli> opencl_ms = end_opencl - start_opencl;
86 auto time_taken_opencl = opencl_ms.count();
88 std::cout<<
"OpenCL Took "<<time_taken_opencl<<
" ms."<<std::endl;
90 jaspl::plot( processed,
"OpenCL" );
96 auto time_series = sin_vect;
98 auto start_cpu = std::chrono::high_resolution_clock::now();
100 fft_er.PowerSpectrum( time_series );
102 uint spectrum_size = time_series.size();
103 uint n_half = (spectrum_size % 2 == 0) ? (spectrum_size / 2) : ((
104 spectrum_size - 1) / 2);
106 time_series.erase(time_series.end() - n_half , time_series.end());
108 auto end_cpu = std::chrono::high_resolution_clock::now();
109 std::chrono::duration<double, std::milli> cpu_ms = start_cpu - end_cpu;
110 auto time_taken_cpu = cpu_ms.count();
112 std::cout <<
"CPU Took" << time_taken_cpu <<
" ms." << std::endl;
117 void fftTimingTest() {
119 std::vector< double > opencl_timing_data;
120 std::vector< double > cpu_timing_data;
125 test_q.AddTaskItem( fft );
127 for ( uint j = 2 ; j <= MAX_ITER ; j ++ ) {
129 uint N =
static_cast<uint
>( pow( 2.0, j ) );
131 std::cout <<
"Timing signal size of " << N << std::endl;
133 std::vector< TEST_TYPE > sin_vect;
134 sin_vect.reserve( N );
136 for ( uint i = 0; i < N ; i++ ) {
137 sin_vect.push_back( sinf( (N/8)*i *2*M_PI/N) + 2*sinf( (N/4)*i*2*M_PI/N) + 3*sinf( (3*N/8)*i*2*M_PI/N ) );
140 auto start_opencl = std::chrono::high_resolution_clock::now();
142 test_q.Load( sin_vect );
146 std::vector< TEST_TYPE > processed = test_q.Recall();
148 auto end_opencl = std::chrono::high_resolution_clock::now();
149 std::chrono::duration<double, std::milli> opencl_ms = end_opencl - start_opencl;
150 auto time_taken_opencl = opencl_ms.count();
152 std::cout<<
"OpenCL Took "<<time_taken_opencl<<
" ms."<<std::endl;
154 opencl_timing_data.push_back( time_taken_opencl );
158 for ( uint j = 2 ; j <= MAX_ITER ; j ++ ) {
160 uint N =
static_cast<uint
>( pow( 2.0, j ) );
162 std::cout <<
"Timing signal size of " << N << std::endl;
164 std::vector< TEST_TYPE > sin_vect;
165 sin_vect.reserve( N );
167 for ( uint i = 0; i < N ; i++ ) {
168 sin_vect.push_back( sinf( (N/8)*i *2*M_PI/N) + 2*sinf( (N/4)*i*2*M_PI/N) + 3*sinf( (3*N/8)*i*2*M_PI/N ) );
171 auto start_cpu = std::chrono::high_resolution_clock::now();
175 auto power_spec = fft_er->PowerSpectrum( sin_vect );
177 uint spectrum_size = sin_vect.size();
178 uint n_half = (spectrum_size % 2 == 0) ? (spectrum_size / 2) : (( spectrum_size - 1) / 2);
180 power_spec.erase( power_spec.end() - n_half , power_spec.end());
182 auto end_cpu = std::chrono::high_resolution_clock::now();
183 std::chrono::duration<double, std::milli> cpu_ms = end_cpu - start_cpu;
184 auto time_taken_cpu = cpu_ms.count();
186 std::cout <<
"CPU Took" << time_taken_cpu <<
" ms." << std::endl;
188 cpu_timing_data.push_back( time_taken_cpu );
198 void convolutionTimingTest() {
200 std::vector< double > opencl_timing_data;
201 std::vector< double > cpu_timing_data;
205 TEST_TYPE fact =
static_cast< TEST_TYPE
>( 1.0f / 100.0f );
207 std::vector< TEST_TYPE > box_vec( 100, fact );
210 test_q.AddTaskItem( conv_task );
212 for ( uint j = 2 ; j <= MAX_ITER ; j ++ ) {
214 uint N =
static_cast<uint
>( pow( 2.0, j ) );
216 std::cout <<
"Timing signal size of " << N << std::endl;
218 std::vector< TEST_TYPE > sin_vect;
219 sin_vect.reserve( N );
221 for ( uint i = 0; i < N ; i++ ) {
222 sin_vect.push_back( sinf( (N/8)*i *2*M_PI/N) + 2*sinf( (N/4)*i*2*M_PI/N) + 3*sinf( (3*N/8)*i*2*M_PI/N ) );
225 auto start_opencl = std::chrono::high_resolution_clock::now();
227 test_q.Load( sin_vect );
231 std::vector< TEST_TYPE > processed = test_q.Recall();
233 auto end_opencl = std::chrono::high_resolution_clock::now();
234 std::chrono::duration<double, std::milli> opencl_ms = end_opencl - start_opencl;
235 auto time_taken_opencl = opencl_ms.count();
237 std::cout<<
"OpenCL Took "<<time_taken_opencl<<
" ms."<<std::endl;
239 opencl_timing_data.push_back( time_taken_opencl );
243 for ( uint j = 2 ; j <= MAX_ITER ; j ++ ) {
245 uint N =
static_cast<uint
>( pow( 2.0, j ) );
247 std::cout <<
"Timing signal size of " << N << std::endl;
249 std::vector< TEST_TYPE > sin_vect;
250 sin_vect.reserve( N );
252 for ( uint i = 0; i < N ; i++ ) {
253 sin_vect.push_back( sinf( (N/8)*i *2*M_PI/N) + 2*sinf( (N/4)*i*2*M_PI/N) + 3*sinf( (3*N/8)*i*2*M_PI/N ) );
256 auto start_cpu = std::chrono::high_resolution_clock::now();
258 jaspl::JLinearConvolve( sin_vect, box_vec );
260 auto end_cpu = std::chrono::high_resolution_clock::now();
261 std::chrono::duration<double, std::milli> cpu_ms = end_cpu - start_cpu;
262 auto time_taken_cpu = cpu_ms.count();
264 std::cout <<
"CPU Took" << time_taken_cpu <<
" ms." << std::endl;
266 cpu_timing_data.push_back( time_taken_cpu );
276 int main(
int argc,
char *argv[]) {
285 jaspl::RunTestJFFT();