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." );
7 TaskQueue<T>::~TaskQueue() {}
10 void TaskQueue<T>::Load( T signal ) {
12 signal_size = signal.size();
13 signal_bytes = signal_size*sizeof( typename T::value_type );
15 auto signal_ptr = signal.data();
18 signal_input = cl::Buffer ( context, CL_MEM_READ_WRITE, signal_bytes, err );
19 output = cl::Buffer ( context, CL_MEM_WRITE_ONLY, signal_bytes );
23 err_2 = command_queue.enqueueWriteBuffer( signal_input, CL_TRUE, 0, signal_bytes, signal_ptr );
30 T TaskQueue<T>::Recall() {
32 auto processed_signal = new typename T::value_type [signal_size];
34 command_queue.enqueueReadBuffer (signal_input, CL_TRUE, 0, signal_size*sizeof( typename T::value_type), processed_signal);
36 T processed_vector( processed_signal, processed_signal + signal_size );
38 delete processed_signal;
40 return processed_vector;
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." );
51 void TaskQueue<T*>::Load( T* signal_ptr ) {
53 signal_size = sizeof(signal_ptr)/sizeof(signal_ptr[0]);
54 signal_bytes = sizeof(signal_ptr);
56 signal_input = cl::Buffer ( context, CL_MEM_READ_WRITE, signal_bytes );
57 output = cl::Buffer ( context, CL_MEM_WRITE_ONLY, signal_bytes );
59 //Load signal into global memory
60 command_queue.enqueueWriteBuffer( signal_input, CL_TRUE, 0, signal_bytes, signal_ptr );
61 command_queue.finish();
66 T* TaskQueue<T*>::Recall() {
67 T* processed_signal = (T*)malloc( signal_size*sizeof(T) );
69 command_queue.enqueueReadBuffer (output, CL_TRUE, 0, signal_bytes, processed_signal);
71 return processed_signal;