JASPL  0.2
Just Another Signal Processing Library
taskqueue_templates.tpp
1 template <typename T>
2 TaskQueue<T>::TaskQueue( uint platform_number, uint device_number ) : TaskQueueBase( platform_number, device_number ) {
3  static_assert( is_stdlib_container< T >::value, "TaskQueue can only accept pointer or container-like objects." );
4 }
5 
6 template <typename T>
7 TaskQueue<T>::~TaskQueue() {}
8 
9 template <typename T>
10 void TaskQueue<T>::Load( T signal ) {
11 
12  signal_size = signal.size();
13  signal_bytes = signal_size*sizeof( typename T::value_type );
14 
15  auto signal_ptr = signal.data();
16 
17  cl_int* err = NULL;
18  signal_input = cl::Buffer ( context, CL_MEM_READ_WRITE, signal_bytes, err );
19  output = cl::Buffer ( context, CL_MEM_WRITE_ONLY, signal_bytes );
20  OCL_DEBUG( err );
21 
22  cl_int err_2;
23  err_2 = command_queue.enqueueWriteBuffer( signal_input, CL_TRUE, 0, signal_bytes, signal_ptr );
24  OCL_DEBUG( err_2 );
25 
26 
27 }
28 
29 template <typename T>
30 T TaskQueue<T>::Recall() {
31 
32  auto processed_signal = new typename T::value_type [signal_size];
33 
34  command_queue.enqueueReadBuffer (signal_input, CL_TRUE, 0, signal_size*sizeof( typename T::value_type), processed_signal);
35 
36  T processed_vector( processed_signal, processed_signal + signal_size );
37 
38  delete processed_signal;
39 
40  return processed_vector;
41 }
42 
43 
44 template <typename T>
45 TaskQueue<T*>::TaskQueue( uint platform_number, uint device_number ) : TaskQueueBase( platform_number, device_number ) {
46  std::cout << "Built using pointer" << std::endl;
47  static_assert( std::is_arithmetic< T >::value, "TaskQueue can only accept arithemic types." );
48 }
49 
50 template <typename T>
51 void TaskQueue<T*>::Load( T* signal_ptr ) {
52 
53  signal_size = sizeof(signal_ptr)/sizeof(signal_ptr[0]);
54  signal_bytes = sizeof(signal_ptr);
55 
56  signal_input = cl::Buffer ( context, CL_MEM_READ_WRITE, signal_bytes );
57  output = cl::Buffer ( context, CL_MEM_WRITE_ONLY, signal_bytes );
58 
59  //Load signal into global memory
60  command_queue.enqueueWriteBuffer( signal_input, CL_TRUE, 0, signal_bytes, signal_ptr );
61  command_queue.finish();
62 }
63 
64 
65 template< typename T>
66 T* TaskQueue<T*>::Recall() {
67  T* processed_signal = (T*)malloc( signal_size*sizeof(T) );
68 
69  command_queue.enqueueReadBuffer (output, CL_TRUE, 0, signal_bytes, processed_signal);
70 
71  return processed_signal;
72 }