Почему 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

Ответы на вопрос(1)

Ваш ответ на вопрос