void FftClFft:: compute( Tfr::ChunkData::Ptr input, Tfr::ChunkData::Ptr output, FftDirection direction ) { TIME_STFT TaskTimer tt("Fft ClFft"); unsigned n = input->getNumberOfElements().width; unsigned N = output->getNumberOfElements().width; if (-1 != direction) EXCEPTION_ASSERT( n == N ); { TIME_STFT TaskTimer tt("Computing fft(N=%u, n=%u, direction=%d)", N, n, direction); OpenCLContext *opencl = &OpenCLContext::Singleton(); cl_int fft_error; clFFT_Plan plan = CLFFTKernelBuffer::Singleton().getPlan(opencl->getContext(), n, fft_error); if (fft_error != CL_SUCCESS) throw std::runtime_error("Could not create clFFT compute plan."); // Run the fft in OpenCL :) // fft kernel needs to have read/write access to output data fft_error |= clFFT_ExecuteInterleaved( opencl->getCommandQueue(), plan, 1, (clFFT_Direction)direction, OpenClMemoryStorage::ReadOnly<1>( input ).ptr(), OpenClMemoryStorage::ReadWrite<1>( output ).ptr(), 0, NULL, NULL ); if (fft_error != CL_SUCCESS) throw std::runtime_error("Bad stuff happened during FFT computation."); } }
void FftClFft:: compute( Tfr::ChunkData::Ptr input, Tfr::ChunkData::Ptr output, DataStorageSize n, FftDirection direction ) { TaskTimer tt("Stft::computeWithClFft( matrix[%d, %d], %s )", input->size().width, input->size().height, direction==FftDirection_Forward?"forward":"backward"); EXCEPTION_ASSERT( output->numberOfBytes() == input->numberOfBytes() ); const int batchSize = n.height; OpenCLContext *opencl = &OpenCLContext::Singleton(); cl_int fft_error; clFFT_Plan plan = CLFFTKernelBuffer::Singleton().getPlan(opencl->getContext(), n.width, fft_error); if(fft_error != CL_SUCCESS) throw std::runtime_error("Could not create clFFT compute plan."); { TaskTimer tt("Calculating batches"); // Run the fft in OpenCL :) fft_error |= clFFT_ExecuteInterleaved( opencl->getCommandQueue(), plan, batchSize, direction==FftDirection_Forward?clFFT_Forward:clFFT_Inverse, OpenClMemoryStorage::ReadOnly<1>( input ).ptr(), OpenClMemoryStorage::ReadWrite<1>( output ).ptr(), 0, NULL, NULL ); if(fft_error != CL_SUCCESS) throw std::runtime_error("Bad stuff happened during FFT computation."); } }