Почему cuFFT такой медленный?
Я надеюсь ускорить приложение для компьютерного зрения, которое вычисляет много FFT, используя FFTW и OpenMP на процессоре Intel. Тем не менее, для различных размеров проблемы БПФ, я 'мы обнаружили, что cuFFT медленнее, чем FFTW с OpenMP.
В экспериментах и обсуждении ниже я обнаружил, что cuFFTпомедленнее чем FFTW для пакетных 2D БПФ.Почему cuFFT такой медленный, и есть ли что-то, что я могу сделать, чтобы cuFFT работал быстрее?
Эксперименты (скачать код)нашприложение для компьютерного зрения требует БПФ вперед на кучу небольших самолетов размером 256х256. Я'м работает БПФ наHOG функции с глубиной 32, поэтому я использую пакетный режим, чтобы сделать 32 БПФ на вызов функции. Как правило, я делаю около 8 вызовов функции FFT размером 256x256 с размером пакета 32.
FFTW + OpenMP
Следующий код выполняется в16.0ms на .Intel i7-2600 8-core CPU
int depth = 32; int nRows = 256; int nCols = 256; int nIter = 8;
int n[2] = {nRows, nCols};
//if nCols is even, cols_padded = (nCols+2). if nCols is odd, cols_padded = (nCols+1)
int cols_padded = 2*(nCols/2 + 1); //allocate this width, but tell FFTW that it's nCols width
int inembed[2] = {nRows, 2*(nCols/2 + 1)};
int onembed[2] = {nRows, (nCols/2 + 1)}; //default -- equivalent ot onembed=NULL
float* h_in = (float*)malloc(sizeof(float)*nRows*cols_padded*depth);
memset(h_in, 0, sizeof(float)*nRows*cols_padded*depth);
fftwf_complex* h_freq = reinterpret_cast(h_in); //in-place version
fftwf_plan forwardPlan = fftwf_plan_many_dft_r2c(2, //rank
n, //dims -- this doesn't include zero-padding
depth, //howmany
h_in, //in
inembed, //inembed
depth, //istride
1, //idist
h_freq, //out
onembed, //onembed
depth, //ostride
1, //odist
FFTW_PATIENT /*flags*/);
double start = read_timer();
#pragma omp parallel for
for(int i=0; i